제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/a3_1 advanced...

19
경영정보시스템 3유용한 JAVA제공 기능 - i - [email protected] 목차 3유용한 JAVA제공 기능 .............................................................................................................................. 1 1. 들어가기 전에 ........................................................................................................................................ 1 2. String기능 ......................................................................................................................................... 2 3. 숫자와 관련된 기능................................................................................................................................ 5 1) Wrapper ........................................................................................................................................... 5 2) Math ................................................................................................................................................. 6 3) Formatter ........................................................................................................................................ 7 4. ArrayList ............................................................................................................................................... 8 5. ArraysCollections ............................................................................................................................ 9 6. 외부 데이터 입출력.............................................................................................................................. 10 7. GUI ....................................................................................................................................................... 14 8. 이번 정리 ........................................................................................................................................ 18

Upload: others

Post on 23-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- i - [email protected]

목차

제3장 유용한 JAVA제공 기능 .............................................................................................................................. 1

1. 들어가기 전에 ........................................................................................................................................ 1

2. String의 기능 ......................................................................................................................................... 2

3. 숫자와 관련된 기능 ................................................................................................................................ 5

1) Wrapper ........................................................................................................................................... 5

2) Math ................................................................................................................................................. 6

3) Formatter ........................................................................................................................................ 7

4. ArrayList ............................................................................................................................................... 8

5. Arrays와 Collections ............................................................................................................................ 9

6. 외부 데이터 입출력 .............................................................................................................................. 10

7. GUI ....................................................................................................................................................... 14

8. 이번 장 정리 ........................................................................................................................................ 18

Page 2: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 1 - [email protected]

제3장 유용한 JAVA제공 기능

1. 들어가기 전에

□ 제1장에서는 JAVA의 기본 문법을 살펴보았다.

○ 영어에 비유하자면, 문장의 형식과 관련된 부분이다. 예를 들어,

− 영어 문장은 마침표(.)로 마쳐야 하듯이, JAVA에서 Statement는 세미콜론(;)으로 마쳐야 한다.

− 영어에서 3형식 문장의 경우 “주어 + 동사 +목적어”를 지켜야 하듯이, JAVA에서는 for문의 경

우 “for (시작; 조건; 증감) { Statement; }”의 형태를 지켜야 한다.

− 영어에서 주어와 목적어의 품사는 명사이고 동사의 품사는 동사이고 보어의 품사는 명사∙형용사

여야 하듯이, JAVA에서는 변수의 형태와 할당하는 값의 형태를 서로 일치시켜야 한다.

□ 제2장에서는 효율적이고 바람직한 프로그래밍을 위한 Class 사용법에 대해서 살펴보았다.

○ 영어에 비유하자면, 관계대명사와 관련된 부분이다.

− 관계대명사를 사용하지 않고도 모든 내용을 영어 문장으로 표현할 수 있듯이, Class를 사용하지

않고도 모든 목적을 달성하는 JAVA 프로그래밍을 만들 수 있다.

▫ 모든 CODE를 main method 안에서 끝내면 된다.

− 다만, 관계대명사를 사용하면 두 문장을 하나의 문장으로 단순화시킬 수 있듯이, Class를 사용하

면 수없이 중복되어야 하는 CODE를 몇 번으로 단순화시킬 수 있다.

□ 이번 장에서는 풍부한 내용의 프로그래밍을 개발할 때 편리하게 사용할 수 있는, JAVA가 제공해주는

수많은 기능들 중 가장 기본적인 (그래서 아마추어인 우리에게도 유용한) 것들에 대해서 살펴본다.

○ 영어에 비유하자면, 사전(dictionary)의 내용과 관련된 부분이다.

