프로그래밍

2. 간단한 계산기 제작 및 JAVA API 찾는법 - 자바 넷빈즈 IDE로 하는 스윙 프로그래밍 입문

할랑할랑 2007. 11. 16. 17:54
반응형

우선 지난번에 만든 프로젝트를 열어봅시다. Java NetBeans IDE를 실행한 후, File > Open Project를 선택합니다.

2. 간단한 계산기 제작 및 JAVA API 찾는법

프로젝트가 들어있는 폴더명에는 아이콘에 표시가 됩니다. 해당 폴더에 커서를 놓은 후, Open Project Folder를 선택합니다. 절대로 해당 아이콘을 더블클릭한다고 열리지 않습니다. 혹시라도 폴더 더블 클릭으로 폴더 내부로 들어가셨다면, 한 단계 위로 다시 올라온 후 Open Project Folder를 클릭하세요.

사용자 삽입 이미지

사용자 삽입 이미지

 

지난번에 만들어둔 폼 디자인이 보이네요. JFrame 폼을 마우스로 선택한 후 우측의 Palette 창을 보시거나, 혹은 마우스 오른쪽 버튼을 클릭, Add Form Palette > Swing 에서 스윙(Swing) 구성요소를 추가할 수 있습니다. 간단한 계산기를 만들어보기로 했으므로 숫자 입력창인 JTextField를 넣습니다.

사용자 삽입 이미지

Inspector에서 추가한 JTextField를 마우스 우클릭하면 JTextField에 적혀있는 기본 문구와 JTextField 객체 자체의 이름을 변경할 수 있습니다. Change Variable Name으로 객체 이름을 jTextField_Number로, Edit Text에서는 입력칸의 Text를 빈칸으로 바꿔줍시다. 각 구성요소 개체의 속성창(Property)에서도 Text 초기값(기본 문구) 변경이 가능합니다. 속성창에서 이름, 입력가능여부(enabled, editable) 등 많은 특징을 바꿀 수 있으니 항상 속성창을 주의깊게 살펴보세요.

사용자 삽입 이미지Inspector에서 Text 속성 수정 가능

비슷한 방식으로 버튼을 넣을 수 있습니다. Swing의 JButton을 그림과 같이 넣도록 합시다. 같은 크기와 속성을 지닌 JButton을 일일히 하나씩 넣으려니 힘드시죠? JButton 하나를 넣어서 버튼 크기를 조절해 준 후 복사하기(Ctrl + C)를 하신 후, "JFrame 폼 클릭 → 붙여넣기(Ctrl + V)"를 여러번 반복하시면 같은 개체가 폼에 붙여넣기 추가됩니다. 주의할 점은 붙여넣기한 개체는 Form의 가장 위 왼쪽에 중복으로 겹쳐서 붙여넣기가 되니, 드래그(Drag, 끌기)로 이동시켜서 잘 구별하세요.

사용자 삽입 이미지Property 창에서 text 속성 수정 가능

사용자 삽입 이미지대충 만든 계산기. 폼 디자인을 미리 보고 싶으시면 위에 붉은 네모로 표시한 아이콘을 누르면, 간단한 윈도우 폼 디자인 미리보기가 뜹니다(Design Preview)

일단 덧셈 뺄셈 및 정수 연산만 가능한 계산기입니다. 텍스트 입력창에서 직접 숫자 입력이 불가능하도록 editable 속성을 false로 해주고, 보기좋게 배경색상을 Swing 색상의 highlight(흰색)으로 바꿔주었습니다.

사용자 삽입 이미지

각 버튼을 눌렀을때 동작(액션, Action)을 지정해줘야 작동하겠죠? 해당 개체(버튼)을 선택한 후 우클릭 > Action > ActionPerformed를 누르면, 각 버튼의 기본 동작에 대한 메소드를 작성할 수 있습니다. 액션을 좀 더 살펴보시면 윈도우의 동작과 관련된 다양한 액션이 있으니 참고하세요. 숫자키보드나 +, - 키보드 키를 눌렀을때 적절하게 반응하는 기능을 추가하려면 해당 JTextField에서 우클릭 > Action > KeyPress 액션을 선택하시면 되는 것처럼 말입니다. 일단 너무 길어지니 키보드 기능은 생략합시다.

