5.1.20 추상 메소드와 추상 클래스 -추상 메소드(abstract method) 선언되어 있으나 구현되어 있지 않은 메소드 추상 메소드 정의 접근 지정자 abstract 반환형 메소드이름(); -ex) public abstract int getvalue(); -추상 메소드는 서브 클래스에서 오버라이딩하여 구현 -추상 클래스(abstract class) 추상 클래스를 하나라도 가지면 추상 클래스임 클래스 앞에 반드시 abstract라고 선언해야 함 추상 메소드가 하나도 없지만 클래스 앞에 abstract로 선언한 경우 5.1.21 추상 클래스 특성 -추상 클래스의 객체는 생성할 수 없다. -추상 클래스 필요성 계층적 상속 관계를 갖는 클래스 구조를 만들 때 설계와 구현 분리 슈퍼 클래스에서는 개념적 특징 정의, 서브 클래스에서 구체적 행위 구현 -추상 클래스의 상속 추상 클래스를 상속받아, 추상 메소드를 구현하지 않으면 서브 클래스도 추상 클래스 됨. abstract로 정의하여야 한다. - 401 -
서브 클래스에서 추상 메소드를 구현하면 서브 클래스는 추상 클래스가 되지 않는다. 5.1.22 2 가지 종류의 추상 클래스 -추상 클래스의 활용 예 -예제 5-6 : 추상 클래스의 구현 다음의 추상 클래스 Calculator를 상속받는 GoodCalc 클래스를 독자 임의로 작성하라. - 402 -
-예제 5-6 정답 21. 실세계의 인터페이스와 인터페이스의 필요성 그림 5.2 5.1.23 자바의 인터페이스 -인터페이스(interface) 모든 메소드가 추상 메소드인 클래스 인터페이스는 상수와 메소드만 갖는다. 필드는 없음 - 403 -
-인터페이스 정의 interface 키워드로 정의된 클래스 ex) public interface SerialDriver { } -인터페이스의 특징 메소드 선언 시 abstract 키워드를 사용하지 않아도 된다. 모든 메소드는 public으로 가정, public 접근 지정자 생략 가능 객체를 생성할 수 없음 레퍼런스 변수 타입으로 사용 가능 인터페이스의 메소드 속성 public, static, final으로 가정되므로 키워드 생략 가능 -자바 인터페이스 사례 -인터페이스의 필요성 인터페이스를 이용하여 다중 상속 구현 클래스는 다중 상속 불가 인터페이스는 명세서와 같음 구현은 블랙 박스와 같아 인터페이스의 사용자는 구현에 대해 알 필요가 없음 인터페이스만 정의하고 구현을 분리하여, 작업자가 다양한 구현을 할 수 있음 그림 5.3-404 -
-인터페이스 상속 인터페이스 간에도 상속 가능 인터페이스 상속하여 확장된 인터페이스 작성 가능 다중 상속 허용 -인터페이스 구현 인터페이스 구현 implements 키워드 사용 여러 개의 인터페이스 동시 구현 가능 상속과 구현이 동시에 가능 -인터페이스의 다중 구현 - 405 -
-추상 클래스와 인터페이스 비교 표 5.2 제6장 패키지 개념과 자바 기본 패키지 6.1 패키지 개념과 필요성 6.1.1 패키지 개념과 필요성 그림 6.1 6.1.2 샘플의 디렉터리 관리(패키지) - 406 -
6.1.3 자바의 패키지 (package) -패키지란 서로 관련된 클래스와 인터페이스의 컴파일된 파일들을 하나의 디렉터리에 묶어 놓은 것 -하나의 응용프로그램은 여러 개의 패키지로 구성 하나의 패키지에 모든 클래스 파일을 넣어 둘 수 있음 -패키지는 jar 파일로 압축할 수 있음 예) JDK에서 제공하는 표준 패키지는 rt.jar에 압축 6.1.4 JDK에서 제공되는 클래스의 패키지 그림 6.2 6.1.5 패키지 사용하기, import문 -다른 패키지 갖다 쓰기 import를 이용하지 않는 경우 소스 내에서 매번 전체 패키지 이름과 클래스명을 써주어야 함 import 키워드 이용하는 경우 소스의 시작 부분에 사용하려는 패키지 명시 소스 내에서 클래스 명만 명시하면 된다. - 407 -
-import 사용 특정 클래스의 경로명만 포함하는 경우 import java.util.scanner; 패키지 내의 모든 클래스를 포함시키는 경우 import java.util.*; *는 현재 패키지 내의 클래스만을 의미하며 하위 패키지의 클래스까지 포함하지 않는다. 6.1.6 클래스 경로 -클래스의 위치(경로) 지정 클래스 탐색 경로를 지정하는 방법 2 가지 클래스 경로의 환경 변수 : 시스템 환경 변수 CLASSPATH java의 옵션 classpath 그림 6.3 그림 6.4 -실행 시 클래스 파일이 존재하는 패키지 디렉터리 정보를 -classpath 옵션에 지정 - 408 -
-CLASSPATH 지정 방법 그림 6.5 6.1.7 수동으로 패키지를 만드는 과정 -수동으로 패키지를 만드는 과정 1. 패키지로 사용할 디렉터리 생성 2. 자바 소스 내의 패키지 선언 package 패키지 이름; 이 소스 파일이 컴파일되면 생성된 클래스 파일이 속할 패키지 이름 선언 3. 자바 소스를 컴파일한 클래스 파일을 패키지 디렉터리에 저장 -패키지에 속한 자바프로그램 실행 main() 메소드를 가진 클래스의 정확한 경로명 지정 패키지가 포함된 디렉터리로 이동하여 경로명을 지정하여 실행하거나 임의의 디렉터리에서 java -classpath (패키지경로명) 클래스 이름으로 실행 -패키지를 포함하는 응용프로그램 개발 사례 1 -패키지 디렉터리 chapter6 생성 현재 디렉터리 C:\Temp C:\Temp\chapter6 디렉터리 생성 -소스 파일 내에 패키지 선언 -Hello.java 컴파일 C:\Temp>javac Hello.java 현재 디렉터리에서 컴파일 Hello.class 생성 - 409 -
-Hello.class 파일 복사 혹은 이동 Hello.class 파일을 C:\Temp에서 C:\Temp\chapter6로 복사 혹은 이동 -실행 C:\temp>java chapter6.hello 현재 디렉터리에서 실행 정상적으로 실행됨 -패키지를 포함하는 응용프로그램 개발 사례 2 -chapter6 디렉터리 생성하지 않음 현재 디렉터리 C:\Temp -컴파일 C:\Temp>javac -d. Hello.java 현재 디렉터리에서 컴파일 -d 옵션 : 패키지 디렉터리 자동 생성. : 현재 디렉터리를 기준으로 클래스 파일을 찾도록 지시 결과 : Hello.class 파일을 C:\Temp\chapter6에 생성 -실행 C:\ temp>java chapter6.hello 현재 디렉터리에서 실행 정상적으로 실행됨 -사례 2의 컴파일 과정 및 실행 java -d. Hello.java 로 컴파일 하면 현재 디렉터리 (.) 밑에 chapter6 디렉터리 자동 생성되고 동시에 컴파일된 클래스 파 일이 생성됨 그림 6.6-410 -
6.1.8 이클립스에서 쉽게 패키지 만들기 예제로 사용할 샘플 소스(5장의 예제 5-6) 6.1.9 프로젝트 작성(프로젝트 이름 : PackageEx) 그림 6.7-411 -
6.1.10 패키지 lib 작성 그림 6.8 6.1.11 패키지 app 작성 그림 6.9-412 -
6.1.12 패키지 작성이 완료된 결과 그림 6.10 6.1.13 클래스 Calculator 만들기 그림 6.11-413 -
6.1.14 Calculator 소스 수정 그림 6.12 그림 6.13-414 -
그림 6.14 6.1.15 프로젝트 PackageEx 실행 그림 6.15 6.1.16 패키지의 특징 -패키지의 특징 패키지 계층구조 클래스나 인터페이스가 너무 많아지면 관리의 어려움 관련된 클래스 파일을 하나의 패키지로 계층화하여 관리하면 관리 쉬움 패키지별 접근 제한 default로 선언된 클래스나 멤버는 동일 패키지 내의 클래스들이 자유롭게 접근하도록 허용 동일한 이름의 클래스와 인터페이스의 사용 가능 서로 다른 패키지에 이름이 같은 클래스와 인터페이스 존재 가능 높은 소프트웨어 재사용성 오라클에서 제공하는 자바 API는 패키지로 구성되어 있음 java.lang, java.io 등의 패키지들 덕분에 일일이 코딩하지 않고 입출력 프로그램을 간단 히 작성할 수 있음 6.1.17 자바 JDK의 패키지 구조 -JDK 패키지 - 415 -
자바에서는 관련된 클래스들을 표준 패키지로 묶어 사용자에게 제공 자바에서 제공하는 패키지는 C언어의 표준 라이브러리와 유사 JDK의 표준 패키지는 rt.jar에 담겨 있다. C:\Program Files\Java\jdk1.6.0_16\jre\lib\rt.jar 그림 6.16 -자바 패키지 구조 6.1.18 주요 패키지 -java.lang - 416 -
자바 language 패키지 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스 자동으로 import 됨 - import 문이 필요없음 -java.util 자바 유틸리디 패키지 날짜, 시간, 벡터, 해쉬 테이블 등과 같은 다양한 유틸리티 클래스와 인터페이스 제공 -java.io 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스 제공 -java.awt 자바 GUI 프로그래밍을 위한 클래스와 인터페이스 제공 -javax.swing 자바 GUI 프로그래밍을 위한 스윙 패키지 6.1.19 자바 API 참조 -자바 API의 상세 정보 Oracle Technology Network(http://download-llnw.oracle.com/javase/6/docs/api/)에서 온라인으로 API 규격제공 그림 6.17 6.1.20 Object 클래스 -특징 java.lang 패키지에 포함 자바 클래스 계 층 구조의 최상위에 위치 모든 클래스의 수퍼 클래스 -주요 메소드 표 6.1 메소드 설명 - 417 -
protectedobject clone() 현 객체와 똑같은 객체를 만들어 반환. 오버라이딩 필요 booleanequals(objectobj) obj가 가리키는 객체와 현재 객체가 비교하여 같으면 true반환 ClassgetClass() 현 객체의 런타임 클래스를 반환 inthashcode() 현 객체에 대한 해쉬 코드 값 반환 StringtoString() 현 객체에 대한 스트링 표현을 반환 void notify() 현 객체에 대해 대기하고 있는 하나의 쓰레드를 깨운다. void notifyall() 현 객체에 대해 대기하고 있는 모든 쓰레드를 깨운다. void wait() 현 객체의 다른 쓰레드가notify() 또는 notifyall() 메소드를 호출할 때까지 현 쓰레드를 대기하게 한다. 6.1.21 객체 속성 -객체를 문자열로 변환 -String tostring() 객체를 텍스트 형태로 표현한 문자열로 반환 반환되는 문자열 : 클래스 이름@객체의 hash code 객체와 문자열이 + 연산이 되는 경우 객체의 tostring() 메소드를 호출 - 418 -
-새로운 tostring() 만들기 6.1.22 객체 비교 -객체 레퍼런스의 동일성 비교 : = 연산자 이용 -객체 내용 비교 서로 다른 두 객체가 같은 내용물인지 비교 boolean equals(object obj) 이용 - 419 -
-예제 6-1 : Rect 클래스 만들고 equals() 만들기 int 타입의 width, height의 필드를 가지는 Rect 클래스를 작성하고, 두 Rect 객체의 width, height 필드에 의해 구성되는 면적이 같으면 두 객체가 같은 것으로 판별하도록 equals()를 작성하라. Rect 생성자에서 width, height 필드를 인자로 받아 초기화한다. 6.1.23 Wrapper 클래스 -자바 기본 데이터 타입을 클래스화한 8개 클래스 표 6.2 기본 데이터 타입 byte short int long char float double boolean Wrapper클래스 Byte Short Integer Long Character Float Double Boolean -용도 기본 데이터 타입을 사용할 수 없고 객체만 사용하는 컬렉션에 기본 데이터 타입을 Wrapper 클래스로 만들어 사용 6.1.24 Wrapper 객체 생성 -기본 데이터 값을 인자로 Wrapper 클래스 생성자 호출 -해당 데이터 값을 나타내는 문자열을 생성자 인자로 사용 가능 Boolean, Short, Byte, Integer, Long, Double, Float 경우 - 420 -
-Float는 double 타입의 값을 생성자의 인자로 사용 가능 6.1.25 주요 메소드 가장 많이 사용하는 Integer 클래스의 주요 메소드 표 6.3 메소드 staticintbitcount(inti) float floatvalue() intintvalue() long longvalue() short shortvalue() staticintparseint(string s) staticintparseint(string s, intradix) static Sting tobinarystring(inti) static Sting tohexstring(inti) static Sting tooctalstring(inti) static Sting tostring(inti) 설명 이진수 표현에서 1을 개수를 반환 float타입으로 변환된 값 반환 int타입으로 변환된 값 반환 long 타입으로 변환된 값 반환 short 타입으로 변환된 값 반환 스트링을10진 정수로 변환된 값 반환 스트링을 지정된진법의 정수로 변환된 값 반환 이진수 표현으로 변환된 스트링 반환 16진수 표현으로 변환된 스트링 반환 8진수 표현으로 변환된 스트링 반환 정수를 스트링으로 변환하여 반환 6.1.26 Wrapper 활용 -Wrapper 객체로부터 기본 데이터 타입 알아내기 -문자열을 기본 데이터 타입으로 변환 - 421 -
-기본 데이터 타입을 문자열로 변환 -예제 6-2 : Wrapper 클래스 활용 다음은 Wrapper 클래스를 활용하는 예이다. 다음 프로그램의 결과는 무엇인가? 6.1.27 박싱과 언박싱 -박싱(boxing) 기본 데이터 타입을 Wrapper 클래스로 변환하는 것 -언박싱(unboxing) 반대의 경우를 언박싱이라고 한다. 6.1.28 Auto boxing & unboxing -JDK 5.0 이상부터 지원 -Auto boxing - 422 -
기본 데이터 타입을 자동으로 Wrapper 클래스로 변환 -Auto unboxing Wrapper 클래스를 자동으로 기본 데이터 타입으로 변환 -예제 6-3 : 박싱 언박싱의 예 다음 코드에 대한 결과는 무엇인가? 6.1.29 String의 생성과 특징 -String - java.lang.string String 클래스는 하나의 스트링만 표현 -String 생성자 표 6.4 생성자 설명 String() String(byte[] bytes) String(String original) String(StringBuffer buffer) 빈스트링 객체 생성 플랫폼의 기본 문자집합을 이용하여 바이트배열을 디코딩하 여스트링 객체 생성 인자로 주어진 스트링과 똑같은 스트링 객체를 생성 스트링 버퍼에 포함된 일련의 문자들을 나타내는 스트링 객 체 생성 - 423 -
6.1.30 스트링 리터럴과 new String() -스트링 생성 단순 리터럴로 생성, String s = "Hello"; JVM이 리터럴 관리, 응용프로그램 내에서 공유됨 String 객체로 생성, String t = new String("Hello"); 힙에 String 객체 생성 6.1.31 스트링 객체의 주요 특징 -스트링 객체는 수정 불가능 -==과 equals() 두 스트링을 비교할 때 반드시 equals()를 사용하여야 함 equals()는 내용을 비교하기 때문 6.1.32 주요 메소드 표 6.5 메소드 charcharat(int index) 설명 지정된 인덱스에 있는 문자값을 반환 intindexof(intch) ch 문자가 있는 인덱스 리턴. 없으면 -1리턴 fromindex위치부터 끝까지 문자 ch 탐색. 인덱스 리턴. 없 inindexof(intch, intfromindex) 으면 -1리턴 String concat(string str) 지정된 스트링을 현재 스트링 뒤에 덧붙인 스트링 반환 boolean contains(charsequence s) 지정된일련의 문자들을 포함하고 있으면 true 반환 intlength() 스트링의 길이 반환 String replace(charsequece target지정하는 일련의 문자들을 replacement가 지정하는 target, Charsequence 문자들로 변경한 스트링 반환 replacement) - 424 -
String[] split(string regex) String substring(intbeginindex) String tolowercase() String touppercase() String trim() 정규식에 일치하는 부분을 중심으로 스트링 분리하여 스트 링 배열로 반환 지정된 인덱스부터 시작하는 서브 스트링 반환 스트링을 소문자로 변경한 스트링 반환 스트링을 대문자로 변경한 스트링 반환 스트링 앞뒤의 공백문자들을 제거한 스트링 반환 6.1.33 문자열 비교 -int compareto(string anotherstring) 문자열이 같으면 0을 리턴 비교 연산자 ==는 레퍼런스를 비교하므로 문자열 비교에는 사용할 수 없다. 6.1.34 문자열 연결 -String concat(string str) 자바에서 스트링 연결 연산자 + 지원 + 연산에서 문자열이 인자로 포함되어 있으면 산술 연산이 아닌 문자열 연결 연산으로 간주. -객체가 문자열 연결 연산에 포함되어 있는 경우 tostring() 메소드를 호출하여 객체를 문자열로 변환한 후 문자열 연결 -기본 데이터 타입 그대로 문자열로 변환된 후에 문자열 연결 -String 클래스의 concat(string str) 메소드를 이용하여 스트링 연결 -기존 String 객체에 연결되지 않고 새로운 스트링 객체를 생성하여 리턴 - 425 -
6.1.35 concat()은 새로운 문자열을 생성 6.1.36 문자열 내의 공백 제거, 문자열의 각 문자 접근 -공백 제거 String trim() 스트링 앞 뒤 공백 문자(tab, enter, space) 제거한 스트링 리턴 -문자열의 문자 char charat(int index) 스트링에 포함된 각 문자 접근 -예제 6-4 : String 클래스 메소드 활용 String 클래스의 다양한 메소드를 활용하는 예를 보여라. - 426 -
-예제 실행 과정 6.1.37 StringBuffer 클래스 -java.lang.stringbuffer 스트링과 달리 객체 생성 후 스트링 값 변경 가능 append와 insert 메소드를 통해 스트링 조작 StringBuffer 객체의 크기는 스트링 길이에 따라 가변적 -생성자 표 6.6 생성자 설명 StringBuffer() 문자를 포함하고 있지 않고 초기 크기가 16인 스트링 버퍼 생성 StringBuffer(charSequenceseq)seq가지정하는 일련의 문자들을 포함하는 스트링 버퍼 생성 StringBuffer(int capacity) 문자를 포함하고 있지 않고 지정된초기 크기를 갖는 스트링 버퍼 생성 StringBuffer(String str) 지정된 스트링으로 초기화된 스트링 버퍼 생성 6.1.38 주요 메소드 메소드 표 6.7 설명 StringBuffer append(string str) 지정된 스트링을스트링 버퍼에 덧붙인다. - 427 -
StringBuffer append(stringbuffersb) int capacity() StringBuffer delete(int start, int end) StringBuffer insert(int offset, String str) StringBuffer replace(int start, int end, String str) StringBuffer reverse() voidsetlength() 지정된스트링 버퍼를 스트링 버퍼에 덧붙인다. 현재 스트링 버퍼의 크기 반환 지정된서브 스트링을스트링 버퍼에서 제거 지정된스트링을스트링 버퍼의 특정 위치에 삽입 스트링버퍼 내의 서브 스트링을 지정된 스트링으 로 대치 스트링 버퍼 내의 문자들을 반대 순서로 변경 스트링버퍼 내 저장된 문자열 길이를 설정. 현재 길이보다 큰 경우 널 문자로 채우며 작은 경우는 문자열이 잘린다. 6.1.39 StringBuffer의 메소드 활용 예 -예제 6-5 : StringBuffer 클래스 메소드 활용 StringBuffer 클래스의 메소드를 이용하여 문자열을 조작하는 예를 보여라. - 428 -
6.1.40 StringTokenizer 클래스 -java.util.stringtokenizer 하나의 스트링을 구분자로 분리하여 토큰 형태로 파싱 스트링을 구분할 때 사용되는 문자들을 구분 문자(delimeter)라고 함 -위의 예에서 & 가 구분 문자 -토큰(token) 구분 문자로 분리된 스트링 -String 클래스의 split 메소드를 이용하여 동일한 구현 가능 6.1.41 생성자와 주요 메소드 -생성자 표 6.8 생성자 설명 StringTokenizer(String str) StringTokenizer(String str, String delim) StringTokenizer(String str, String delim, booleanreturndelims) 지정된 스트링으로 초기화된 스트링토크나이저 생성 지정된 스트링과 구분 문자로 초기화된 스트링토 크나이저 생성 지정된 스트링과 구분 문자로 초기화된 스트링토 크나이저 생성. returndelims가 true이면 구분 문자로 지정된 문자도 분리된 토큰에 포함된다. - 429 -
-주요 메소드 메소드 intcounttokens() booleanhasmoretokens() String nexttoken() StringnextToken(String delim) 표 6.9 설명 스트링에남아 토큰 수 반환 스트링에 토큰이 남아 있으면 true 반환 다음 토큰 반환 지정된분리자에 대한 다음 토큰 반환 6.1.42 StringTokenizer 객체 생성과 문자열 파싱 -예제 6-6 : StringTokenizer 클래스 메소드 활용 홍길동/장화/홍련/콩쥐/팥쥐 문자열을 / 를 구분 문자로 하여 토큰을 분리하여 각 토큰을 출력하라. - 430 -
6.1.43 Math 클래스 -java.lang.math 기본적인 산술 연산을 수행하는 메소드 제공 모든 멤버 메소드는 static으로 정의됨 객체를 만들어서 사용할 필요 없음 6.1.44 주요 메소드 double 타입에 대한 주요 메소드 메소드 static doubleabs(double a) static double cos(double a) static double sin(double a) static double tan(double a) static double exp(double a) static double ceil(double a) static double floor(double a) 표 6.10 설명 절대값 반환 cosine 값 반환 sine 값 반환 tangent값 반환 값 반환 지정된실수보다 크거나 같은 수 중에서 가장 작은 정수를 실수 타입으로 반환 지정된실수보다 작거나 같은 수 중에서 가장 큰 정 수를 실수 타입으로 반환 static double max(double a, double b)두 수 중에서 큰 수 반환 static double min(double a, double b) 두 수 중에서 작은 수 반환 static double random() static double rint(double a) static double round(double a) static double sqrt(double a) 0.0보다 크거나 같고 1.0보다 작은 임의의 수 반환 지정된 실수와 가장근접한 정수를 실수 타입으로 반환 지정된 실수를 소수 첫째 자리에서 반올림한 정수 를 실수 타입으로 반환 제곱근을 반환 6.1.45 Math 클래스를 활용한 난수 발생 -난수 발생 static double random() 0.0 이상 1.0 미만의 임의의 double 값을 반환. - 431 -
위의 코드에서 round() 메소드는 Math. round(55.3)은 55.0을 리턴하며, Math. round(55.9)는 56.0을 리턴 -java.util의 Random 클래스를 이용하면 좀 더 다양한 형태로 난수 발생 가능 -예제 6-7 : Math 클래스 메소드 활용 Math 클래스의 다양한 메소드 활용 예를 보여라. 제7장 입출력 스트림 7.1 스트림 7.1.1. 스트림이란? 데이터의 흐름 입출력 스트림은 입출력 장치와 프로그램 사이의 일련의 데이터 흐름을 의미 스트림을 통해 흘러가는 데이터의 기본 단위는 바이트 그림 7.1 -스트림의 특징 스트림은 단방향이다. 방향에 따라 입력 스트림과 출력 스트림으로 나뉜다. - 432 -
스트림은 선입선출, 즉 FIFO 구조이다. 스트림은 연결될 수 있다. 스트림은 지연될 수 있다. 입력 스트림이 흐르는 통로인 파이프가 비어 있다면, 컴퓨터는 읽어갈 데이터가 없으므 로 기다리게 되고, 반대로 출력 스트림이 흐르는 통로인 파이프에 데이터가 꽉 차 있다 면 컴퓨터는 빈 공간이 생길 때까지 기다린다. 그림 7.2 7.1.2 바이트 스트림 클래스 계층 구조 7.1.3 문자 스트림 클래스 계층 구조 - 433 -
7.1.4 바이트 스트림 -바이트 스트림 바이트 단위의 바이너리 값을 읽고 쓰는 스트림 모든 바이트 스트림은 InputStream과 OutputStream의 서브 클래스 -바이트 스트림 클래스 InputStream/OutputStream java.io 패키지에 포함 추상 클래스로서 바이트 입출력 스트림을 나타내는 모든 클래스의 수퍼 클래스 FileInputStream/FileOutputStream 파일로부터 바이트 데이터를 읽거나 파일로 저장하는 클래스 바이너리 데이터인 raw 데이터의 입출력. DataInputStream/DataOutputStream 자바의 기본 데이터 타입의 값을 바이너리 값으로 입출력 String을 바이너리 값으로 입출력 7.1.5 FileInputStream 사용 예 -c:\test.txt 파일로부터 바이트 단위로 읽을 수 있는 바이트 스트림 생성 -파일 전체를 읽어 화면에 출력 -예제 7-1 : System.ini 파일을 읽어 화면에 출력하기 FileInputStream을 이용하여 사용자 컴퓨터의 windows 디렉터리에 있는 System.ini 파 일을 읽고 화면에 출력하라. System.ini 파일은 텍스트 파일이다. - 434 -
7.1.6 FileOutputStream을 이용한 파일 출력 스트림 -c:\test.out 파일에 바이트 단위로 쓸 수 있는 바이트 스트림을 생성 코드 -파일에 데이터 기록 -c:\test.out 파일에 기록된 내용 -예제 7-2 : FileOutputStream과 DataOutputStream을 이용한 파일 출력 DataOutputStream을 이용하여 자바 기본 데이터 타입 값을 tmp.out 파일에 저장하고 파 일의 내부를 살펴보라. -예제 실행 결과 - 출력 파일의 내용 출력된 tmp.out 파일은 텍스트 파일이 아니므로 바이너리로 파일을 열어 16진수 형식으 로 보면 다음과 같다. -예제 7-3 : FileInputStream과 DataInputStream을 이용하여 파일로부터 기본 데이터 타 - 435 -
입 읽기 DataInputStream을 이용하여 앞의 예제에서 만든 tmp.out 파일을 읽어 값을 화면에 출 력하고 앞 예제에서 기록된 대로 읽혀졌는지 확인하라. 7.1.7 문자 스트림 -문자 스트림 유니 코드로 된 문자 단위의 데이터가 흐르는 스트림 로컬 문자 집합으로 데이터를 자동 변환 모든 문자 스트림은 Reader과 Writer의 서브 클래스이다. -바이트 스트림과 차이점 바이트 스트림은 이미지 파일, 동영상 파일 등과 같은 바이너리 데이터 스트림 처리에 적합 문자 스트림은 문자 데이터 스트림만 처리할 수 있다. -문자 입력 스트림의 종류 Reader, InputStreamReader, FileReader 등 -문자 출력 스트림의 종류 Writer, OutputStreamWriter, FileWriter 등 -문자 스트림의 종류 Reader/Writer java.io 패키지에 포함 추상 클래스로 문자 입출력 스트림을 나타내는 모든 클래스의 수퍼 클래스 InputStreamReader/OutputStreamWriter 바이트 스트림과 문자 스트림을 연결시켜주는 브릿지 역할 지정된 문자집합을 이용하여 입력 스트림에서 바이트를 읽어 문자로 인코드 또는 문자 를 바이트로 디코드하여 출력 스트림으로 출력 FileReader/FileWriter 텍스트 파일로 문자 데이터를 입출력 한다. - 436 -
FileInputStream과 FileOutputStream을 이용하여 바이트 스트림을 문자 스트림으로 변환 -예제 7-4 : System.ini 파일 읽기 FileReader를 이용하여 사용자 컴퓨터의 windows 디렉터리에 있는 System.ini 파일을 읽고 화면에 출력하라. System.ini 파일은 텍스트 파일이다. -예제 7-5 : 문자 집합 지정이 잘못된 한글 파일 읽기 InputStreamReader의 문자 집합을 US-ASCII로 지정하여 한글 파일을 읽고 출력하라. 그림 7.3-437 -
-예제 7-6 : 한글 파일 읽기 예제 7-5의 인코딩을 수정하여 정상적으로 한글 파일을 읽고 출력하라 7.1.8 FileWriter 사용 예 -c:\test.txt 파일에 문자 출력 스트림을 생성하는 코드 -파일에 문자 출력 -예제 7-7 : 키보드 입력을 파일로 저장하기 키보드에서 입력받은 데이터를 c:\temp\test.txt 파일에 저장하는 코드를 작성하라. - 438 -
7.1.9 버퍼 입출력 스트림과 버퍼 입출력의 특징 -버퍼 입출력(Buffered I/O)이란? 버퍼 입출력은 입출력 장치와 프로그램 사이에 버퍼를 두어 효율적으로 입출력 처리 -버퍼 입출력의 필요성 프로그램의 실행 속도와 입출력 장치의 데이타 처리 속도의 불일치에 대해 대처하기 쉬움 그림 7.4 7.1.10 버퍼 스트림의 종류 -바이트 스트림 바이트 단위의 바이너리 데이타를 처리하는 버퍼 스트림 BufferedInputStream와 BufferedOutputStream -문자 스트림 유니코드의 문자 데이타만을 처리하는 버퍼 스트림 BufferedReader와 BufferedWriter -BufferedOutputStream 사용 예 20바이트 크기의 버퍼를 사용하고, System.out 표준 스트림에 출력하는 버퍼 스트림 생성 파일 전체를 읽어 화면에 출력 버퍼에 남아 있는 데이터 출력 - 439 -
-예제 7-8 : 버퍼 출력 이용 예제 버퍼 크기가 5인 출력 버퍼 스트림을 표준 출력 스트림과 연결하고 키보드에서 입력받은 문자를 출력 스트림에 출력하고, 입력의 끝을 알리면 버퍼에 남아 있는 모든 문자를 출력하 는 프로그램을 작성하라. 7.1.11 File 클래스 -File 클래스의 특징 파일의 경로명을 다루는 클래스 File 클래스는 파일과 디렉터리 경로명의 추상적 표현 파일 클래스의 객체는 파일 또는 디렉터리를 다룸 File 클래스는 파일의 삭제, 디렉터리 생성 등과 같은 파일 관리 파일의 내용 읽고 쓰기 - 파일 스트림 이용 File 객체와 스트림을 연결하여 파일 접근 7.1.12 File 클래스 생성자와 주요 메소드 표 7.1-440 -
7.1.13 File 클래스 사용 예 -c:\test.txt 파일을 나타내는 File 객체를 생성 -파일 관리 파일 타입 구분하기, isfile()과 isdirectory() 디렉터리에 있는 파일 리스트 얻기, list() -예제 7-9 : File 클래스 활용한 파일 관리 File 클래스를 이용하여 파일의 타입을 알아내고, 디렉터리에 있는 파일들을 나열하며, 디 렉터리 이름을 변경하는 프로그램을 작성해보자. - 441 -
-예제 7-10 : 텍스트 파일 복사 문자 스트림을 이용하여 텍스트 파일을 복사하는 프로그램을 작성하라 그림 7.5 -예제 7-11 : 바이너리 파일 복사 바이트 스트림을 이용하여 바이너리 파일을 복사하는 프로그램을 작성하라 그림 7.6 제8장 제네릭과 컬렉션 8.1 컬렉션(collection)의 개념 - 442 -
8.1.1 컬렉션 -컬렉션은 요소(element)라고 불리는 가변 개수의 객체들의 모음 객체들의 컨테이너라고도 불림 -컬렉션 클래스 사례 Vector, ArrayList, Hashtable, LinkedList, HashMap, HashSet, Stack -java.util 패키지에서 제공 -다양한 객체들을 삽입, 삭제, 검색 등 관리하는데 사용됨 8.1.2 배열과 컬렉션의 개념 차이 그림 8.1 8.1.3 컬렉션을 위한 인터페이스와 클래스 그림 8.2 8.1.4 Vector 클래스 -Vector의 특성 java.util.vector 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스 - 443 -
배열의 길이 제한 단점 극복 원소의 개수가 넘쳐나면 자동으로 늘어나는 가변 길이 Vector에 삽입 가능한 것 객체만 가능 null도 삽입 가능 기본 데이터 타입은 불가능 -Wrapper 객체로 만들어 삽입 가능 Vector에 객체 삽입 벡터의 맨 뒤에 객체 추가 : 공간이 모자라면 자동 늘림 벡터 중간에 객체 삽입 : 삽입된 뒤의 객체는 뒤로 하나씩 이동 Vector에서 객체 삭제 임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 하나씩 앞으로 자동 이동 8.1.5 Vector 객체의 내부 구성 그림 8.3 8.1.6 Vector 클래스의 주요 메소드 표 8.1 메소드 설명 boolean add(e e) 벡터의 맨 뒤에 요소 추가 void add(int index, E element) 지정된 인덱스에 지정된 객체를 삽입 int capacity() 벡터의 현재 용량 반환 booleanaddall(collection<? extends E> c) c가 지정하는 컬렉션의 모든 요소를 벡터의 맨 뒤에 추가 void clear() 벡터의 모든 요소 삭제 boolean contains(object o) 벡터가 지정된 객체를 포함하고 있으면 true 반환 E elementat(int index) 지정된 인덱스의 요소 반환 E get(int index) 지정된 인덱스의 요소 반환 intindexof(object o) 지정된 객체와 같은 첫 번째 요소의 인덱스 반환. 없으면 -1 반환 booleanisempty() 벡터가 비어있으면 true 반환 E remove(int index) 지정된 인덱스의 요소 삭제 - 444 -
boolean remove(object o) void removeallelements() int size() Object[] toarray() 지정된 객체와 같은 첫 번째 요소를 벡터에서 삭제 벡터의 모든 요소를 삭제하고 크기를 0으로 만듬 벡터가 포함하는 요소의 개수 반환 벡터의 모든 요소를 포함하는 배열을 반환 그림 8.4 8.1.7 컬렉션과 자동 박싱/언박싱 -JDK 1.5 이전 버전 Wrapper 클래스를 이용하여 기본 타입을 객체로 만들어 사용 컬렉션으로부터 요소를 얻어올 때도 해당 타입의 값을 얻어오는 메소드를 호출 - 445 -
-JDK 1.5부터 자동 박싱/언박싱의 기능 추가 -예제 8-1 : 벡터 내의 모든 요소 객체 출력하기 다음 코드에 대한 결과는 무엇인가? -예제 8-2 : 벡터에 있는 객체 중에서 정수 값만 모두 더하기 벡터에 있는 객체 중에서 정수 값만 모두 더하는 프로그램을 작성해보라 - 446 -
8.1.8 ArrayList 클래스 -ArrayList의 특성 java.util.arraylist 가변 크기 배열을 구현한 클래스 ArrayList에 삽입 가능한 것 객체만 가능 기본 데이타 타입은 불가능 Wrapper 객체로 만들어 삽입 가능 null도 삽입 가능 ArrayList에 객체 삽입 리스트의 맨 뒤에 객체 추가 : 공간이 모자라면 자동 늘림 리스트의 중간에 객체 삽입 : 삽입된 뒤의 객체는 뒤로 하나씩 이동 ArrayList 에서 객체 삭제 임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 하나씩 앞으로 이동 벡터와 거의 유사하며 자동으로 스레드 동기화를 지원하지 않는 점이 가장 큰 차이 다수의 스레드가 동시에 ArrayList에 접근할 때 ArrayList는 동기화시키지 않음 ArrayList에 접근하는 곧에서 스레드 동기화를 수행하여야 함 8.1.9 ArrayList 객체의 내부 구성 그림 8.5 8.1.10 ArrayList 클래스의 주요 메소드 메소드 boolean add(e e) void add(int index, E element) 표 8.2 설명 ArrayList의 맨 뒤에 요소 추가 지정된 인덱스에 지정된 객체를 삽입 booleanaddall(collection<? E> c) void clear() boolean contains(object o) extendsc가 지정하는 컬렉션의 모든 요소를 ArrayList의 맨 뒤에 추가 ArrayList의 모든 요소 삭제 ArrayList가 지정된 객체를 포함하고 있으면 true 반환 - 447 -
E elementat(int index) E get(int index) int indexof(object o) boolean isempty() E remove(int index) boolean remove(object o) int size() Object[] toarray() 지정된 인덱스의 요소 반환 지정된 인덱스의 요소 반환 지정된 객체와 같은 첫 번째 요소의 인덱스 반환. 없으면 -1 반환 ArrayList가 비어있으면 true 반환 지정된 인덱스의 요소 삭제 지정된 객체와 같은 첫 번째 요소를 ArrayList에서 삭제 ArrayList가 포함하는 요소의 개수 반환 ArrayList의 모든 요소를 포함하는 배열을 반환 그림 8.6-448 -
-예제 8-3 : ArrayList 내의 모든 요소 객체 출력하기 다음 코드에 대한 결과는 무엇인가? 8.1.11 Hashtable 클래스 -Hashtable의 특성 java.util.hashtable 삽입 및 검색이 빠른 특징 키(key)와 값(value) 사용 키와 값이 한쌍으로 삽입됨 키는 해쉬 테이블에 삽입되는 위치를 결정하는데 내부적으로 이용 값을 검색하기 위해서는 키를 반드시 이용함 키, 값 모두 객체만이 이용됨. 기본 데이터 타입은 사용할 수 없음 -Hashtable에 삽입, 검색하는 예 8.1.12 Hashtable의 내부 구성과 put(), get() 메소드 그림 8.7-449 -
8.1.13 Hashtable 클래스의 주요 메소드 표 8.3 메소드 void clear() boolean contains(object o) booleancontainskey(object key) booleancontainsvalue(object value) Enumeration<V> elements() V get(object key) booleanisempty() Enumeration<K> keys() V put(k key, V value) V remove(object key) int size() 설명 Hashtable의 모든 키 삭제 Hashtable의 어떤 키가 지정된 객체에 매핑되면 true 반환 Hashtable이 지정된 키를 포함하고 있으면 true 반환 Hashtable이 하나 이상의 키를 지정된 값에 매핑시킬 수 있으면 true 반환 Hashtable의 모든 값의 enumeration 반환 지정된 키에 맵핑되는 값을 반환하거나 맵핑되는 값이 없 으면 null을 반환 Hashtable에 키가 없으면 true 반환 Hashtable의 모든 키의 enumeration 반환 Hashtable에 key를 value에 매핑 지정된 키와 이에 매핑된 모든 값들을 Hashtable에서 삭제 Hashtable이 포함하는 키의 개수 반환 8.1.14 해쉬테이블의 조작 사례 - 450 -
그림 8.8 -예제 8-4 : Hashtable 내의 모든 값 알아내기 다음 코드에 대한 결과는 무엇인가? -예제 8-5 : Hashtable 검색 Scanner 클래스를 이용하여 이름, 전화번호를 입력받아 이름을 키로 하여 해시테이블에 저장하고 이름으로 전화번호를 검색하는 프로그램을 작성하라. 그림 8.9-451 -
8.1.15 LinkedList 클래스 -LinkedList의 특성 java.util.linkedlist List 인터페이스를 구현한 클래스 Vector, ArrayList 클래스와 매우 유사 요소 객체들은 양방향으로 연결되어 관리됨 요소 객체는 맨 앞, 맨 뒤에 추가 가능 요소 객체는 인덱스를 이용하여 중간에 삽입 가능 맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능 8.1.16 LinkedList의 내부 구성과 put(), get() 메소드 그림 8.10 8.1.17 Iterator 활용 -Iterator 인터페이스 Vector, ArrayList, LinkedList와 같은 리스트 자료구조에서 요소를 순차적으로 검색할 때 Iterator 인터페이스를 사용 iterator() 메소드를 호출하면 Iterator 객체를 반환 Iterator 객체는 검색한 위치를 기억하고 있어 인덱스 없이 순차적 검색이 가능 Iterator 인터페이스 메소드 표 8.4 메소드 설명 booleanhasnext() 다음 반복에서 사용될 요소가 있으면 true 반환 E next() 다음 요소 반환 void remove() 마지막으로 반환된 요소를 제거 - 452 -
-예제 8-6 : Iterator를 이용하여 ArrayList 내의 모든 요소 객체 출력하기 다음 코드에 대한 결과는 무엇인가? 8.1.18 Collections 클래스 활용 -Collections 클래스 java.util 패키지에 포함 컬렉션에 대해 연산을 수행하고 결과로 컬렉션을 반환 주요 메소드 컬렉션에 포함된 요소들을 소팅하는 sort() 메소드 요소의 순서를 반대로 하는 reverse() 메소드 요소들의 최대, 최소값을 찾아내는 max(), min() 메소드 특정 값을 검색하는 binarysearch() 메소드 모두 static 메소드 -예제 8-7 : Collections 클래스의 활용 Collections를 사용한 다음 코드에 대한 결과는 무엇인가? - 453 -
8.1.19 JDK 1.5 이전 자바의 컬렉션 문제점 -삽입되는 원소 객체는 사실 모두 Object 타입이어야 함 int, double 등의 기본 타입 데이타는 직접 삽입될 수 없음 -객체를 컬렉션에서 꺼내올 때 다운 캐스팅 필요 Object 타입에서 실제 클래스 타입으로의 다운 캐스팅 불편 8.1.20 JDK 1.5 이전 버전의 Vector 클래스의 예 -JDK 1.5 이전 버전의 Vector 클래스 예제 http://download.oracle.com/javase/1.4.2/docs/api/java/util/vector.html참조 제네릭 도입 이전에는 Object 클래스를 이용하여 모든 객체들을 참조 JDK 1.5이전 Vector는 Object를 요소로 받아 들임 3번 행의 다운 캐스팅이 반드시 필요하며 이 부분이 문제를 발생시킨다. 컴파일러는 elementat이 Object 타입을 반환할 것이라는 밖에는 알지 못하므로 프로그래 머가 명시적으로 타입을 지정하여야 한다. 규모가 큰 프로그램의 작성 시 프로그래머가 타입을 실수로 잘못 지정하는 경우에는 런타 임에 ClassCastException이 발생 제네릭을 이용하면 컴파일러가 요소의 타입을 알 수 있어 타입 불일치를 방지 8.1.21 제네릭의 기본 개념 -제네릭 디자인 패턴의 매개 변수화된 타입과 메소드(parameterized type and method)를 의미 JDK 1.5부터 도입 컬렉션은 다양한 타입의 객체들을 하나로 모아서 관리하므로 제네릭으로 정의되어 있음 - 454 -
8.1.22 제네릭 Vector를 설명하는 자바 API 그림 8.11 8.1.23 제네릭 컬렉션 사용하기 -제네릭 Vector 클래스 벡터는 일반 배열과는 달리 크기가 가변적인 객체의 배열을 구현 배열의 원소는 객체만 허용 기본 데이터 타입은 원소가 될 수 없음 add, remove, indexof, size, Iterator 등 메소드 이용하여 관리 -제네릭 Vector 사용하기 제네릭 Vector의 생성 제네릭 벡터에 요소 삽입 제네릭 벡터에서 요소 얻기 생성할 때 지정한 타입이 아닌 타입은 삽입 불가 - 455 -
-예제 8-8 : 제네릭 Vector 사용하기 다음 코드에 대한 결과는 무엇인가? -예제 8-9 : 제네릭 타입을 두 개 가진 제네릭 Hashtable 사용하기 다음 코드에 대한 결과는 무엇인가? 8.1.24 제네릭 클래스와 인터페이스 선언 - 456 -
-제네릭 클래스 작성 예 일반화된 타입(generic type) 매개 변수 T를 가진 MyClass 작성된 MyClass 타입 객체 생성 예 8.1.25 타입 매개 변수 -타입 매개 변수 < 과 > 사이의 문자로 표현 하나의 대문자를 타입 매개 변수로 사용 많이 사용하는 타입 매개 변수 문자 E : Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용한다. T : Type을 의미한다. V : Value를 의미한다. K : Key를 의미 타입 매개변수가 나타내는 타입의 객체 생성 불가 ex) T a = new T(); 타입 매개 변수는 나중에 실제 타입으로 대체 된다. 어떤 문자도 매개 변수로 사용될 수 있다. 8.1.26 제네릭 클래스, 인터페이스 사용 -변수 선언 제네릭 클래스 또는 인터페이스 타입 변수를 선언할 때는 타입 매개 변수에 실제 타입을 기입 -객체 생성 제네릭 클래스 객체를 생성할 때도 타입 매개 변수에 실제 타입을 기입 - 457 -
-예제 8-10 : 스택 스택 자료 구조를 제네릭 클래스로 선언하고, String과 Integer형 스택을 사용하는 예를 보여라. 8.1.27 제네릭과 배열 -제네릭에서 배열의 제한 -제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음 -타입 매개 변수가 나타내는 타입의 배열을 생성하는 것도 허용되지 않음 앞 예제에서는 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐스팅 -타입 매개변수가 나타내는 타입의 배열 선언은 허용 8.1.28 제네릭 메소드 -제네릭 메소드 정의 메소드에서도 타입 매개 변수를 이용하여 제네릭 메소드 정의 가능 - 458 -
제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므 로 타입을 명시하지 않아도 됨 sa는 String[], gss는 GStack<String> 타입이므로 T를 String으로 유추 -예제 8-11 : 스택의 내용을 반대로 만드는 제네릭 메소드 만들기 예제 8-10의 GStack을 이용하여 주어진 스택의 내용을 반대로 만드는 제네릭 메소드 reverse()를 작성하라. 8.1.29 제네릭의 장점 -컬렉션과 같은 컨테이너 클래스에 유연성을 해치지 않으며 type-awareness를 첨가 -메소드에 type-awareness 첨가 -컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍 가능 -개발 시 다운캐스팅(타입 캐스팅) 절차 불필요 -런타임 타입 충돌 문제 방지 -ClassCastException 방지 제9장 자바의 GUI, AWT와 Swing 9.1 자바의 GUI(Graphic User Interface) 1. GUI 목적 -GUI 목적 그래픽 이용, 사용자에게 이해하기 쉬운 모양으로 정보 제공 사용자는 마우스나 키보드를 이용하여 쉽게 입력 -자바 GUI 특징 강력한 GUI 컴포넌트 제공 쉬운 GUI 프로그래밍 - 459 -
-자바의 GUI 프로그래밍 방법 GUI 컴포넌트 이용 AWT 패키지와 Swing 패키지 AWT -java.awt 패키지 Swing -javax.swing 패키지 2. 스윙 컴포넌트 예시 그림 9.1 그림 9.2-460 -
그림 9.3 그림 9.4-461 -
3. Swing 으로 만든 GUI 프로그램 샘플 마우스를 올리면 컴포넌트 타입(예:JButton)을 표시 그림 9.5 4. AWT와 Swing 패키지 -AWT(Abstract Windowing Toolkit) 자바가 처음 나왔을 때 함께 배포된 GUI 라이브러리 GUI 클래스 패키지 - java.awt 패키지 Native 운영체제와 응용프로그램 사이의 연결 라이브러리 중량 컴포넌트(Heavy weight components) -AWT 컴포넌트는 native(peer)에 의존적임 -OS의 도움을 받아야 화면에 출력되며 동작하는 컴포넌트. 운영체제에 많은 부담. 오 히려 처리 속도는 빠름 -Swing(스윙) AWT 기술을 기반으로 작성된 자바 라이브러리 모든 AWT 기능 + 추가된 풍부하고 화려한 고급 컴포넌트 AWT 컴포넌트에 J자가 덧붙여진 이름의 클래스 J 자로 시작하는 클래스 순수한 자바 언어로 구현, JDK 1.1 부터 - javax.swing 패키지 Swing 컴포넌트는 native(peer)에 의존하지 않음 경량 컴포넌트(Light weight components) 5. GUI 라이브러리 계층 구조 - 462 -
그림 9.6 6. Swing 클래스의 특징 -클래스명 J 자로 시작 -화려하고 다양한 컴포넌트로 쉽게 GUI 프로그래밍 -스윙 컴포넌트는 2 가지 유형 JComponent는 상속받는 클래스 AWT의 Container를 상속받는 클래스 JApplet, JDialog, JFrame 등 -JComponent 매우 중요한 추상 클래스 스윙 컴포넌트의 공통적인 속성 구현 new JComponent() 인스턴스를 생성할 수 없음 AWT의 Component를 상속받음 7. 컨테이너와 컴포넌트 -컨테이너 다른 컴포넌트를 포함할 수 있는 GUI 컴포넌트 java.awt.container를 상속받아야 함 컨테이너 객체는 다른 컨테이너에 포함될 수 있는 컴포넌트 AWT 컨테이너 -Panel, Frame, Applet, Dialog, Window Swing 컨테이너 -JPanel JFrame, JApplet, JDialog, JWindow - 463 -
-최상위 컨테이너 다른 컨테이너에 속하지 않고도 독립적으로 존재하고 화면에 출력가능한 컨테이너 JFrame, JDialog, JApplet -컴포넌트 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI 객체 모든 GUI 컴포넌트의 최상위 클래스 java.awt.component 스윙 컴포넌트의 최상위 클래스 javax.swing.jcomponent 8. 컨테이너와 컴포넌트의 포함관계 그림 9.7 9. 스윙 GUI 프로그램 만들기 1. 프레임 만들기 2. 프레임에 스윙 컴포넌트 붙이기 3. main() 함수 만들기 -스윙 프로그램을 작성하기 위한 import문 import java.awt.*; // 그래픽 처리를 위한 클래스들의 경로명 import java.awt.event.*; // AWT 이벤트 사용을 위한 경로명 import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명 import javax.swing.event.*; // 스윙 이벤트를 위한 경로명 10. 스윙 프레임 -모든 스윙 컴포넌트를 담는 최상위 GUI 컨테이너 JFrame -하나의 스윙 응용프로그램에 하나의 프레임 존재 -프레임이 닫히면 프레임 내의 모든 컴포넌트도 사멸 - 464 -
화면에서 사라짐 -스윙 프레임(JFrame) 기본 구성 그림 9.8 11. 프레임 만들기 그림 9.9-465 -
12. main()의 위치 그림 9.10 13. 프레임에 컴포넌트 붙이기 -타이틀 - 프레임 영역의 타이틀 바에 부착 -메뉴 - 메뉴바 공간, 14장에서 다룸 -스윙 컴포넌트 - 컨텐트팬(Content Pane)에 부착 컨텐트팬 알아내기 컨텐트팬에 컴포넌트 달기 컨텐트팬 변경 - 466 -
-예제 9-1 : 컴포넌트를 부착한 프레임 예 그림 9.11 14. 스윙 응용프로그램의 종료 -프로그램에서 무조건 종료 언제 어디서나 프로그램 종료 -프레임 종료버튼(X) 클릭시 발생하는 현상 프레임을 종료하여 프레임 윈도우가 닫히게 됨. 화면에서 보이지 않게 됨 프로그램이 종료되지는 않음 -프레임 종료버튼 클릭시 프로그램이 종료 되게 하는 방법 프레임이 닫히면 자동으로 자바 프로그램도 함께 종료된다. 15. main() 메소드 종료 뒤에도 프레임이 살아 있는 이유? -main() 메소드를 실행하는 스레드 메인스레드(main 스레드) -스윙 프로그램의 생명 사이클 - 467 -
메인 스레드외에 다른 스레드가 생성되어 살아 있으면 메인 스레드가 종료되어도 자바 응 용프로그램은 종료되지 않음 -스윙 응용프로그램이 실행되면 자동으로 이벤트 처리 스레드가 보이지 않게 실행됨 메인 스레드가 종료해도 스윙 응용프로그램이 종료되지 않음 16. 컨테이너와 배치 개념 그림 9.12 17. 배치 관리자 대표 유형 4 가지 -java.awt 패키지에 구현되어 있음 그림 9.13-468 -
18. 컨테이너와 배치관리자 -컨테이너의 디폴트 배치관리자 컨테이너는 생성시 디폴트 배치관리자 설정 표 9.1 AWT와 스윙의 컨테이너 디폴트 배치관리자 Window BorderLayout Frame, JFrame BorderLayout Dialog, JDialog BorderLayout Panel, JPanel FlowLayout Applet, JApplet FlowLayout -컨테이너에 새로운 배치관리자 설정 Container.setLayout(LayoutManager lm) lm을 Container의 새로운 배치관리자로 설정 19. FlowLayout -배치방법 컨테이너 공간 내에 왼쪽에서 오른쪽으로 배치 다시 위에서 아래로 순서대로 컴포넌트를 배치한다. 그림 9.14-469 -
-컨테이너의 크기가 변하면 재배치 그림 9.15 20. FlowLayout - 생성자와 속성 -생성자 FlowLayout() FlowLayout(int align) FlowLayout(int align, int hgap, int vgap) align : 컴포넌트의 정렬(5 가지중 많이 사용되는 3 가지) -FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER(디폴트) hgap : 좌우 두 컴포넌트 사이의 수평 간격, 픽셀 단위(디폴트 : 5) vgap : 상하 두 컴포넌트 사이의 수직 간격, 픽셀 단위(디폴트 : 5) 그림 9.16-470 -
-예제 9-2 : LEFT로 정렬되는 수평 간격이 30 픽셀, 수직 간격이 40 픽셀인 FlowLayout 사용 예 그림 9.17 21. BorderLayout -배치방법 컨테이너 공간을 5 구역으로 분할, 배치 East, West, South, North, Center 배치 방법 add(component comp, int index) -comp를 index의 공간에 배치 -index BorderLayout.EAST, BorderLayout.WEST, BorderLayout.SOUTH, BorderLayout.NORTH, BorderLayout.CENTER, 컨테이너의 크기가 변하면 재배치 그림 9.18 22. BorderLayout 생성자와 속성 -생성자 BorderLayout() BorderLayout(int hgap, int vgap) hgap : 좌우 두 컴포넌트 사이의 수평 간격, 픽셀 단위(디폴트 : 0) - 471 -
vgap : 상하 두 컴포넌트 사이의 수직 간격, 픽셀 단위(디폴트 : 0) -BorderLayout의 사용예 그림 9.19 -예제 9-3 : BorderLayout 사용 예 그림 9.20 23. GridLayout -배치방법 - 472 -
컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 하나의 컴포넌트 배치 격자 구성은 생성자에서 행수와 열수로 지정 셀에 왼쪽에서 오른쪽으로, 다시 위에서 아래로 순서대로 배치 그림 9.21 컨테이너의 크기가 변하면 재배치 크기 재조정 24. GridLayout 생성자와 속성 -생성자 GridLayout() GridLayout(int rows, int cols) GridLayout(int rows, int cols, int hgap, int vgap) rows : 격자의 행수 (디폴트 : 1) cols : 격자의 열수 (디폴트 : 1) hgap : 좌우 두 컴포넌트 사이의 수평 간격, 픽셀 단위(디폴트 : 0) vgap : 상하 두 컴포넌트 사이의 수직 간격, 픽셀 단위(디폴트 : 0) rows x cols 만큼의 셀을 가진 격자로 컨테이너 공간을 분할, 배치 -예제 9-4 : GridLayout으로 입력 폼 만들기 그림 9.22-473 -
25. 배치관리자 없는 컨테이너 -배치관리자가 없는 컨테이너 개념 응용프로그램에서 컴포넌트의 절대 크기와 절대 위치를 스스로 결정 -용도 컴포넌트의 크기나 위치를 개발자 임의로 결정하고자 하는 경우 게임 프로그램과 같이 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기 가 수시로 변하는 경우 여러 컴포넌트들이 서로 겹치는 효과를 연출하고자 하는 경우 -컨테이너의 배치 관리자 제거 방법 Container.setLayout(null); -컴포넌트의 크기와 위치 설정 프로그램 내에서 이루어져야 함 컴포넌트들이 서로 겹치는 효과 연출 가능 다음 메소드 이용 컴포넌트 크기 설정 : Component.setSize(int width, int height); 컴포넌트 위치 설정 : Component.setLocation(int x, int y); 컴포넌트 위치와 크기 동시 설정 : Component.setBounds(int x, int y, int width, int height); -예제 9-5 : 배치관리자 없는 컨테이너에 컴포넌트 위치와 크기를 절대적으로 지정 그림 9.23-474 -
제10장 이벤트 처리 10.1 이벤트 기반 프로그래밍 1.이벤트 기반 프로그래밍 -이벤트 기반 프로그래밍(Event Driven Programming) 이벤트의 발생에 의해 프로그램 흐름이 결정되는 방식 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너)이 실행하는 방식 프로그램 내의 어떤 코드가 언제 실행될 지 아무도 모름, 이벤트의 발생에 의해 전적으 로 결정 반대되는 개념 : 배치 실행(batch programming) 프로그램의 개발자가 프로그램의 흐름을 결정하는 방식 -이벤트 사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 누름 센서로부터의 입력 네트워크로부터 데이타 송수신 다른 응용프로그램이나 다른 스레드로부터의 메시지 -이벤트 기반 프로그램의 구조 프로그램에서 처리하고자 하는 이벤트의 이벤트 처리 리스너 구현 -이벤트 처리 순서 이벤트 발생(예 :마우스나 키보드의 움직임 혹은 입력) 이벤트 객체 생성 현재 발생한 이벤트에 대한 여러 정보를 가진 객체 이벤트 리스너 찾기 이벤트 리스너 호출 event 객체가 리스너에 전달됨 이벤트 리스너 실행 -이벤트의 실제 예 그림 10.1-475 -
10.1.2 자바의 이벤트 기반 GUI 응용프로그램 구성 그림 10.2 10.1.3 이벤트 객체 -이벤트 객체란? 이벤트가 발생하면 발생한 이벤트에 관한 정보를 가진 객체 이벤트 리스너에 전달됨 이벤트 리스에서 이벤트가 발생한 여러 상황을 파악할 수 있게 함 -이벤트 객체의 종류 그림 10.3-476 -
10.1.4 이벤트 객체에 포함된 정보 -이벤트 객체가 포함하는 정보 이벤트 종류 이벤트 소스 이벤트가 발생한 화면 좌표 이벤트가 발생한 컴포넌트 내 좌표 버튼이나 메뉴 아이템에 이벤트가 발생한 경우 버튼이나 메뉴 아이템의 문자열 클릭된 마우스 버튼 번호 마우스의 클릭 횟수 키가 눌러졌다면 키의 코드 값과 문자 값 체크박스, 라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크 상태 -이벤트에 따라 조금씩 다른 정보 포함 ActionEvent 객체 : 액션 문자열 MouseEvent 객체 : 마우스의 위치 정보, 마우스 버튼, 함께 눌러진 키 정보 등 ItemEvent 객체 : 아이템의 체크 상태 -이벤트 소스 알아 내기 object EventObject.getSource() 발생한 이벤트의 소스 컴포넌트를 리턴한다. Object 타입으로 리턴하므로 캐스팅하여 사용하는 것을 추천한다. 모든 이벤트 객체에서 제공됨 10.1.5 이벤트 객체의 메소드 그림 10.4-477 -
10.1.6 이벤트 객체와 이벤트 소스 표 10.1 이벤트 객체 이벤트 소스 이벤트가 발생하는 경우 JButton 마우스로 버튼을 클릭하거나 키로 버튼을 선택한 경우 ActionEvent JList JMenuItem 리스트 아이템을 더블클릭하여 리스트 아이템을 선택한 경우 메뉴 아이템 선택을 선택한 경우 JTextField 텍스트 입력 중 <Enter> 키를 누른 경우 JCheckBox 체크박스의 선택 혹은 해제 ItemEvent JCheckBoxMenu 체크박스 메뉴 아이템이 선택 혹은해제 될 때 Item JList 리스트 아이템이 선택될 때 KeyEvent Component 모든 컴포넌트에 대해, 키가 눌러지거나 눌러진 키가 떼어질 때 MouseEvent Component 모든 컴포넌트에 대해, 마우스 버튼이 눌러지거나 떼어질 때, 클 릭될 때, 컴포넌트 위에 마우스가 올라갈 때, 올라간 마우스가 내 려올 때, 마우스가 드래그될 때, 마우스가 단순 움직일 때 FocusEvent Component 모든 컴포넌트에 대해, 컴포넌트가 포커스를 받거나 잃을 때 TextEvent TextField TextArea 텍스트가 변경될 때 텍스트가 변경될 때 WindowEvent Window AdjustmentEven JScrollBar t ComponentEven Component t ContainerEvent Container Window를 상속받는 모든 컴포넌트에 대해, 윈도우가 활성화,비 활성화, 아이콘화, 아이콘에서 복구 될 때, 윈도우가 열리거나 닫 힐 때, 윈도우가 종료될 때 등 스크롤바를 사용자가 움직였을 때 모든 컴포넌트에 대해, 컴포넌트가 사라지거나, 나타나거나, 이동 하거나 크기 변경 될 때 Container에 컴포넌트가 추가 혹은 삭제되었을 때 10.1.7 이벤트 리스너(Event Listener) -이벤트 리스너란? 이벤트를 처리하는 핸들러 - 478 -
-이벤트 리스너는 인터페이스(interface)이다. 개발자가 리스너 인터페이스의 모든 추상 메소드 구현 필요 이벤트가 발생하면 이미 약속된 메소드 호출 예) ActionListener 인터페이스 예) MouseListener 인터페이스 10.1.8 이벤트 리스너 등록 -이벤트 리스너 등록 이벤트를 받아 처리하고자 하는 컴포넌트에 이벤트 리스너 등록 -이벤트 리스너 등록시 사용되는 메소드 Component.addXXXListener(listener) xxx : 이벤트 명 listener : 이벤트 리스너 객체 예) addmouselistener(), addactionlistener(), addfocuslistener() 등 이벤트 리스너가 등록된 컴포넌트에만 이벤트 처리 가능 10.1.9 리스너 인터페이스와 메소드 표 10.2 리스너인터페이스 리스너메소드 메소드가호출되는경우 ActionListener actionperformed(actionevent) ActionEvent가발생하는경우 ItemListener itemstatechanged(itemevent) ItemEvent 가발생하는경우 KeyListener MouseListener keypressed(keyevent) keyreleased(keyevent) keytyped(keyevent) mousepressed(mouseevent) mousereleased(mouseevent) mouseclicked(mouseevent) mouseentered(mouseevent) mouseexited(mouseevent) 키가눌러질때 눌러진키가떼어질때 키가입력될때 마우스버튼이눌러질때 눌러진마우스버튼이떼어질때 마우스클릭될때 마우스가임의의컴포넌트위에올라올때 컴포넌트에올라온마우스가컴포넌트를벗어날때 MouseMotionListener mousedragged(mouseevent) 마우스를임의의컴포넌트위에서드래깅할때 - 479 -
mousemoved(mouseevent) 마우스를임의의컴포넌트위에서움직일때 FocusListener focusgained(focusevent) 컴포넌트가포커스를받을때 focuslost(focusevent) 컴포넌트가포커스를잃을때 TextListener textvaluechanged(textevent) 텍스트가변경될떄 windowopened(windowevent) 윈도우가생성되어처음으로보이게될때 windowclosing(windowevent) 사용자가윈도우의시스템메뉴에서윈도우닫기 를시도할때 WindowListener windowiconfied(windowevent) 윈도우가보통크기에서아이콘화될때 windowdeiconfied(windowevent) 아이콘상태의윈도우가가보통상태로복귀할때 windowclosed(windowevent) 윈도우닫기절차에의해윈도우가닫혀졌을때 windowactivated(windowevent) 윈도우가활성화윈도우로설정되어활성화될때 windowdeactivated(windowevent) 활성화상태의윈도우가비활성화될때 AdjustmentListener adjustmentvaluechanged(adjustmentevent) 스크롤바를움직였을때 componenthidden(componentevent) 컴포넌트가보이지않는상태로될때 componentshown(componentevent) 컴포넌트가보이는상태로될때 ComponentListener componentresized(componentevent) 컴포넌트의크기가변경될때 compnentmoved(componentevent) 컴포넌트의위치가변경될때 ContainerListener componentadded(containerevent) componentremoved(containerevent) 컴포넌트가컨테이너에추가될때 컴포넌트가컨테이너에서삭제될때 10.1.10 이벤트 리스너작성 예 그림 10.5-480 -
-예제 10-1 : 버튼에 Mouse이벤트를 처리하는 예제 그림 10.6 10.1.11 Tip : 리스너 등록 메소드가 addxxxlistener인 이유? -한 컴포넌트는 서로 다른 이벤트에 대한 리스너를 동시에 여러개 가질 수 있다. JButton.addActionListener(); // Action 리스너 JButton.addKeyListener(); // Key 리스너 JButton.addFocusListener(); // Focus 리스너 -한 컴포넌트는 한 이벤트에 대해 여러 개의 리스너를 동시에 가질 수 있다. JButton.addActionListener(new MyButtonListener1()); JButton.addActionListener(new MyButtonListener2()); JButton.addActionListener(new MyButtonListener3()); 이때, 리스너는 등록된 반대 순으로 모두 실행된다. 10.1.12 이벤트 리스너 작성 방법 -3 가지 방법 독립 클래스로 작성 이벤트 리스너를 완전한 클래스로 작성 내부 클래스(inner class)로 작성 익명 클래스(anonymous class)로 작성 - 481 -
10.1.13 독립 클래스로 리스너 작성 그림 10.7 10.1.14 내부 클래스로 리스너 작성 그림 10.8-482 -
10.1.15 익명 클래스로 이벤트 리스너 작성 -익명 클래스란? (클래스 정의 + 인스턴스 생성)을 한번에 작성 ActionListener를 구현하는 익명의 이벤트 리스너 작성 예 -예제 10-2 : 마우스로 문자열 이동시키기 마우스 버튼을 누르면 마우스가 있는 위치로 hello 문자열을 이동시킨다. 이벤트와 리스너 : MouseEvent와 MouseListener 이벤트 소스 : JPanel 구현할 리스너의 메소드 : mousepressed() 하나 - 483 -
hello 문자열 표현 : JLabel 컨텐트 팬 : JPanel로 교체, 배치관리자 null로 설정 그림 10.9 -예제 10-2의 소스 10.1.16 어댑터(Adapter) 클래스 -이벤트 리스너 구현에 따른 부담 리스너의 추상 메소드들을 모두 구현하여야 하는 부담 마우스 리스너에서 마우스가 눌러지는 경우(mousePressed())만 다루고자 하는 경우에 도 나머지 4 개의 메소드도 모두 구현하여야 함. -어댑터 클래스 JDK에서 제공 이벤트 리스너를 간단히 구현해 놓은 클래스 - 484 -
리스너의 모든 메소드가 단순 리턴하도록 구현됨 MouseAdapter 예 메소드를 하나만 가진 리스너는 해당 어댑터가 존재하지 않음 ActionAdapter, ItemAdapter 등은 존재하지 않음 10.1.17 리스너와 어댑터 클래스 표 10.3 리스너 인터페이스 ActionListener ItemListener KeyListener MouseListener MouseMotionListener FocusListener TextListener WindowListener AdjustmentListener ComponentListener ContainerListener 어댑터 클래스 없음 없음 KeyAdapter MouseAdapter MouseMotionAdapter FocusAdapter 없음 WindowAdapter 없음 ComponentAdapter ContainerAdapter 10.1.18 어댑터 사용 예 - 485 -
-예제 10-3: MouseAdapter 사용하기 10.1.19 Key 이벤트와 포커스 -키 이벤트는 키를 입력하는 다음 3 경우에 발생 키를 누르는 순간 누른 키를 떼는 순간 누른 키를 떼는 순간 + Unicode 키가 입력된 경우 -키 이벤트를 받을 수 있는 조건 키가 발생한 컴포넌트가 포커스를 가지고 있어야 함 -포커스 키 이벤트를 독점하는 권한 컴포넌트에 포커스 설정 방법 component.requestfocus(); // component가 키 이벤트를 받을 수 있게 함 -모든 컴포넌트에 대해 사용자는 키 입력 가능 키 이벤트는 모든 컴포넌트에 기본적으로 발생 가능 10.1.20 KeyListener의 메소드와 키 -KeyListener의 3 개의 메소드 그림 10.10-486 -
-컴포넌트에 키 이벤트 리스너 등록 10.1.21 유니코드(Unicode) -유니코드 키의 특징 국제 산업 표준 전 세계의 문자를 컴퓨터에서 일관되게 표현하기 위한 코드 체계 문자들에 대해서만 코드 값이 정의됨 A~Z, a~z, 0~9,!, @, & 등 문자 키가 아닌 경우에는 통일된 키 코드 값이 없음 <Function> 키, <Home> 키, <Up> 키,<Delete> 키, <Control> 키, <Shift> 키, <Alt> 등 유니코드 키가 입력되는 경우 keypressed(), keyreleased() 만 호출됨 유니코드 키가 아닌 경우 keypressed(), keytyped(), keyreleased() 가 모두 호출됨 10.1.22 입력된 키 판별 -KeyEvent 객체 입력된 키 값을 가진 이벤트 객체 -KeyEvent의 메소드로 입력된 키 판별 Unicode 키의 문자 값을 판별, char KeyEvent.getKeyChar() 눌러진 키에 해당하는 문자 값 리턴 눌러진 키가 Unicode 문자 키인 경우에만 의미 있음 Unicode 문자 외 모든 키 판별, int KeyEvent.getKeyCode() 눌러진 키에 대한 정수형 키 코드 값 리턴 Unicode 문자에 관계 없이, function 키, modifier 키, Control 키, Action 키 등 모든 키에 대해 키 코드 값 리턴 운영체제나 하드웨어에 따라 키 셋은 서로 다름 입력된 키를 판별하기 위해 가상키(Virtual Key) 값과 비교하여야 함 -가상 키 값은 KeyEvent 클래스의 상수로 정의됨 -키 이름 문자열 리턴 String KeyEvent.getKeyText(int keycode) static keycode에 해당하는 키의 이름을 문자열을 리턴 -F1 키의 경우 "F1", Shift 키의 경우 "SHIFT" 등의 문자열 리턴 10.1.23 가상 키(Virtual Key) -가상 키는 KeyEvent 클래스에 상수로 정의되어 있음 -가상 키의 일부분 표 10.4 가상 키 설명 가상 키 설명 VK_0 ~ VK_9 0에서 9까지의 숫자키 0 ~ 9 까지의 ASCII 값과 VK_LEFT 왼쪽 방향 키 - 487 -
동일 VK_A ~ VK_Z A에서 Z까지의 문자키, A ~ VK_RIGHT 오른쪽 방향 키 Z 까지의 ASCII 값과 동일 <Function> 키 F1 ~ F24까 VK_F1~ VK_F24 지의 키 코드 VK_UP <Up>키 VK_HOME <Home>키 VK_DOWN <Down> 키 VK_END <End>키 VK_CONTROL <Control> 키 VK_PGUP <Page Up> 키 VK_SHIFT <Shift> 키 VK_PGDN <Page Down >키 VK_ALT <Alt> 키 입력된 키의 코드 값이 알 수 VK_UNDEFINED VK_TAB <Tab> 키 없음 10.1.24 KeyListener의 메소드와 키 그림 10.11 10.1.25 KeyEvent와 KeyListener의 활용 : getkeycode(), getkeychar(), getkeytext() 사용 - 488 -
10.1.26 실행 결과 그림 10.12-489 -
-예제 10-4 : F1 키를 입력받으면 바탕을 초록색으로, % 키를 입력받으면 바탕을 노란색으로 변경 -예제 10-4 실행 그림 10.13-490 -
-예제 10-5 : 상,하,좌,우 키로 HELLO 문자열 움직이기 -예제 실행: 상,하,좌,우 키로 텍스트 움직이기 그림 10.14-491 -
10.1.27 MouseEvent와 MouseListener,MouseMotionListener -Mouse 이벤트 사용자의 마우스 조작에 따라 발생하는 이벤트 표 10.5 Mouse 이벤트가 발생하는 리스너의메소드 경우 마우스가 컴포넌트 위에 void mouseentered(mouseevent e) 올라갈 때 마우스가 컴포넌트에서 voidmouseexited(mouseevent e) 내려올 때 리스너 MouseListener MouseListener 마우스 버튼이 눌러졌을 때 void mousepressed(mouseevent e) MouseListener 눌러진 버튼이 떼어질 때 void mousereleased(mouseevent e) MouseListener 마우스가 컴포넌트를 클릭하였을 때 void mouseclicked(mouseevent e) MouseListener 마우스가 드래그되는 동안 void mousedragged(mouseevent e) MouseMotionListener 마우스가 움직이는 동안 void mousemoved(mouseevent e) MouseMotionListener 마우스가 클릭되어 한 번 드래그될 때 메소드 호출 순서 10.1.28 MouseEvent 로부터 얻을 수 있는 정보 -마우스 포인터의 위치 int getx(), int gety(), Point getpoint() -입력된 마우스 버튼 short getbutton() -마우스 클릭 횟수 int getclickcount() -팝업 메뉴 클릭 boolean ispopuptrigger() 10.1.29 MouseListener와 MouseMotionListener 사용 예 - 492 -
-실행: MouseListener와 MouseMotionListener 사용 그림 10.15-493 -
-예제 10-6 : 더블클릭시 컨텐트의 배경색 변경 그림 10.16 제11장 스윙 컴포넌트와 이벤트 핸들링 11.1 기초적인 스윙 컴포넌트와 상속 관계 1.기초적인 스윙 컴포넌트와 상속 관계 그림 11.1-494 -
2. 스윙컴포넌트의 공통 메소드. JComponent의메소드 3. 스윙 컴포넌트의 공통 메소드 확인 사례 - 495 -
4. 실행: 스윙 컴포넌트의 공통 요소 그림 11.2 5. JLabel, 레이블 컴포넌트 -JLabel의 용도 텍스트나 이미지를 컴포넌트화 하기 위한 목적 -레이블 컴포넌트 생성 JLabel() 텍스트나 이미지 정보가 없는 빈 레이블 컴포넌트 생성 JLabel(Icon image) 이미지만을 가진 레이블 컴포넌트 생성 JLabel(String text) 텍스트만을 가진 레이블 컴포넌트 생성 JLabel(String text, Icon image, int halignment) 텍스트와 이미지, 수평 정렬 값을 가진 레이블 컴포넌트 생성 수평정렬 값인 halignment로 사용가능한 값들. -SwingConstants.LEFT, CENTER, RIGHT, LEADING or TRAILING 6. 레이블 컴포넌트 생성 예 -단순 텍스트 만을 가진 레이블 컴포넌트 생성 -이미지를 가진 레이블 컴포넌트 생성 이미지 파일로부터 이미지 생성을 위해 ImageIcon 클래스 사용 - 496 -
출력 가능한 이미지 종류 png, gif, jpg sunset.jpg의 경로명이 "images/sunset.jpg"인 경우 -수평정렬 값을 가진 레이블 컴포넌트 생성 수평정렬 값으로 사용되는 값을 생성자의 3 번째 인자로 지정 텍스트 이미지 모두 출력하고자 하는 경우 수평정렬 값을 지정하여야 함. -예제 11-1 : JLabel 컴포넌트 생성 예 그림 11.3 7. JButton, 버튼 컴포넌트 -버튼 컴포넌트 버튼 모양의 컴포넌트 버튼은 클릭될 때 Action 이벤트를 발생시킴 -버튼 컴포넌트 생성 JButton() 텍스트나 이미지 아이콘를 가지지 않은 디폴트 버튼 생성 JButton(Icon icon) 이미지 아이콘만을 가진 버튼 생성 JButton(String text) 텍스트만을 가진 버튼 생성 JButton(String text, Icon icon) 텍스트와 이미지 아이콘을 모두 가진 버튼 생성 -버튼 컴포넌트 생성 예 - 497 -
hello 문자열을 가진 버튼 컴포넌트 생성 예 그림 11.4 8. 이미지를 가진 버튼 컴포넌트 만들기 -하나의 버튼에 3 개의 이미지 연결 사용자의 마우스 접근에 따라 3 개의 이미지 중 선택 출력 -3 개의 버튼 이미지 버튼의 보통 상태 때 출력되는 이미지 : normalicon 생성자 호출 시에 주어진 이미지 아이콘 버튼 위에 마우스가 올라갈 때 출력되는 이미지 : rollovericon 이미지 설정 메소드 : JButton.setRolloverIcon(Icon); 마우스 버튼을 누른 상태 때 출력되는 이미지 : pressedicon 이미지 설정 메소드 : JButton.setPressedIcon(Icon) -이미지 아이콘 생성 new ImageIcon(이미지 경로명); new ImageIcon("images/normalIcon.gif); -예제 11-2 : 3 개의 이미지 아이콘을 가진 버튼 만들기 그림 11.5-498 -
9. 레이블과 버튼의 정렬(Alignment) -수평 정렬 컴포넌트 영역 내에 이미지와 텍스트의 수평상의 위치 결정 void sethorizontalalignment(int align) -수직 정렬 컴포넌트 영역 내에 콘텐츠(이미지와 텍스트)의 수직상의 위치 void setverticalalignment(int align) 그림 11.6 10. JCheckBox, 체크박스 컴포넌트 -체크박스 선택(selected)과 비선택(deselected)의 두 상태만을 가지는 버튼 그림 11.7 -생성자 디폴트는 선택되지 않은 상태 JCheckBox () 텍스트와 이미지가 없는 토글 버튼 생성 JCheckBox(Icon icon) 이미지만 가진 토글 버튼 생성 JCheckBox(Icon icon, boolean selected) 이미지와 지정된 선택 상태로 생성 JCheckBox(String text) 텍스트 만을 가진 토글 버튼 생성 JCheckBox(String text, boolean selected) - 499 -
텍스트와 지정된 선택 상태로 생성 JCheckBox(String text, Icon icon) 텍스트와 이미지 둘 다 가진 토글 버튼 생성 JCheckBox(String text, Icon icon, boolean selected) 텍스트와 이미지를 가지고 지정된 선택상태로 생성 11. 체크 박스 생성 -텍스트 정보만을 가진 체크 박스 생성 "사과" 텍스트를 가진 체크박스 생성 "배" 텍스트를 가지고 선택상태로 체크박스 생성 체크 박스 모양이 명료하게 출력되고 사용자는 이것을 체크 -이미지 아이콘을 가진 체크 박스 생성 예 체크 박스 모양이 출력되지 않음 따로 선택상태를 표현하는 이미지 아이콘을 설정하여야 함 cherry.jpg 이미지와 "체리" 텍스트를 가진 체크 박스 생성 예 선택 상태의 이미지를 위해 selectedcherry.jpg를 사용하였음 -예제 11-3 : 체크박스 생성 예 그림 11.8-500 -