○ JAVA API(Application programming interface, http://docs.oracle.com/javase/7/docs/api/)에 포함

된 내용들이 바로 JAVA가 제공해주는 기능들이다. [JAVA API는 JAVA 제공 기능 “사전”이다.]

○ 상황에 적합한 영어 단어∙표현을 사용하기 위해 사전을 참조하듯이, 목적에 적합한 기능을 사용하기

위해서는 JAVA API를 참조하면 된다.

− 영어 사전에 없는 단어∙표현은 새로 정의해야 하듯이, JAVA API에 없는 기능은 개발자가 직접

만들어야 한다.

− Excel에서 sum 기능을 알면 모든 셀을 더하는 번거로운 작업을 하지 않아도 되듯이, JAVA API

의 기능을 알면 직접 개발해야 하는 번거로움을 피할 수 있다. 그러므로 어떤 기능을 구현하고

싶으면 먼저 그 기능이 JAVA API에 있는지 확인해보는 것이 좋다.

▫ 예를 들어, JAVA에서는 승수연산으로 기호 “^”를 지원하지 않는다고 하였다. 지금까지 우리가

배운 지식에 의하면 3의 10승은 “3*3*3*3*3*3*3*3*3*3”으로 표현해야 한다. 그렇다면 3의

100승은? 검색해보면, JAVA가 제공하는 3의 100승은 Math.pow(3,100)임을 확인할 수 있다.

− 영어사전에 새로운 단어∙표현이 추가되듯이, JAVA도 새로운 기능이 추가되면서 발전한다.

○ 참고로 JAVA 제공 기능은 유사한 것들이 패키지(package)로 묶여 있으므로 어떤 기능을 사용하기

위해서는 그 기능이 포함된 패키지를 불러야(import) 한다. [패키지는 폴더라고 생각하면 된다.]

Page 3: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 2 - [email protected]

2. String의 기능

□ 제1장에서 이미 살펴보았듯이, String은 문자열을 할당하기 위한 변수_형태이다.

○ int, double과는 달리 String의 첫 문자가 대문자인 이유는 JAVA가 제공하는 Class이기 때문이다.

그래서 int, double과 같은 기본형이 아니라 “확장형”이다.

○ 하지만 다음처럼 int, double의 기본형과 그 사용법이 거의 동일하여 “유사 기본형”이라고도 한다.

− String은 int, double의 기본형과 마찬가지로 new를 사용하지 않고 생성할 수 있다. [지금부터

Class의 정체를 생략하면 Main Class의 main method에 포함된 내용만을 나타낸 것이다.]

▫ 또 다른 확장형인 배열의 경우는 new를 사용해야만 생성할 수 있다.

− String은 int, double의 기본형과 마찬가지로 변수를 복사하면 “내용”을 복사한다.

▫ 또 다른 확장형인 배열의 경우는 변수를 복사하면 “주소(리모콘)”을 복사한다.

○ String이 확장형임에도 불구하고 기본형처럼 사용할 수 있는 것은 JAVA가 내부적으로 그런 편의를

제공해주었기 때문이다. [그러므로 굳이 사용하지 않는 것이 좋지만, 다음처럼 여전히 원래 자신의

형태인 확장형으로도 사용할 수는 있다.]

− 변수 a와 b는 기본형처럼 생성하였지만, c와 d는 확장형으로서 new를 사용하여 생성하였다.

− String c = new String(“A”);는 String c = new String();과 c = “A”;로 분리하여 표현해도 된다.

− a.equals(b)는 a의 문자열 내용과 b의 문자열 내용이 일치하는지를 묻는 String Class의 method

이다. [a는 String Class의 Object이므로 equals라는 method를 사용할 수 있다.]

− a==b와 c==d의 결과가 다른 이유는 무엇인가? a.equals(b)와 c.equals(d)의 결과가 같은 이유는

무엇인가? 그래서 이 두 결과의 차이가 시사하는 점은 무엇인가?

String a = “A”; String b = “A”;

String c = new String(“A”); String d = new String(“A”);

System.out.println(a==b); System.out.println(c==d); System.out.println(a==c);

System.out.println(a.equals(b)); System.out.println(c.equals(d));

System.out.println(a.equals(c));

int a1 = 3; double b1 = 5.5; String c1 = “A”; int[ ] d1 = new int[ ] {1, 2};

int a2 = a1; double b2 = b1; String c2 = c1; int[ ] d2 = d1;

a1 = 4; b1 = 6.6; c1 = “B”; d1[0] = 5;

System.out.println(a2); System.out.println(b2);

System.out.println(c2); System.out.println(d2[0]);

int a = 3;

double b = 5.5;

String c = “String can be created without ‘new’ like primitive types.”;

int[ ] d = new int[ ] {1, 2, 3};

System.out.println(a); System.out.println(b);

System.out.println(c); System.out.println(d[0]);

Page 4: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 3 - [email protected]

□ String이라는 Class의 주요 method는 다음과 같다.

○ 우선, String에 포함된 모든 method의 정보는 다음과 같이 확인할 수 있다.

− JAVA API(http://docs.oracle.com/javase/7/docs/api/)에 들어간다.

− 좌측 상단의 Packages에서 java.lang을 클릭한다.

▫ java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도 사용할 수 있다.

− 좌측 하단의 Classes에서 String을 클릭한다.

▫ Classes 외에도 Interfaces, Exceptions 등이 존재하는데 이와 관련된 기능들은 언젠가 아마추

어에서 벗어나 전문적으로 프로그래밍을 할 때에 사용하게 될 것이다.

− 우측에서 Method Summary의 표를 보면 모든 method에 대한 요약본을 확인할 수 있다.

▫ 어떤 method에 대해서 구체적인 내용을 알고 싶으면 그 method를 클릭하면 된다.

▫ 사용하고자 하는 method의 정보를 확인할 때에는 기능도 중요하지만, 출력값_형태(Modifier

and Type 열)와 입력값_형태(Method and Description 열)를 주의해서 확인해야 한다[왜?].

○ equals()와 equalsIgnoreCase()

− 앞에서 이미 살펴보았듯이, equals()는 두 문자열의 내용이 모두 일치하면 boolean 형태인 true

를 반환(출력)하고 그렇지 않으면 false를 반환한다.

▫ 사실, String을 기본형처럼 생성하면 즉 new를 사용하지 않고 생성하면 “==”를 사용하면 되므

로 문자열 비교에서 equals()는 거의 사용되지 않는다.

− equalsIgnoreCase()는 두 문자열의 내용 중 영문자의 경우 대문자와 소문자를 구분하지 않고 일

치하면 true를 반환하고 그렇지 않으면 false를 반환한다. [JAVA에서 대문자와 소문자는 다름.]

▫ equals()와는 달리, String을 기본형처럼 생성해도 유용하게 사용될 수 있다.

○ indexOf()와 lastIndexOf()

− indexOf()는 문자열에서 특정 문자가 처음으로 나오는 “위치”를 반환한다.

− lastIndexOf()는 문자열에서 특정 문자가 마지막으로 나오는 위치를 반환한다.

▫ 문자열에서 “위치”는 배열처럼 0부터 시작함을 주의하라.

∙ 예를 들어, “ab12AB12abAB”에서 a의 위치는 0이고, 1의 위치는 2이다.

▫ 참고로, a.indexOf(“b”)와 a.indexOf(“b”, 2)는 overloading된 method이다[왜?].

String a = “ab12AB12abAB”;

System.out.println(a.indexOf(“b”));

System.out.println(a.lastIndexOf(“2”)); // 2가 아니라 “2”인 이유는? 2로 하면 결과는?

System.out.println(a.indexOf(“AB”));

System.out.println(a.lastIndexOf(“AB”));

System.out.println(a.indexOf(“b”, 2)); // 2번 위치 이전(미포함)의 b는 무시하고…

String a = “A1B2”; String b = “a1b2”;

System.out.println(a==b);

System.out.println(a.equals(b));

System.out.println(a.equalsIgnoreCase(b));

Page 5: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 4 - [email protected]

○ substring()

− 문자열에서 일부 문자열을 추출한다.

▫ a.substring(1)은 a에 할당된 문자열의 1번 위치(포함)부터 이후 모든 문자열을 추출한다.

▫ a.substring(2, 4)는 1번 위치(포함)부터 4번 위치(미포함) 이전까지의 문자열을 추출한다.

▫ a.substring(index, index+4)는 index번 위치(포함)부터 4개의 문자를 추출한다.

○ length()

− 문자열의 길이 즉 총 문자 개수를 반환한다.

▫ 배열에서의 원소 개수와 마찬가지로 “개수”이다. 즉, 0부터 시작하는 “위치”와는 다르다.

▫ 참고로, 문자열(String)의 문자 개수를 알려주는 length()는 “method”이므로 ()가 반드시 붙어

야 한다. 반면에 배열의 원소 개수를 알려주는 length는 “변수”이므로 ()가 붙지 않는다.

○ split()

− 하나의 문자열을 여러 개의 문자열로 분할한다.

▫ a1.split(“ ”)에서 큰따옴표 사이에 한 개의 빈칸(spacebar)이 들어가 있다.

∙ 만약 빈칸이 없으면 어떻게 되는가? 큰따옴표가 아니라 작은따옴표이면 어떻게 되는가?

○ 다음 CODE에 포함된 기타 String과 관련된 유용한 method의 기능을 확인하자.

String a1 = “ There is a book ”;

String a2 = a1.replace(“Th”, “H”); System.out.println(a2);

String a3 = a1.toUpperCase(); System.out.println(a3);

String a4 = a1.toLowerCase(); System.out.println(a4);

String a5 = a1.trim(); System.out.println(a5); System.out.println(a5+”.”);

String a1 = “There is a book”;

String [ ] a2 = a1.split(“ “); // 반드시 String “배열”로 선언된 변수에 할당해야 한다[왜?]

String b1 = “123,456,789”; String [ ] b2 = b1.split(“,“);

String c1 = “ABabABabABabAB”; String [ ] c2 = c1.split(“ab“);

for (int i = 0 ; i<a2.length ; i++) { System.out.println(a2[i]); }

for (int i = 0 ; i<b2.length ; i++) { System.out.println(b2[i]); }

for (int i = 0 ; i<c2.length ; i++) { System.out.println(c2[i]); }

String a = “ab12AB12abAB”; String b = “서영덕”; String c = “!@.%”;

System.out.println(a.length()); System.out.println(b.length()); System.out.println(c.length());

int d[ ] = new int[6]; System.out.println(d.length);

String a = “ab12AB12abAB”;

System.out.println(a.substring(1)); // “1”이 아니라 1이다.

System.out.println(a.substring(2, 4));

int index = a.indexOf(“A”); // int가 아니라 double로 선언하면?

System.out.println(a.substring(index, index+4));

Page 6: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 5 - [email protected]

3. 숫자와 관련된 기능

1) Wrapper

□ 때로는 int, double 등 기본형 자료를 확장형으로 변형하면 편리한 경우가 있는데, 이때 int의 Wrapper

인 Integer와 double의 Wrapper인 Dobule을 사용한다. [Integer, Dobule은 Class이다. 왜?]

○ 기본형은 불가능하지만 확장형 자료는 하나의 Class이므로 “상속”을 적용할 수 있는 편리함이 있다.

[정확하게는 상속에 의한 다형성(polymorphism)을 적용할 수 있기 때문이다. 뭐... 그런게 있다.]

○ 아마추어인 우리는 이러한 편리함을 사용해야 할 정도로 복잡한 프로그래밍을 하지는 않을 것이다.

□ 우리가 주로 Wrapper를 사용하는 것은 다음처럼 문자로 표현된 숫자를 “진정한 숫자”로 만들 때이다.

○ 처음부터 숫자를 숫자의 형태로 선언하면 될 것을 왜 문자로 표현한 후 다시 그 문자를 숫자로 변경

하는지는 의문이겠지만, Wrappers의 기능은 이후에 살펴볼 내용인 외부 데이터(예를 들어, Excel 파

일)를 JAVA 프로그램으로 불러서 처리할 때 유용하다. 왜냐하면 Excel 데이터를 프로그램으로 불러

오면 모든 정보가 문자열로 인식되기 때문이다.

○ Integer.parseInt()에서 Integer는 Class이고 parseInt()는 Integer라는 Class에 포함된 method이다.

− parseInt(문자열_입력값)은 문자열인 입력값을 int형 숫자로 변경하는 method이다.

▫ 문자열_입력값이 “4.5” 혹은 “A”처럼 int형으로 변경이 불가능하면 running에서 오류 발생.

− (제2장의 내용을 완벽히 이해한 사람은 눈치채었겠지만) parseInt()라는 method는 “static”이다.

그러므로 Integer라는 Class에서 (Object를 생성하지 않고서) 직접 사용할 수 있다.

▫ (String 때와 마찬가지로) JAVA API(http://docs.oracle.com/javase/7/docs/api/)에서, 좌측 상

단의 Packages에서 java.lang을 클릭한다. [String 때 언급하였듯이, 이 패키지는 import를 하

지 않아도 사용할 수 있다.]

− 좌측 하단 Classes에서 Integer를 클릭한다.

− 우측에서 Method Summary의 표에서 parseInt()를 보면 static이 붙어 있음을 확인할 수 있다.

▫ static int parseInt(String s)에서 각 단어의 의미 혹은 역할은?

□ 참고로, 위와 반대로 숫자를 문자로 변경하는 방법은 다음과 같이 다양하다. [각자의 스타일로 선택.]

int n1 = 2; int n2 = 3; double n3 = 4.5;

String s1 = n1+””; // 방법 1. ””사이에 빈칸(spacebar)가 없다. 만약 추가되면 결과는?

String s2 = String.valueOf(n2); // 방법 2. 구체적 논리는?

String s3 = (new Double(n3)).toString(); // 방법 3. 구체적 논리는? int인 n1에 적용하면?

System.out.println(n1+n2); System.out.println(n1+n3);

String s1 = “2”; String s2 = “3”; String s3 = “4.5”;

System.out.println(s1+s2); System.out.println(s1+s3);

int n1 = Integer.parseInt(s1);

int n2 = Integer.parseInt(s2);

double n3 = Double.parseDouble(s3); // double이 아니라 int로 선언하면 결과는?

System.out.println(n1+n2); System.out.println(n1+n3);

Page 7: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 6 - [email protected]

2) Math

□ Math는 승수계산 등 숫자의 연산을 해주는 Class이다.

○ Math는 java.lang이라는 패키지에 포함되다. 그러므로 명시적으로 import하지 않아도 된다.

○ JAVA API 에서, 좌측 상단의 Packages에서 java.lang을 클릭한 후, 좌측 하단 Classes에서 Math

를 클릭하면, 우측에서 관련내용을 확인할 수 있다.

○ Math의 모든 method는 static이다. 즉, Math.method_이름()으로 사용해야만 한다.

□ 다음 CODE를 통해 Math의 주요 method의 기능을 확인하자.

○ API에서 확인할 수 있듯이, Math Class에는 평균을 계산하는 method가 없다. 평균을 계산하는

method를 직접 만들어 보자. 또한, max 혹은 min method는 2개의 숫자만 비교할 수 있다. 3개 이

상의 숫자를 비교하여 최대값 혹은 최소값을 계산하는 method를 직접 만들어 보자.

○ Math.random()은 0[포함]과 1[미포함] 사이의 난수를 반환한다. 1[포함]에서 10[포함] 사이의 “정

수”인 난수를 반환하기 위해서는 “int e = (int)(Math.random()*10)+1;”로 수정하면 된다.

− 다시 running을 하면 난수가 변경됨을 확인하라.

− int e = (int)(Math.random()*10+1)은 어떤 범위의 난수를 반환하는가?

○ “Math.”을 지워보자. 다음으로 CODE 맨 위에 “import static java.lang.Math.*;”을 추가해보자.

□ 다음 CODE의 결과를 확인하여, Math.random()에 비해 Random Class가 가진 장점을 확인하자.

○ 계속 running을 해도 난수가 변경되지 않음을 확인하라. “new Random(1);”에서 1을 제거한 후 계

속 running하면 난수가 변경됨을 확인하라. 1 대신 100으로 변경한 후 계속 running을 해보라.

○ java.util이라는 패키지에서 Random이라는 Class의 내용을 확인해보자.

import java.util.*; // java.lang 이외의 패키지는 이렇게 명시적으로 import해야 한다.

public class OneClassOneMethod {

public static void main (String[] args) {

Random a = new Random(1); System.out.println(a.nextInt());

System.out.println(a.nextInt(10)); System.out.println(a.nextInt(100));

} }

public class OneClassOneMethod {

public static void main (String[] args) {

int a = 2; int b = -3; double c = 23.5; double d = -12.5;

System.out.println(Math.abs(b)); System.out.println(Math.abs(d));

System.out.println(Math.round(c)); System.out.println(Math.round(d));

System.out.println(Math.min(a,b)); System.out.println(Math.min(a,d));

System.out.println(Math.max(Math.max(a,b), Math.max(c,d))); // Math.max(a,b,c,d)는? 왜?

System.out.println(Math.sqrt(a)); System.out.println(Math.pow(a,3));

System.out.println(Math.pow(a,0.5)); // 0.5대신 1/2로 하면?

double e = Math.random(); System.out.println(e);

} }

Page 8: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 7 - [email protected]

3) Formatter