사용자 삽입 이미지


각 숫자키에 대한 액션 메소드를 살펴보겠습니다. 숫자키를 눌렀을때 JTextField에 숫자를 넣어야하는데, 어떤 메소드를 써야할까요? JTextField야 워낙 흔히 쓰는 클래스라 금방 알아낼 수 있겠지만, 지금부터 차근차근 JAVA API에 익숙해져보세요. 그럼 자바 API에서 관련 메소드를 찾아보겠습니다.

JAVA API : http://java.sun.com/javase/6/docs/api/index.html?overview-summary.html

NO FRAME을 선택하면 관련 클래스나 메소드를 찾기가 힘들어지니, FRAME을 선택해서 그림처럼 프레임으로 나눠진 창에서 클래스를 찾아보도록 합시다. 지금 찾으려는 클래스는 JTextField입니다. 좌측 하단 클래스 목록에서 JTextField를 찾아서 클릭합니다. ABC 알파벳 순서로 되어있으므로 의외로 빨리 찾을 수 있습니다. Ctrl + F로 찾아도 되지만, String 클래스 같은 경우에는 String이라는 글자가 포함된 다른 클래스가 너무 많아서, Ctrl + F로 찾는것 보다 알파벳 순서로 찾는것이 훨씬 빠릅니다.

사용자 삽입 이미지

특정 클래스를 사용하기위해서는, 직접 특정 자바 패키지(java package)를 import 해줘야하기도 합니다. 스윙이야 대부분 자동으로 되는 것 같지만, 특정 클래스를 넣었는데 'unidentified' 등의 컴파일 오류가 발생할 경우, 해당 클래스 API 첫 화면의 상속 트리를 참조하여 import를 해보셔야 합니다.

JTextField JAVA API를 찾았지만, 본문이 너무 많습니다. 차근차근 읽어보면 직접 레이아웃 설계시 새로 개체를 new를 이용해 생성하는 방법에서부터 어떻게 다루는 지 다 나와있지만 모두 읽어 보기가 쉽지 않습니다. 마음이 급하다면, 첫 화면 제일 위 SUMMARY의 method를 눌러 메소드 목록 부분으로 바로 내려가봅시다.

Method summary 위로는 constructor(생성자, 컨스트럭터) 요약, 아래로는 상속해준 부모의 메소드 목록이 추가로 나와있습니다. 컨스트럭터, 메소드, 부모의 메소드 모두 살펴보셔야합니다. 메소드 이름이 그나마 상세한 편이므로, 이름을 하나씩 보면서 기능을 상상해보셔야합니다. 정말 원하는 기능이 맞나 싶으면 해당 메소드를 클릭해서 메소드의 상세 설명도 반드시 확인하셔야합니다. 매개변수가 무엇인지, 리턴값이 무엇인지, 정확한 기능이 뭔지... 단순히 메소드 함수 이름만 보고 무턱대고 사용하시면 안됩니다. 예를 들면, String 에서 replace와 replaceAll은 기능이 비슷하면서도 매우 다른데, 괜히 "replaceAll이니까 전체를 바꿔주겠지?"하고 단순 문자열 전체 교환을 원하면서 replaceAll을 아무생각없이 썼다가는 프로그램이 잘못될 수 있듯이 말이죠. replaceAll은 입력 매개 변수로 regex(정규식, regular Expression)을 받기 때문에, 단순 문자열 교환이라면 replace를 사용하셔야합니다.

사용자 삽입 이미지

