자바의 다양한 클래스
단원 07 자바의 다양한 클래스
❖ 자바 클래스 라이브러리를 이해하고 다음 패키지와 클래스를 프로그래밍에 활용 할 수 있다.
▪ • 패키지 java.lang
▪ • 클래스 Object, Math, String, StringBuffer
▪ • 랩퍼 클래스 Byte, Short, Integer, Long, Float, Double, Boolean, Character
❖ 다음 패키지와 클래스를 프로그래밍에 활용할 수 있다.
▪ • 패키지 java.util
▪ • 클래스 Random, StringTokenizer
▪ • 클래스 Calendar, GregorianCalendar, Date
❖ 자바 콜렉션 프레임워크를 이해하고 다음 클래스와 인터페이스를 프로그래밍에 활용할 수 있다.
▪ • 인터페이스 Collection, List, Queue, Set, Map
▪ • 클래스 LinkedList, Vector, HashSet, HashMap
2
단원 07 자바의 다양한 클래스 3
1. 패키지 JAVA.LANG의 클래스
단원 07 자바의 다양한 클래스
자바 API
❖ 자바 클래스 라이브러리(java class library)
▪ 자바 언어를 활용하기 위해 이미 만들어 놓은 다양한 자바 클래스
❖ 자바 API 문서
▪ http://docs.oracle.com/javase/7/docs/api
4
단원 07 자바의 다양한 클래스
주요 패키지
❖ 명명규칙
▪ 패키지 java.
• 초기에 패키지
▪ 패키지 javax.
• 이후 추가된 패키지
▪ 패키지 org.
• 외부 표준 조직 에서 만든 패키지
▪ 패키지 com.
• 외부 회사에서 만든 패키지
❖ 패키지에서 주의할 점
▪ 패키지는 하부 패키지를 포함하지 않음
5
단원 07 자바의 다양한 클래스
기본 패키지 java.lang
❖ 패키지 java.lang
▪ 자바 프로그램을 위한 기본 클래스가 소속된 패키지가
▪ 주요 클래스
• Object, Integer, String, StringBuffer, Math 등
• 유일하게 import 문장이 필요 없이 사용 가능
6
단원 07 자바의 다양한 클래스
최상위 클래스 Object
❖ 자동으로 최상위 클래스 Object
▪ 새로운 클래스를 정의하는 경우 상속 관계를 명시하지 않으면 자동으로 클래스 Object가 상위 클래스
❖ 주요 메소드
▪ 메소드 toString()
• 객체의 문자열 표현 값을 반환
• 하위 클래스에서 달리 재정의(overriding)하지 않으면
– "클래스이름@16진수해시코드"의 문자열로 표현
▪ 메소드 equals()
• 객체 내용의 동등 여부를 검사하는데 사용
7
단원 07 자바의 다양한 클래스
수학 관련 클래스 Math
❖ 정적 메소드와 상수 제공
8
단원 07 자바의 다양한 클래스
클래스 Object와 Math의 사용
❖ 실습예제
▪ 7-1
9
단원 07 자바의 다양한 클래스
랩퍼 클래스의 개념과 종류
❖ 8 개의 랩퍼 클래스(wrapper class)
▪ 자바의 기본형을 참조형으로 표현한 클래스
▪ 기본형을 참조형으로 포장한 포장 클래스
10
단원 07 자바의 다양한 클래스
클래스 Integer
❖ Integer 객체의 생성
▪ 정수 또는 정수 형태의 문자열 인자로 생성
• Integer age = new Integer(20);
• Integer snum = new Integer("20121105");
▪ 저장된 int 값은 한 번 생성되면 수정할 수 없음
▪ int 값은 메소드 intValue()로 반환
11
단원 07 자바의 다양한 클래스
박싱과 언박싱
❖ Jdk 1.5 이전
▪ 클래스 Double을 사용하여 실수 2.59 를 저장하는 객체를 생성
• Double radius = new Double(2.59);
▪ 기본형 double 변수 r에 저장하는 문장
• double r =
radius.doubleValue();
12
❖ Jdk 1.5 이후
▪ 자동 박싱(boxing)
• 기본형에서 랩퍼 객체의 자동 변환
• Double radius = 2.59; //boxing
▪ 자동 언박싱(unboxing)
• 랩퍼 객체에서 기본형의 변환
• double r = radius; //unboxing
단원 07 자바의 다양한 클래스
클래스 Character
❖ 실습예제 7-4
13
단원 07 자바의 다양한 클래스
클래스 String(1)
❖ 일련의 문자 표현인 문자열
▪ 클래스 String으로 표현
▪ 한번 생성되면 다시 수정될 수 없는 특징
14
단원 07 자바의 다양한 클래스
클래스 String(2)
❖ 다양한 메소드 제공
▪ 현재 객체의 문자열에서 새로운 문자열을 생성하여 반환하는 메소드로서 자신의 문 자열은 수정되지 않음
15
단원 07 자바의 다양한 클래스
클래스 String(3)
❖ 실습예제
▪ 7-5
16
단원 07 자바의 다양한 클래스
클래스 StringBuffer(1)
❖ 생성된 이후에도 문자열의 내용을 계속 수정 가능
▪ 문자열을 저장할 수 있는 용량(capacity)을 갖음
▪ 용량이 작으면 자동으로 수정되므로 프로그래머는 크게 신경 쓸 필요 없음
▪ StringBuffer를 생성하는 방법
• StringBuffer sb1 = new StringBuffer(); //용량은 16
• StringBuffer sb2 = new StringBuffer(32); //용량은 32
• StringBuffer sb3 = new StringBuffer("java");
17
단원 07 자바의 다양한 클래스
클래스 StringBuffer(2)
❖ 주요 메소드
▪ 현재 객체의 문자열이 연산이 수행된 내용으로 수정되며, 반환 값은 수정된 문자열 을 StringBuffer 형으로 반환
18
단원 07 자바의 다양한 클래스
클래스 StringBuffer(3)
❖ 실습예제
▪ 7-6
19
단원 07 자바의 다양한 클래스 20
2. 패키지 JAVA.UTIL의 클래스
단원 07 자바의 다양한 클래스
패키지 java.util
❖ 다양한 유틸리티 클래스
▪ 프로그램에서 이용할 수 있는 각종 유틸리티가 제공되는 패키지
▪ Calendar, GregorianCalendar, Date
•
주요 클래스로는 날짜와 시간정보를 표현▪ Random
•
난수(random number)를 생성▪ Vector, Stack
•
다양한 자료형의 객체를 배열의 원소로 이용할 수 있는 자료구조를 지원•
자료 구조에서 가장 많이 이용하는 구조 중의 하나인 스택 구조를 지원▪ Collection, Set, List, Queue, Map 등의 다양한 인터페이스와 클래스
•
여러 항목의 원소를 가변적으로 삽입과 삭제가 편리21
단원 07 자바의 다양한 클래스
클래스 Random
❖ int, long, float, double 등의 다양한 형의 난수를 만들어 제공
❖ 기본 생성자
▪ 현재 시간 정보로 시드 값을 지정하여 난수를 생성
▪ long 형 인자의 생성자는 시드 값을 직접 지정하여 난수를 생성
• Random rnd1 = new Random();
• Random rnd2 = new Random(45);
22
단원 07 자바의 다양한 클래스
다양한 난수의 발생
❖ 실습예제
▪ 7-7
23
단원 07 자바의 다양한 클래스
클래스 StringTokenizer(1)
❖ 하나의 문자열에서 여러 토큰(token)을 생성
▪ 지정된 분리자(delimiters)를 사용
• 기본 분리자는 " \t\n\r\f"으로 공백문자와 탭 \t과 같은 4개의 제어문자
• 다른 분리자를 지정하고 싶다면 StringTokenizer의 생성자에서 2번째 인자에 기술
▪ 기본적으로 분리자를 토큰에 속하지 않게 분리
• 분리자를 토큰에 포함시키려면 StringTokenizer의 생성자에서 3번째 인자를 true로 지정
24
String str = "public static void main(String[] args) {";
StringTokenizer st1 = new StringTokenizer(str);
StringTokenizer st2 = new StringTokenizer(str, " ()");
StringTokenizer st3 = new StringTokenizer(str, " ()[]
{");
StringTokenizer st4 = new StringTokenizer(str, "()[]{",
true);
단원 07 자바의 다양한 클래스
클래스 StringTokenizer(2)
❖ 다음은 StringTokenizer의 메소드
▪ 반복문을 사용하여 여러 토큰을 분리자로 분리하여 토큰을 추출하는데 유용하게 사 용
25
단원 07 자바의 다양한 클래스
실습예제
❖ 7-8
26
단원 07 자바의 다양한 클래스
클래스 Date
❖ 시간 정보를 표현하는 기본 클래스
▪ 클래스 Date의 많은 메소드는 더 이상 사용을 권장하지 않음
•
deprecated 메소드▪ 클래스 Date는 Calendar와 밀접한 관련이 있는 클래스
•
시간 정보를 초 정보로 저장하는데, 1/1000초인 millisecond로 표현▪ 메소드 getTime()
•
1970년 1월 1일 00:00:00을 기준으로 지나간 시간을 millisecond로 반환– 기준 시간인 1970 1월 1일 00:00:00을 epoch
❖ 클래스 DateFormat
▪ 패키지 java.text에 속하는 클래스로 시간 정보의 출력 형식에 제공
❖ 클래스 Locale
▪ 패키지 java.util에 있는 클래스로 국가 정보를 정의한 클래스
27
Date now = new Date();
System.out.println(now);
System.out.println(now.getTime());
단원 07 자바의 다양한 클래스
실습예제
❖ 7-9
28
단원 07 자바의 다양한 클래스
클래스 Calendar
❖ 날짜와 시간에 관한 정보를 제공하는 추상 클래스
▪ 자체의 생성자를 이용하여 객체를 생성 불가능
▪ 정적 메소드 getInstance()
• 현재 시간 정보를 갖는 객체를 생성해주는
▪ 메소드 getTime()
• 반환형은 Date로서, 바로 출력하면 영문 표현의 시간 정보를 출력 가능
29
Calendar now = Calendar.getInstance();
System.out.println(now.getTime());
단원 07 자바의 다양한 클래스
클래스 Calendar
❖ 실습예제 7-10
30
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
System.out.println(now.getTime());
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; //월 시작이 0 int date = now.get(Calendar.DATE);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
System.out.println(year + "년 " + month + "월 " + date + "일");
System.out.println(hour + "시 " + minute + "분 " + second +
"초");
} }
단원 07 자바의 다양한 클래스 31
3. 컬렉션 프레임워크
단원 07 자바의 다양한 클래스
컬렉션 프레임워크 개요
❖ 인터페이스 계층
▪ 컬렉션 프레임워크 collection framework
• 여러 객체 원소의 삽입과 삭제가 편리한 자료 구조를 지원하는 인터페이스
– 인터페이스 Collection, Set, List, Queue, Map
• 이를 구현한 여러 클래스로 컬렉션 프레임워크를 구성
32
단원 07 자바의 다양한 클래스
Collection
❖ 크게 인터페이스 Collection과 Map으로 구분
▪ 인터페이스 Collection
• 인터페이스 Set과 List 그리고 Queue로 분류
– 인터페이스 Set은 수학의 집합을 표현한 인터페이스 – 원소의 중복을 허용하지 않음
– 인터페이스 List와 Queue는 원소의 중복을 허용하고 순서도 의미가 있음
• 객체 하나를 컬렉션의 원소로 처리
▪ 인터페이스 Map
• 키(key)와 값(value)의 쌍으로 구성된 자료 구조를 컬렉션의 원소로 처리
• 원소의 중복을 허용하지 않음
33
단원 07 자바의 다양한 클래스
다양한 컬렉션 클래스
❖ 자바의 컬렉션 인터페이스를 구현한 클래스는 매우 다양
▪ 관련 클래스 이름
• HashMap과 같이 [내부구현방법][인터페이스이름]으로 구성
• HashMap인 클래스는 Hash는 구현 방법이고 Map은 인터페이스 이름
34
단원 07 자바의 다양한 클래스
Collection 인터페이스
❖ 자바 컬렉션 프레임워크를 대표하는 인터페이스 Collection
▪ 원소의 추가, 삭제 등의 연산
▪ List, Set, Queue가 가져야 할 기본적인 연산을 추상 메소드로 선언
35
단원 07 자바의 다양한 클래스
Iterator 인터페이스
❖ 컬렉션을 구성하는 원소 집합을 순차적으로 처리하기 위한 인터페이스
▪ iterator() 메소드
• 인터페이스 Iterator의 객체를 반환
• 인터페이스 Collection을 구현하는 컬렉션 클래스 객체인 참조 변수 c에서
– 메소드 iterator()를 호출하여 인터페이스 Iterator의 객체를 얻음 – 메소드 hasNext()와 next()를 사용 반복
36
Iterator it = c.iterator();
while ( it.hasNext() ) {
System.out.println(it.next());
}
단원 07 자바의 다양한 클래스
List 인터페이스
❖ 순차적으로 나열된 원소를 처리하는 구조
▪ 첨자를 인자로 하는 메소드를 제공
▪ 인터페이스 List를 상속받아 구현한 대표적인 클래스
• LinkedList, ArrayList, Vector, Stack 등
37
단원 07 자바의 다양한 클래스
ListIterator 인터페이스
❖ 상위로 Iterator를 상속받는 인터페이스
▪ 컬렉션을 구성하는 원소 집합에서 순방향과 역방향으로 순차적 처리에 편리
38
단원 07 자바의 다양한 클래스
양방향의 연결 리스트인 클래스 LinkedList
❖ 인터페이스 List와 Queue 등을 구현한 클래스
▪ 내부적으로 양방향의 연결 리스트로 구성
❖ 처음부터 순방향으로 또는 마지막부터 역방향으로 순회 가능
▪ null을 포함한 모든 종류의 객체를 처리
▪ addFirst() : 맨 앞에
▪ add() 와 addLsat() : 가장 끝에
▪ add(index)
• 지정된 첨자 위치 등 자유자재로 삽입 가능
39
단원 07 자바의 다양한 클래스
클래스 LinkedList
❖ 주요 메소드
40
단원 07 자바의 다양한 클래스
실습예제
❖ 7-12
41
단원 07 자바의 다양한 클래스
클래스 Vector(1)
❖ 모든 종류의 객체를 저장할 수 있는 배열 구조
▪ 용량 capacity으로 저장할 수 있는 객체의 개수를 정함
▪ 용량이 모두 객체 원소로 모두 채워지면 자동으로 용량이 2배로 증가
▪ Vector<Object>
• 벡터의 원소를 Object로 사용한다는 의미
42
Vector<Object> data = new Vector<Object>();
data.addElement(2012);
data.add("년도");
단원 07 자바의 다양한 클래스
클래스 Vector(2)
❖ 주요 메소드
43
단원 07 자바의 다양한 클래스
실습예제
❖ 7-13
44
import java.util.Vector;
public class VectorTest {
public static void main(String[] args) {
Vector<Object> data = new Vector<Object>(3);
//Vector data = new Vector(3); //경고 발생 data.addElement(2012);
data.add("년도");
data.addElement(4.35);
data.add(2, "목표 학점");
data.insertElementAt("자바 강좌", 0);
System.out.println("size = " + data.size());
System.out.println("capacity = " + data.capacity());
System.out.println(data.toString());
} }
단원 07 자바의 다양한 클래스
Set 인터페이스
❖ 중복을 허용하지 않는 컬렉션
▪ Collection에서 상속받아 재정의한 메소드로 구성
▪ 인터페이스 Set을 구현한 클래스
• 클래스 TreeSet
– Set에서 정렬을 지원하는 SortedSet 인터페이스를 상속받고 – 내부적으로 트리를 이용하여 Set을 지원
• 클래스 HashSet
– 내부적으로 원소를 해시 테이블(hash table)을 이용하여 저장하는 구조
▪ Set 은 인터페이스 Collection이 상위이므로
• Collection의 모든 메소드를 상속
45
단원 07 자바의 다양한 클래스
실습 예제
❖ 7-14: HashSet 의 활용
▪ Set은 집합이므로 7을 여러 번 삽입해도 중복을 허용하지 않고 하나만 삽입
▪ 객체 HashSet의 내부 원소로 Integer만 지원한다면 자료형 HashSet<Integer>
를 사용
46 public class void HashSetTest {
… HashSet<Integer> setA = new HashSet<Integer>();
HashSet<Integer> setB = new HashSet<Integer>();
setA.add(3); setA.add(5); setA.add(7);
setA.add(8); setA.add(7); setA.add(9);
System.out.print("A = ");
print(setA);
System.out.println(" A = " + setA);
setB.add(5); setB.add(3); setB.add(2);
System.out.print("B = ");
print(setB);
System.out.println(" B = " + setB);
boolean isChanged = setA.removeAll(setB);
System.out.print("A - B = ");
if (isChanged) System.out.println(setA);;
}public static void print(HashSet<Integer> s) { Iterator<Integer> i = s.iterator();
while ( i.hasNext() )
System.out.print(i.next()+ " ");
} }
단원 07 자바의 다양한 클래스
Map 인터페이스(1)
❖ 키(key)와 값(value)으로 원소를 처리
▪ 메소드 put(key, value)으로 저장
▪ 메소드 get(key)로 조회
❖ 하위 클래스
▪ HashMap, TreeMap 등이 있으며
▪ HashMap 은 키와 값의 Map을 해시테이블을 사용하여 구현한 클래스
47
단원 07 자바의 다양한 클래스
Map 인터페이스(2)
❖ 주요 메소드
48
단원 07 자바의 다양한 클래스
클래스 HashMap
❖ 인터페이스 Map을 상속받아 구현한 대표적
▪ 키와 값으로 null 값을 모두 지원
▪ 내부적으로 해시 테이블을 사용하여 구현
❖ 실습예제 7-15
49
import java.util.HashMap;
import java.util.Iterator;
public class HashMapTest {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("대한민국", "서울");
hm.put("일본", "동경");
hm.put("중국", "북경");
hm.put("태국", "방콕"); hm.remove("태국");
hm.put("중국", "북경");
System.out.print("키 : " + hm.keySet());
System.out.println(" 값 : " + hm.values());
Iterator<String> keys = hm.keySet().iterator();
while ( keys.hasNext() ) {
String key = keys.next();
String value = hm.get(key);
System.out.println(key + ": " + value);
} }
}
단원 07 자바의 다양한 클래스 50
4. 일반화 유형과 열거형
단원 07 자바의 다양한 클래스
Generic 의 사용
❖ 일반화 유형(generic type)
▪ 컬렉션을 사용할 때 내부 원소를 구성하는 객체의 자료형을 하나의 자료형으로 한 정하고 싶을 때
▪ 클래스 HashMap<String, String>의 일반화 유형을 사용하면
• Map의 키와 값으로 String만으로 제한
• String으로의 자료형 변환이 필요없음
▪ 일반화 유형을 <Object, Object>로 이용
• 모든 종류의 객체를 키와 값으로 사용 가능
51
단원 07 자바의 다양한 클래스
Generic 클래스 정의
❖ 일반화 유형을 지원하는 클래스 정의 방법
▪ 클래스 MyContainer<E>는 원소로 일반화 유형을 지원하는 클래스로 정의
• E는 MyContainer를 구성하는 원소(element)의 자료형을 의미
❖ MyContainer<E> 에서 원소로 문자열만 사용하려면
▪ 클래스 MyContainer<String>을 사용
• 객체 변수 pl은 pl.add(“algol”)과 같이 문자열만 삽입이 가능
▪ 모든 객체를 삽입하려면 MyContainer<Object>를 사용
52
단원 07 자바의 다양한 클래스
실습예제
❖ 7-16
53
package generics;
import java.util.ArrayList;
public class MyContainer<E> {
private ArrayList<E> list;
public MyContainer() {
list = new ArrayList<E>();
}
public E get(int index) {
return list.get(index);
}
public void add(E element) { list.add(element);
}
public static void main(String[] args) {
MyContainer<String> pl = new MyContainer<String>();
pl.add("algol");
pl.add("C");
//pl.add(5); 오류 발생 pl.add("java");
System.out.println(pl.get(0) + " ");
System.out.println(pl.get(1) + " ");
System.out.println(pl.get(2) + " ");
} }
단원 07 자바의 다양한 클래스
Generic 메소드 구현
❖ 정적인 메소드 get()
▪ 인자인 일반화 유형 <T>의 배열에서 첨자에 해당하는 원소를 반환하는 메소드를 구현
• 매개변수의 일반화 유형은 static <T> T와 같이 지정자와 반환형 사이에 <T>으로 기술
• 첫 번째 인자인 ary는 일반화 유형인 T[] 배열임을 명시
❖ 실습예제 7-17
54
package generics;
public class MyGenerics {
public static <T> T get(T[] ary, int index) { return ary[index];
}
public static <T> T getLast(T[] ary) { return ary[ary.length-1];
}
public static void main(String[] args) {
Integer n[] = {3, 4, 5, 7};System.out.println(MyGenerics.get(n, 2) + " " + MyGenerics.getLast(n));
String s[] = {"generics", "type casting", "input", "output"};
System.out.println(MyGenerics.get(s, 1) + " " + MyGenerics.getLast(s));
} }
단원 07 자바의 다양한 클래스
열거형 정의
❖ 열거 자료형(enumeration data type)
▪ 참조형으로 제공, 키워드 enum과 자료형 클래스 이름 pl로
• 상수 c, cpp, java, csharp을 정의하는 문장
▪ 열거 유형은 정적 메소드 values()를 이용
• 열거 원소의 상수로 구성된 배열을 반환
▪ 상수 목록은 switch 문의 case에 그대로 사용
55
… public class EnumTest {
public enum pl {c, cpp, java, csharp};
public static void main(String[] args) {
pl clang = pl.c; //정의한 열거 유형은 하나의 자료 유형으로 이용 System.out.println(clang); //저장된 상수 문자열이 출력 clang = pl.csharp;
switch(clang) { case csharp:
System.out.println(clang + ": C# 언어 ");
}
for (pl p : pl.values())
System.out.print(p + " ");
System.out.println();
} }