□ Formatter는 숫자를 소수점 2자리까지만 출력하는 등 숫자의 “출력 형식”을 정하는 Class로서,

java.text라는 패키지에 포함되어 있다. 참고로, 이 패키지는 명시적으로 import 해야 한다.

□ 숫자의 소수점 출력은 다음처럼 DecimalFormat이라는 Class를 사용한다.

○ DecimalFormat df = new DecimalFormat(“0.##”);는 소수점 2자리 즉 소수점 3자리에서 반올림하

는 기능을 수행하는 DecimalFormat이라는 Class를 이용하여 df라는 Object를 생성한 것이다.

− “0.#”으로 변경해 볼 것. “000.#”으로 변경해 볼 것. “0,000.#”으로 변경해 볼 것.

○ df.format()은 앞에서 생성한 df라는 Object의 method인 format을 호출한다. format()은 입력된 숫

자를 소수점 2자리의 형태인 “문자열(String)”로 반환하는 method이다.

□ 숫자의 천단위 콤마(,) 출력은 다음처럼 new없이 NumberFormat.getNumberInstance()를 사용한다.

□ 날짜의 출력 방법은 다음과 같다. [Date 및 Locale.KOREA는 java.util에 포함됨.]

○ “(0,Locale.KOREA)”에서 숫자 0을 1, 2, 3, 4로 변경해볼 것. KOREA를 JAPAN으로 변경해볼 것.

○ java.util 패키지에서 Canlendar Class의 내용을 보고 Date Class와 비교해볼 것.

import java.text.*; imprt java.util.*;

public class OneClassOneMethod {

public static void main (String[] args) {

Date d = new Date(); //오늘 날짜 정보 생성.

DateFormat df = DateFormat.getDateInstance(0,Locale.KOREA); // 주의: new 없음!!

System.out.println(d); System.out.println(df.format(d));

} }

import java.text.*;

public class OneClassOneMethod {

public static void main (String[] args) {

int a = 1234567; double b = 9876543.21;

NumberFormat comma = NumberFormat.getNumberInstance(); // 주의: new 없음!!

System.out.println(comma.format(a)); System.out.println(comma.format(b));

} }

import java.text.*;

public class OneClassOneMethod {

public static void main (String[] args) {

int a1 = 23; double b1 = 23.4567; double c1 = 70.0/3;

DecimalFormat df = new DecimalFormat(“0.##”);

String a2 = df.format(a1); String b2 = df.format(b1); String c2 = df.format(c1);

System.out.println(a2); System.out.println(b2); System.out.println(c2);

} }

Page 9: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 8 - [email protected]

4. ArrayList

□ 제1장에서 살펴보았듯이, “동일한 형태”의 변수를 여러 개 선언∙생성할 때 배열을 사용하면 편리하다.

○ 즉, int형과 double형을 같은 배열에 포함시킬 수는 없다.

□ ArrayList라는 Class는 다른 형태의 변수를 하나의 배열에 포함시킬 수 있도록 한 것이다. 또한, 원소

의 구조 혹은 내용을 관리하기에 매우 편리하다는 장점이 있다.

○ 배열로 생성하였는데 이후에 배열 내에 포함된 원소 한 개를 제거해야 할 경우

○ ArrayList로 생성하였는데 이후에 ArrayList 내에 포함된 원소 한 개를 제거해야 할 경우

□ ArrayList와 관련된 다음 method의 기능을 확인하자[API에서 ArrayList의 내용을 참고할 것].

ArrayList a1 = new ArrayList(); ArrayList a2 = new ArrayList(); ArrayList a3 = new ArrayList();

for (int i = 1 ; i<3 ; i++) { a1.add(i); } // 원칙은 a1.add(new Integer(i)); 무슨 의미?

for (int i = 3 ; i<6 ; i++) { a1.add((double)i); } //원칙은 a1.add(new Double(i)); 괄호차이는?

a2 = a1; a3 = (ArrayList)a1.clone(); // (ArrayList)는 왜?

a1.remove(2); for (int i = 0 ; i<a1.size() ; i++) { System.out.println(a1.get(i)); }

a1.remove((Integer)2); for (int i = 0 ; i<a1.size() ; i++) { System.out.println(a1.get(i)); }

a1.add(1, “A”); for (int i = 0 ; i<a1.size() ; i++) { System.out.println(a1.get(i)); }

System.out.println(a1.indexOf(4.0)); // 4.0 대신에 12.8을 입력하면?

System.out.println(a1.contains(12.8)); // 12.8 대신에 1을 입력하면? 4를 입력하면?

System.out.println(a1.isEmpty());

for (int i = 0 ; i<a2.size() ; i++) { System.out.println(a2.get(i)); }

for (int i = 0 ; i<a3.size() ; i++) { System.out.println(a3.get(i)); }

import java.util.*; //ArrayList Class는 java.util 패키지에 있다.

public class OneClassOneMethod {

public static void main (String[] args) {

ArrayList a1 = new ArrayList();

for (int i = 0 ; i<10 ; i++) { a1.add(i); } // 원소추가는 add()임

a1.remove(3); // 원소제거는 remove(위치) 혹은 remove(원소)임

for (int i = 0 ; i<a1.size() ; i++) { System.out.println(a1.get(i)); } // 원소호출은 get(위치)임

} }

public class OneClassOneMethod {

public static void main (String[] args) {

int[ ] a1 = new int[10];

for (int i = 0 ; i<a1.length ; i++) { a1[i] = i; }

int[ ] a2 = new int[9];

for (int i = 0 ; i<3 ; i++) { a2[i] = a1[i]; }

for (int i = 4 ; i<a1.length ; i++) { a2[i-1] = a1[i]; }

for (int i = 0 ; i<a2.length ; i++) { System.out.println(a2[i]); }

} }

Page 10: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 9 - [email protected]

5. Arrays와 Collections

□ Arrays는 배열의 원소를 정렬할 때 그리고 배열간 서로 비교할 때 편리한 “static” Class이다.

○ (우리가 Arrays를 몰랐다고 가정하고) Arrays를 사용하지 않고 sort하는 프로그램을 만들어보자.

○ Arrays.equals()의 기능을 확인해보자.

□ Collections는 ArrayList의 원소를 정렬할 뿐 아니라 max 값도 찾을 수 있는 “static” Class이다.

○ 단, sort, max, min은 ArrayList에 포함된 원소의 형태가 동일해야만 적용된다. 즉, ArrayList에 int

값과 double값이 같이 포함되어 있으면 running때 오류가 발생한다.

○ ArrayList에 숫자가 아니라 문자열인 “AB”, “AC”, “aB”, “Ab”, “ab”를 삽입한 후 적용해보자.

import java.util.*; //Collections Class는 java.util 패키지에 있다.

public class OneClassOneMethod {

public static void main (String[] args) {

int[ ] a = new int[ ] {5, 3, 6, 7, 2, 4};

System.out.println(“입력된 순서의 값”);

for (int i = 0 ; i<a.length; i++) { System.out.println(a[i]); }

Arrays.sort(a);

System.out.println(“Sort된 값”);

for (int i = 0 ; i<a.length; i++) { System.out.println(a[i]); }

} }

import java.util.*; //Collections Class는 java.util 패키지에 있다.

public class OneClassOneMethod {

public static void main (String[] args) {

ArrayList a = new ArrayList();

Random r = new Random(1); for (int i = 0 ; i<7 ; i++) { a.add(r.nextInt(100)); }

System.out.println(“입력된 순서의 값”);

for (int i = 0 ; i<a.size(); i++) { System.out.println(a.get(i)); }

Collections.reverse(a);

System.out.println(“역순으로 정렬된 값”);

for (int i = 0 ; i<a.size(); i++) { System.out.println(a.get(i)); }

Collections.sort(a);

System.out.println(“Sort된 값”);

for (int i = 0 ; i<a.size(); i++) { System.out.println(a.get(i)); }

Collections.shuffle(a);

System.out.println(“무작위로 Shuffle된 값”);

for (int i = 0 ; i<a.size(); i++) { System.out.println(a.get(i)); }

System.out.println(“최대값: “+Collections.max(a));

System.out.println(“최소값: “+Collections.min(a));

} }

Page 11: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 10 - [email protected]

6. 외부 데이터 입출력

□ 지금까지 만들어본 프로그램은 “내부적으로” 데이터(정보)를 입력하고 출력하였다.

○ “int a = 3;” 혹은 “Student b = Student(20104270, “A+”);”처럼 3, 20104270, “A+”등의 데이터(정

보)를 프로그램 내부에서 표기하여 할당하였고, “System.out.println(a);”를 통해 Eclipse의 결과창에

프로그램의 결과값을 출력하였다.

○ 배열을 사용한다 하더라도 변수가 100개라면 100개의 데이터를 “표기”하여 할당해야 하는 번거로

움이 있다. 데이터가 그나마 “규칙적”이라면 for문을 사용하면 되지만[왜?], 비규칙적이라면 하나 하

나 일일이 할당해야 한다. 이런 경우에는 데이터 입력이 더 편한 Excel에 데이터를 입력한 후, 프로

그램이 “외부”에 있는 그 Excel 데이터를 내부의 변수에 자동으로 할당하게 하면 편리하다.

− 혹은 이미 Excel로 만들어져 있는 기존의 외부 데이터를 프로그램으로 처리해야 할 때가 있다.

○ “내부적” 출력 역시 프로그램이 끝나면(사라지면) 그 데이터도 사라지게 된다는 단점이 있다. 물론

Eclipse 결과창의 값을 단순히 copy&paste할 수도 있지만 정보가 많으면 이전 정보가 사라지게 된

다. 이런 경우에는 프로그램이 결과 데이터를 “외부적으로” 즉 Excel 데이터로 저장하면 편리하다.

□ 하지만 “애석하게도” Excel 파일 그 자체를 사용할 수는 없고, 다음과 같이 다른 형태로 전환해야 한다.

○ 각 셀 값을 탭(tab)으로 구분된 확장자가 txt인 파일로 전환해야 한다.

− 다른 이름으로 저장 > 텍스트 (탭으로 분리)

○ 각 셀 값을 콤마(,)로 구분한 확장자가 csv인 파일로 전환해야 한다.

− 다른 이름으로 저장 > CSV (쉼표로 분리) [csv: comma separated value]

○ 예를 들어, 다음 정보를 입력한 후 Excel “자체” 파일인 data.xlsx(Excel 통합 문서)로 저장하자.

− 단, 파일 저장 위치는 JAVA 프로그래밍에서 만든 Project명의 폴더 안이어야 한다.

○ 다음으로, 위 Excel 파일에서 “다른 이름으로 저장 > 텍스트 (탭으로 분리)”로 data.txt로 저장하자.

− data.txt를 더블클릭하면 다음처럼 각 셀의 정보가 탭(tab)으로 분리되었음을 알 수 있다.

○ 다음으로, 위 Excel 파일에서 “다른 이름으로 저장 > CSV (쉼표로 분리)”로 data.csv로 저장하자.

− data.csv를 더블클릭하면 Excel 자체 파일인 data.xlsx처럼 Excel로 보여진다.

Page 12: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 11 - [email protected]

□ 외부 데이터를 “가져오는” 프로그래밍은 다음과 같다.

○ 위 프로그램의 세부적 의미에 대해서 구체적으로 이해하기 위해서는 (지금까지 살펴보지 않은)

JAVA의 여러 고급 내용을 파악하고 있어야 하므로, 우리는 다음과 같이 그 역할에 대해서만 간단히

이해한 후, 필요한 경우에 그냥 위 CODE를 copy&paste해서 사용하자.

○ “try { … } catch(Exception ex) {ex.printStackTrace();}”는 반드시 필요한 하나의 set로서, 외부

파일을 불러올 때 그 파일이 없으면 running때 오류가 발생하도록 하는 역할을 한다.

− data.txt를 data2.txt로 수정해서 run해 보자.

○ “FileReader thisFile = new FileReader(“data.txt”);”는 data.txt라는 이름의 파일의 내용을 thisFile

이라는 변수 즉 리모콘으로 접근하도록 하는 역할을 한다.

○ “BufferedReader theRead = new BufferedReader(thisFile);”는 thisFile이라는 변수가 접근하는

data.txt의 내용을 (효율적으로) 가져오는 즉 읽어오는 역할을 한다.

− 즉, 파일 data.txt에 포함된 모든 내용이 theRead에 저장된다.

○ “while ( (line = theRead.readLine()) != null ) { … }”는 다음과 같이 세부적으로 보자.

− “line = theRead.readLine()”은 theRead에서 “한 줄(line)”의 내용을 읽어서 (앞에서 String으로

선언한) line으로 옮긴다. [외부 정보는 숫자라 하더라도 모두 문자열(String)으로 받아진다.]

▫ “한 줄”이라는 것은 Excel 파일에서 “행”이 바뀌는 것을 말한다. 즉 1행에 해당하는 모든 내

용이 “한 줄” 내용이 된다.

− “(line = theRead.readLine()) != null”은

▫ theRead에서 한 줄의 내용(.readLine())을 line으로 옮긴 내용이 “없는 것(null)이 아닌지(!=)”

를 즉, theRead에서 line으로 옮긴 내용이 “있는지”를 묻는 것이다.

▫ theRead.readLine()으로 꺼낸 내용이 있으면 while { … }의 …를 계속 실행하고, 더 이상 꺼낸

내용이 없으면 while문을 마친다. 쉽게 말하면, data.txt의 내용을 한 줄씩 차례대로 정보를 꺼

내는데 모든 내용을 다 꺼내면 while문을 마치는 것이다. 위 예에서, Excel 11행인 황진이의

내용까지 모두 꺼내면 while문은 끝나게 된다.

○ “theRead.close();”는 theRead의 역할을 종료시키는 역할을 한다.

○ [“data.txt”를 “data.csv”로 변경한 후 run해보자. “data.xlsx”로 변경한 후 rung해보자.]

import java.io.*; //이 패키지를 import해야 한다.

public class File_In_Out {

public static void main (String[] args) {

try {

FileReader thisFile = new FileReader(“data.txt”);

BufferedReader theRead = new BufferedReader(thisFile);

String line;

while ( (line = theRead.readLine()) != null ) {

System.out.println(line); System.out.println();

} theRead.close();

} catch(Exception ex) { ex.printStackTrace(); }

} }

Page 13: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 12 - [email protected]

□ 외부 데이터로 “보내는” 프로그래밍은 다음과 같다.

○ 앞에서와 마찬가지로 우리는 다음과 같이 위 CODE의 역할에 대해서만 간단히 이해한 후, 필요한

경우에 그냥 위 CODE를 copy&paste해서 사용하자.

○ “try { … } catch(Exception ex) {ex.printStackTrace();}”는 반드시 필요한 하나의 set로서, 외부

파일로 저장할 때 문제가 있으면 running때 오류가 발생하도록 하는 역할을 한다.

− 다만, 앞에서와 달리 saved.txt라는 파일이 없어도 오류는 발생하지 않으며 그 파일을 생성한다.

○ “FileWriter thatFile = new FileWriter(“saved.txt”);”는 saved.txt라는 이름의 파일의 내용을

thatFile이라는 변수 즉 리모콘으로 접근하도록 하는 역할을 한다.

− FileWriter(“saved.txt”)는 기존에 동일한 이름의 파일이 있으면 “덮어쓰기”를 하게 된다.

▫ 즉, 기존 파일의 내용을 모두 지우고 새로운 정보를 저장한다.

− FileWriter(“saved.txt”, true)는 기존에 동일한 이름의 파일이 있으면 “이어쓰기”를 하게 된다.

▫ 즉, 기존 파일의 내용을 유지한 채 그 다음에 새로운 정보를 추가하여 저장한다.

○ “BufferedWriter theWritten = new BufferedWriter(thatFile);”는 thatFile이라는 변수가 접근하는

saved.txt에 내용을 (효율적으로) 보내는 즉 저장하는 역할을 한다.

− 즉, theWritten으로 추가하는 내용이 파일 saved.txt에 저장된다.

○ “theWritten.write(“…”);”는 문자열인 …를 theWritten을 통해 saved.txt에 저장하는 역할을 한다.

단, …에 내용을 입력할 때 반드시 알아야 할 내용은 다음과 같다.

− 문자열 안에 \n이 포함되면 그 문자는

▫ txt로 저장될 때에는 줄바꿈(Enter)의 역할을, csv로 저장될 때에는 행바꿈의 역할을 하게 된다.

− 문자열 안에 \t가 포함되면 그 문자는

▫ txt로 저장될 때에는 탭(Tab)의 역할을, csv로 저장될 때에는 아무런 역할을 하지 못한다.

− 문자열 안에 ,가 포함되면 그 문자는

▫ txt로 저장될 때에는 그냥 콤마(,)가 되고, csv로 저장될 때에는 열바꿈(우측 셀로 이동)의 역할

을 하게 된다.

− 제1장에서 살펴본 JAVA에서 인식하는 형태인 ‘\n’와 ‘\t’처럼 작은따옴표가 있는 것이 아니다.

○ “theWritten.close();”는 theWritten의 역할을 종료시키는 역할을 한다.

import java.io.*; //이 패키지를 import해야 한다.

public class File_In_Out {

public static void main (String[] args) {

try {

FileWriter thatFile = new FileWriter(“saved.txt”);

BufferedWriter theWritten = new BufferedWriter(thatFile);

theWritten.write(“1번째 줄 내용입니다.”);

theWritten.write(“\n2번째 줄 내용입니다.”); // \n은 줄바꿈(Enter)을 의미하는 기호.

theWritten.write(”\t여전히 2번째 줄 내용입니다.”); // \t는 탭(Tab)을 의미하는 기호

theWritten.close();

} catch(Exception ex) { ex.printStackTrace(); }

} }

Page 14: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 13 - [email protected]

□ 다음 CODE의 논리를 확인하자. [csv파일이 아니라 탭(tab) 기준의 txt파일에 알맞게 수정해보자.]

public class Student {

String id; String name; double score; int payFee;

public Student(String i, String n, double s) {

id = i; name = n; score = s; }

public void calculateFee(int tuitionFee) {

if (score>=4.3) { payFee = tuitionFee-2000000; }

else if (score>=4.0) { payFee = tuitionFee-1000000; }

else { payFee = tuitionFee; }

}

public String toString() {

return (id+”,”+name+”,”+score+”,”+payFee);

} }

score.csv라는 외부파일 Student라는 추가 Class

import java.io.*; import java.util.*;

public class File_In_Out {

public static void main (String[] args) {

int totalFee = 4000000; ArrayList students = new ArrayList(); // ArrayList를 사용한 이유는?

try {

FileReader thisFile = new FileReader(“score.csv”);

BufferedReader theRead = new BufferedReader(thisFile);

Student s; String[] a; String line;

while ( (line = theRead.readLine()) != null ) {

a = line.split(“,”); // split을 사용한 이유는?

s = new Student(a[0], a[1], Double.parseDouble(a[2])); // Double.parseDouble() 사용 이유는?

students.add(s);

} theRead.close();

} catch(Exception ex) { ex.printStackTrace(); }

for (int i=0 ; i<students.size() ; i++) {

((Student)students.get(i)).calculateFee(totalFee); // 각 소괄호의 의미는?

}

try {

FileWriter thatFile = new FileWriter(“score2.csv”);

BufferedWriter theWritten = new BufferedWriter(thatFile);

for (int i=0 ; i<students.size() ; i++) {

theWritten.write(((Student)students.get(i)).toString()); // 각 소괄호의 의미는?

theWritten.write(“\n”);

} theWritten.close();

} catch(Exception ex) { ex.printStackTrace(); }

} }

Main Class

Page 15: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 14 - [email protected]

7. GUI

□ GUI(Graphic User Interface) 즉 그래픽을 제공하는 프로그램과 관련된 JAVA 패키지는 (기본적인)

AWT와 (보다 발전한) Swing 두 가지가 있다.

○ 두 패키지의 차이점에 대한 이해는 생략하고 편리한대로 혼합하여 사용하겠다.

○ GUI와 관련된 다양한 기능들 중에서 기본적인 것만 살펴보겠다.

− [그 외는 API의 java.awt와 javax.swing 패키지의 내용을 참고하여 필요할 때 사용할 것.]

□ GUI를 사용하기 위해서는 우선 Component와 Panel과 Container의 관계를 이해해야 한다.

○ Component는 개별 명령을 실행할 수 있는 기능을 제공하는 그래픽 객체이다.

○ Panel은 여러 개의 Component를 그룹화하는 것이다.

− 여러 개의 Component를 하나의 Panel에 등록(add)하면 그룹화가 된다.

○ Container는 (Panel로 그룹화된) 여러 개의 Component를 관리하는 것이다.

− Component는 혹은 Panel은 반드시 Container에 등록(add)되어야 기능을 수행할 수 있다.

○ 예를 들어 다음 CODE를 실행해보면 아래쪽 그래픽이 나타난다.

− 각 버턴에 대한 수행 명령을 정의하지 않았기 때문에, 아직은 버턴을 클릭해도 변화가 없다.

import javax.swing.*;

public class UsingGUI {

public static void main (String[] args) {

JFrame frame = new JFrame(“영상문화학부”); // 영상문화학부라는 이름의 창을 만든다.

frame.setSize(300,300); // 창의 크기를 정한다.

JPanel panel = new JPanel();

JButton button1 = new JButton(“영상비즈니스전공”);

JButton button2 = new JButton(“영상시나리오전공”);

panel.add(button1); // 영상비즈니스전공이라는 이름의 버턴이 panel에 등록된다.

panel.add(button2); // 영상시나리오전공이라는 이름의 버턴이 panel에 등록된다.

frame.add(panel); // panel이 frame에 등록된다.

frame.setVisible(true); // 창을 띄운다. 이 명령이 없으면 그래픽이 나타나지 않는다.

} }

▷button1과 button2는 Component이고, panel은 Panel이며, frame은 Container이다.

▶각 Component를 다른 Panel에 등록한 후, Panel 2개를 Container에 등록해보자.

▶Panel 없이 Component를 Container에 직접 등록해보자.

Container

Component

Component

Panel

Page 16: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 15 - [email protected]

□ 앞의 예에서 버턴을 클릭하면 명령을 수행하도록 하기 위해서는 다음 CODE를 추가해야 한다.

○ 위 CODE는 “Main Class가 자신의 Object를 직접 생성하고 있다”는 점에서 지금까지 우리가 만들

어 본 CODE와 다르다. [지금까지는 Main Class에서 추가 Class의 Object를 생성하였다.]

− main method안에 “UsingGUI myself = new UsingGUI();”가 포함되어 있음을 확인하자.

− 이렇게 하는 것이 (위 CODE처럼 Main Class의 내용을 다소 복잡하게 만드는 단점이 있지만)

GUI를 사용할 때는 ActionListener를 사용함에 있어 상당히 편리해지기 때문이다.

− 이처럼 Main Class가 자신의 Object를 직접 생성하면 Main Class의 속성 및 추가 method가

static이 아니어도 된다[왜? 단, myself.start()처럼 추가 method를 정의한 후 실행해야 한다].

import javax.swing.*; import java.awt.event.*;

public class UsingGUI implements ActionListener { // 이 Class는 ActionListener를 implements 함

JFrame frame; JPanel panel; JButton button1; JButton button2;

// main method 앞에서 선언되므로 Main Class의 속성(멤버변수)이다. 왜 이렇게 선언한 것일까?

public static void main (String[] args) { // main method 내용의 시작

UsingGUI myself = new UsingGUI();

myself.start(); // 아래에 정의된 start() method를 호출함

} // main method 내용의 끝

public void start() { // start()라는 추가 method 내용의 시작

frame = new JFrame(“영상문화학부”); frame.setSize(300,300);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 창 우측상단의 X를 클릭하면 창을 닫음과 동시에 관련 내부 자원 및 과정도 소멸시킴

panel = new JPanel();

button1 = new JButton(“영상비즈니스전공”); //JButton button1이 아니라 button1임. 왜?

button2 = new JButton(“영상시나리오전공”);

button1.addActionListener(this); button2.addActionListener(this);

// button1과 button2에 myself[왜?]가 수행하는 ActionListener의 기능을 부여함.

panel.add(button1); panel.add(button2); frame.add(panel);

frame.setVisible(true);

} // start()라는 추가 method 내용의 끝

public void actionPerformed(ActionEvent event) { // 버턴이 클릭되었을 때의 수행 내용의 시작

if(event.getSource() == button1) {

JOptionPane.showMessageDialog(null, “영상비즈니스전공을 클릭하셨습니다.”); }

if(event.getSource() == button2) {

JOptionPane.showMessageDialog(null, “영상시나리오전공을 클릭하셨습니다.”); }

} // 버턴이 클릭되었을 때의 수행 내용의 끝

}

Page 17: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 16 - [email protected]

○ 앞 CODE의 구조에 대한 세부적 논리는 생략하고 각 CODE의 역할에 대해서만 간단히 이해하자.

− ActionListener 및 ActionEvent는 java.awt.event 패키지에 포함되어 있다.

− Class를 정의할 때 “implements ActionListener”를 추가하면 ActionListener라는 Interface를

구현(implement)할 수 있게 된다.

▫ “extends Super_Class”를 추가하면 Super_Class를 상속하는 것과 유사하다.

▫ Interface는 완벽한 abstract Class라고 볼 수도 있는데, 구체적인 설명은 생략하겠다. (아직 아

마추어인) 우리는 GUI를 사용할 때 이러한 CODE가 필요하다는 것만 알자.

▫ 다만 역할에 대해서 간단히 설명하자면, JButton이라는 Component를 클릭하면 이 클릭이라는

Action을 프로그램이 “인지” 즉 Listen할 수 있도록 “준비”하는 것이다.

− “frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);”가 없어도 창의 우측상단의 X를

클릭하면 JFrame 창이 닫힌다. 하지만 이 창은 보여지는 부분일 뿐이고 관련 자원과 명령 수행

과정은 내부 메모리에 여전히 존재한다. 그러므로 이 명령을 추가함으로써 창을 닫음과 동시에

관련 내용도 메모리에서 제거하는 것이 “안전하고 효율적이다”.

▫ 참고로 JFrame.EXIT_ON_CLOSE에서 EXIT_ON_CLOSE은 JFrame Class의 “static 상수”이다.

− “button1.addActionListener(this);”은 Component인 JButton으로 생성한 button1이라는 Object

가 클릭되면 이 클릭이라는 Action을 프로그램이 실제로 “인지” 즉 Listen하도록 하는 것이다.

▫ implements ActionListener는 “인지하도록 준비”하는 것이고

▫ addActionListener()는 “실제로 인지하도록” 하는 것이다.

▫ this는 Main Class 자기 자신의 Object인 myself를 지칭한다. [왜 이렇게 해야 하는지에 대한

논리는 다소 복잡하므로 생략한다. 그냥 필요할 경우에 copy&paste하도록 하자.]

− “public void actionPerformed(ActionEvent event) { … }”는 JButton으로 생성된 button1과

button2가 클릭되었을 경우에 (즉, addActionListener로 그 클릭을 실제로 인지하게 되면) 호출

되는 method이다. 그러므로 수행해야 할 명령을 …에 추가하면 된다.

▫ button1과 button2 모두 JButton이므로 어느 버턴이든 클릭되면 이 method가 호출된다. 그러

므로 2개의 버턴을 구분하기 위해 if문을 사용하고 있다. 예를 들어, if(event.getSource() ==

button1)는 클릭된 것이 button1인지를 확인하는 것이다. [내부 클래스를 사용하면 if 불필요.]

▫ 참고로, JOptionPane.showMessageDialog(null, “영상비즈니스전공을 클릭하셨습니다.”)는 해당

문자열을 보여주는 창을 띄우는 역할을 한다. [이런 것은 전체를 그냥 외우자!]

○ 정리하자면, GUI를 사용하여 명령을 수행하는 프로그램의 경우 반드시 다음 사항을 기억해야 한다.

− javax.swing과 java.awt.event 패키지를 import 한다.

− GUI관련 CODE는 Main Class에 포함시키며, main method에서 Main Class 자신의 Object를 생

성한다. 이 때, Main Class는 ActionListener를 implement시켜야 한다.

− GUI는 JFrame과 같은 Container와 JPanel과 같은 Panel 그리고 JButton과 같은 Component로

이루어진다. 다수의 Component는 Panel로 그룹화되고 Container가 관리한다.

− 실제 명령을 수행하는 Component는 component.addActionListener(this)로 사용자의 Action을

인지할 수 있도록 해야 한다.

− 사용자의 Action에 의한 구체적인 명령은 actionPerformed() { … }의 …에 포함시킨다.

Page 18: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 17 - [email protected]

□ 다음 CODE의 결과를 통해 (API를 참고하여) 다른 여러 GUI 기능에 대해서도 확인하자.

○ 위 CODE에서 Panel을 1개가 아니라 panel1, panel2, panel3 총 3개로 만들어, JCheckBox는

panel1에, JComboBox는 panel2에, JTextField, JLabel, JButton은 panel3에 등록(add)한 후, 각

Panel을 Frame에 등록(add)할 때, 다음을 적용해보자. [창의 크기를 움직여보라.]

− frame.add(panel1, BorderLayout.NORTH);

− frame.add(panel2, BorderLayout.CENTER);

− frame.add(panel3, BorderLayout.SOUTH);

○ 즉, BorderLayout은 Panel을 Container에 어떻게 배치할 것인지에 대한 것인데, GridLayout에 대해

서도 각자가 파악해보라.

import javax.swing.*; import java.awt.event.*;

public class UsingGUI implements ActionListener {

JFrame frame; JPanel panel;

JCheckBox ckb1, ckb2, ckb3; JComboBox choice; JTextField txf; JLabel label; JButton button;

String output;

public static void main (String[] args) {

UsingGUI myself = new UsingGUI(); myself.start();

}

public void start() {

frame = new JFrame(“Various GUI Class”); frame.setSize(1000,200);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

panel = new JPanel();

ckb1 = new JCheckBox(“경영정보시스템”); ckb2 = new JCheckBox(“재무관리”);

choice = new JComboBox(); choice.addItem(“재미있다”); choice.addItem(“재미없다”);

label = new JLabel(“빈칸에 한 줄 의견을 입력하세요”);

txf = new JTextField(“”, 20);

button = new JButton(“출력합니다.”);

button.addActionListener(this);

panel.add(ckb1); panel.add(ckb2); panel.add(choice);

panel.add(label); panel.add(txf); panel.add(button);

frame.add(panel); frame.setVisible(true);

}

public void actionPerformed(ActionEvent event) {

String message=""; // “”을 한 이유는?

if (ckb1.isSelected()==true) { message = message + ckb1.getText() + '\n'; } // '\n'의 역할은?

if (ckb2.isSelected()==true) { message = message + ckb2.getText() + '\n'; }

message = message+ choice.getSelectedItem()+ '\n';

message = message+ txf.getText();

JOptionPane.showMessageDialog(null, message);

}

}

Page 19: 제1편 예술과 경제 - accnt.chugye.ac.kraccnt.chugye.ac.kr/~biz/A3_1 Advanced Programming... · java.lang은 패키지 이름인데, 이 패키지는 import를 하지 않아도

경영정보시스템 제3장 유용한 JAVA제공 기능

- 18 - [email protected]

8. 이번 장 정리

□ 이번 장에서는 풍부한 내용의 프로그래밍을 개발할 때 편리하게 사용할 수 있는, JAVA가 제공해주는

수많은 기능들 중 기본적인 것들에 대해서 살펴보았다.

□ 이번 장에서 살펴본 기능을 포함하여 그 외 모든 기능을 정리해 둔 곳이 바로 JAVA API이다.

○ 비유하자면 영어사전이다.

○ 영국∙미국 사람조차도 영어사전의 내용을 모두 알고 있지 못하듯이, 전문 개발자도 JAVA API의 내

용을 모두 파악하고 있지 않다.

□ 그러므로 프로그램을 개발할 때 필요한 기능이 이미 존재하는지를 API에서 찾아보는 것이 중요하다.

○ API가 영어이고 구조가 복잡하므로, 우선은 인터넷 포털을 이용하여 관련 기능을 찾아보고 그 기능

에 대한 구체적인 내용은 API를 이용하는 것이 효율적이다.

□ API에 있는 기능은 Class이다. [Interface 역시 특이한 형태의 Class이다.]

○ 비유하자면 레고의 만들어진 블록이다.

○ 레고의 블록을 많이 가지고 있을수록 더 다양한 것을 만들 수 있듯이, API의 내용을 많이 참고할수

록 더 다양한 (그리고 무엇보다도 더욱 효율적인) 프로그래밍을 할 수 있다.

○ 레고의 블록을 서로 연결할 때 규칙이 있듯이, API의 기능 역시 사용규칙(입력값 형태 등)이 있으므

로 반드시 그 규칙을 이해할 수 있어야 한다.