사실 모든 메소드를 다 볼수는 없죠. 우선 API를 찾기 전에는 '혹시 이런 기능이 있을까?' 를 생각하고, 내가 필요한 기능이 뭔지 머리속으로 상상하면서, 메소드 명을 머리속으로 가상으로 만들어보면서 훑어보시면 빨리 찾을 수 있습니다. 지금 원하는 것은 단순히 JTextField의 Text 문자 창에 문자열을 쓰고, 읽는 기능이죠. 보통 어떤 값을 넣거나 가져올때는 Get이나 Set을 많이 씁니다. JTextField 메소드 요약 목록에서 Get과 Set 주변을 찾아보면 getText(), setText()를 금방 찾을 수 있죠. JTextField 자체 메소드 목록에는 없고, 부모 클래스인 JTextComponent 메소드 목록에 있습니다.

사용자 삽입 이미지

지금와서 이런 말하긴 좀 그렇지만, 빨리 찾는 법에 익숙해지는 수밖에 없는 것 같습니다.

숫자 버튼 "1"을 눌렀을때 동작을 다음과 같이 입력했습니다. JButton 1 개체를 마우스 우클릭하여 > Action > ActionPerformed를 선택하면 생성되는 메소드에 다음과 같은 내용을 넣었습니다.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String txt = jTextField_number.getText();
jTextField_number.setText( txt + "1" );
}

이제는 평범한 자바 프로그래밍과 병행하시면 됩니다. 만약 클래스 전체로 별도로 필요한 메소드나 변수(멤버)를 추가하고 싶으시면, 직접 소스 코드의 끝부분(JFrame 클래스 선언이 끝나는 부분)에 잘 정리해서 넣으시면 됩니다.


※ 필요하다고 생각하는 메소드 및 클래스

JTextField.getText(), setText(String)로 JTextField에서 문자열을 얻거나, 새로 지정합니다.

Integer(정수만 취급할때), Double(정수 및 소수점 모두 취급할때) 클래스 컨스트럭터 및 toString() 메소드로 String을 숫자로 바꾸거나, 계산 결과를 String을 전환합니다. 예를 들어 String txt가 있다고 하면, result = a + (new Double( txt )) 이런식으로 응용할 수 있고, setText( (new Double(result)).toString() )으로 문자열 변환 출력이 가능합니다.

편집기 사용시 이용하기 편한 키로 Ctrl + C(복사), Ctrl + V(붙여넣기), Ctrl + Z(되돌리기), Ctrl + Y(되돌리기 취소) 등이 있습니다. 위 키보드들은 프로그래밍을 해보신 분이라면 대부분 아시겠죠?


※ JTextField에서 사용할만한 주요 메소드

getText() - 리턴 값 String으로 텍스트창의 전체 문자열을 반환
setText(String str) - str로 텍스트창 전체 문자열을 설정
getCaretPosition() - 캐럿(키보드 입력 커서) 위치 얻기
setCaretPosition(int) - 캐럿(키보드 입력 커서) 위치 이동
moveCaretPosition(int) - 현재 위치에서부터 캐럿 이동하면서 문자열을 선택
getSelectionStart, getSelectionEnd, select(int start, int end), setSelectionStart(int), setSelectionEnd(int)로 선택된 부분의 범위 값을 얻거나, 새로 지정 가능
setEditable(boolean) - 텍스트창에 사용자가 직접 키보드 입력을 할 수 있는지 없는지를 지정

등등 API를 보시면 윈도우 개체 조작과 관련한 엄청나게 많고 상세하고 다양한 메소드가 제공되므로, 섣불리 없는 기능으로 판단하고 직접 해당 메소드 기능을 만드는 고생을 하지 마시고, 충분히 API에 있는 자신의 메소드 및 부모가 제공하는 메소드 목록을 살펴보시고 프로그래밍하시기 바랍니다.

다음에는 간단한 메모장 프로그램을 만들어보겠습니다.

※ 관련글
- 1. 넷빈즈 설치 및 기본 프로젝트 작성 - 자바 넷빈즈 IDE로 하는 스윙 프로그래밍 입문
- 3. 간단한 메모장
- 간단한 컴파일 오류 잡기 - try catch 및 import가 필요한 경우
- 프로그램에서 거꾸로 다이어그램 얻기
- 창 위의 창 대화창(다이얼로그) 띄우기

반응형