660 likes | 916 Views
Chapter 12 유틸리티 API. Java.util 패키지 주요 클래스. 고전적인 컬렉션들. Vector, Hashtable, Stack JAVA2 이전에 독립적으로 존재 이후에 JCF(Java Collection Framework) 에 속하게 됨 기존 클래스가 이미 광범위하게 사용되고 있는 상황이라 인터페이스를 유지하고 내부구조만 바꾸어 호환성 유지 현재는 JCF 에 속하지만 사용법과 구조가 조금 달라 고전적인 컬렉션으로 구별하여 부름. 고전적인 컬렉션 계층도. java.lang.Object.
E N D
고전적인 컬렉션들 • Vector, Hashtable, Stack • JAVA2 이전에 독립적으로 존재 • 이후에 JCF(Java Collection Framework)에 속하게 됨 • 기존 클래스가 이미 광범위하게 사용되고 있는 상황이라 인터페이스를 유지하고 내부구조만 바꾸어 호환성 유지 • 현재는 JCF에 속하지만 사용법과 구조가 조금 달라 고전적인 컬렉션으로 구별하여 부름
고전적인 컬렉션 계층도 java.lang.Object java.util.Dictionary java.util.HashTable Collection java.util.AbstractList 컬렉션 클래스 java.util.Vector java.util.Stack
Vector 클래스 (1) • 크기가 가변적인 배열과 유사 • 개수가 정해지지 않은 데이터들을 체계적으로 저장하는데 유리하지만 배열보다 속도가 느리다 용량(Capacity) 크기(Size)
Vector 클래스 (2) • Vector 클래스 주요 메소드
반환 하는 메소드의 타입은 객체 타입이므로 반드시 사용하려는 타입으로 변환 한 후 사용하여야 한다. Vector 클래스 사용 예 Vector v =new Vector(); v.add("첫 번째 원소") ; // 0번 index에 삽입 v.add("두 번재 원소"); // 1번 index에 삽입 v.add(1, "새로운 원소"); //1번 원소 대체 String str = (String)v.get(1); //1번원소 반환.형변환 필수
Stack 클래스(1) • LIFO방식의 대표적인 자료구조 • 가장 최근에 저장된 객체부터 사용 가능 push(객체1) pop() 객체1 객체0 객체0 객체0
Stack 클래스(2) • Stack 클래스 주요 메소드
Stack 클래스 사용 예 • Vector 와 마찬가지로 반환 시 타입을 적절히 변환 • 반환 연산은 peek(), pop() 2가지가 있음 Stack st new Stack(); st.push("안녕하세요?"); // 스택에 쌓기 String msg = (String)st.pop(); // 반환 후 삭제
Hashtable 클래스(1) • 키 값과 대응(매핑)되는 값으로 이루어진 사전기능을 구현한 클래스 • Hashtable은 일련의 bucket 들로 구성 • bucket은 key-value의 쌍으로 이루어진 linked list를 가짐 • key-value쌍이 Hashtable에 삽입되면 key객체의 hashCode() 메소드의 리턴값에 따라 특정 bucket을 부여받고 linked list에 추가됨 • 검색시 key객체의 hashCode()계산 후 bucket을 찾은 후 linked list를 선형 탐색함 • 주어진 key와 linked list의 키 값을 비교 위해 equals() 사용
Hashtable 클래스(2) • Hashtable 클래스 주요 메소드
Hashtable 클래스 사용 예 • 보통 키값은 문자열을 많이 사용하며 기본형은 사용 할 수 없음 • Hashtable 역시 반환 시 객체 타입이므로 적절히 변환 하여 사용 Hashtable ht = new Hashtable(); ht.put("한국", "KOREA"); // 키값을 "한국"으로 갖는 객체 삽입 String country = (String)ht.get("한국"); // "한국"을 키값으로 갖는 객체 반환
Enumeration 인터페이스 • 일련의 요소를 1회 1개씩 생성 • Vector의 요소, Hashtable의 키나 값등을 열거하기 위한 것 • 저장된 요소를 모두 얻기 위해 다음의 방법을 자주 쓴다 • Enumeration 을 구현한 대표적인 것으로 StringTokenizer 클래스가 있다. for (Enumeration e = v.keys() ; e.hasMoreElements() ;) { Object obj = ht.get((String)e.nextElement()); }
시간 관련 클래스 java.lang.Object java.util.Date java.util.Calender java.util.GregorianCalender < 시간 관련 클래스 계층도>
Date 클래스 • Date 클래스는 1.1버전 이후로 사용 빈도가 줄어듬 • 년, 월, 일의 정보제공은 Calendar 클래스가 담당 • 밀리세컨드로 시간 표현은 System의 currentTimeMillis 메소드가 담당 • Date 클래스는 각 국어에 대응되지 않아 사장 추세 • 반환 값은 long 형으로 1970년 1월 1일 기준으로 현재까지 의 시간을 천분의 1초로 계산한 값이다.
Date 클래스 사용 예 • 위 예문은 두 개의 Date 객체 생성하는 시간 차이를 계산 한 것이다. Date begin = new Date(); //시작 시간 저장 Date end = new Date(); //끝난 시간 저장 //걸린시간 계산 long lnTimeElaped = end.getTime() - begin.getTime();
Calendar 클래스(1) • 추상 클래스로 일반적인 달력과 시계기능이 선언만 되어 있음 • 추상 클래스이므로 직접 생성하지 못하고 2가지 방법이 이용된다. • getInstance 메소드로 객체 얻는 법 • GregorianCalendar를 직접 생성 하는 법 Calendar rightNow = Calendar.getInstance(); // getInstance() 사용 Calendar rightNow = new GregorianCalendar(); // 직접 그레고리언 캘린더 생성
Calendar 클래스 사용 예 • 많은 필드 값들로 구성되어 있으며 대부분이 public static final int로 되어 있으며 함부로 바꿀 수가 없다. • 바꾸기 위해서 set(), add() 메소드 등을 사용한다. System.out.println("올해는 " + rightNow.get(Calendar.YEAR) + "이고 오늘은 " + rightNow.get(Calendar.DATE) + "일 입니다.");
Timer 와 TimerTask(1) • Timer 클래스는 정해진 시간에 이벤트를 발생시키거나, 정해진 시간 간격마다 반복적으로 이벤트를 발생하도록 한다. • Timer는 백그라운드 thread로 태스크를 스케줄 한다. (프로그래머가 thread를 직접 만들 필요가 없다) java.util.Timer 주요 메소드
Timer 와 TimerTask(2) • schedule 메소드는 주어진 TimerTask 작업을 정해진 시간에 실행하거나, 주어진 시간 간격을 두고 반복 실행한다. • 게임이나 애니메이션 같은 부드러운 동작에 사용됨. • scheduleAtFixedRate는 작업 간격을 일정하게 하는 메소드이다. • 시간이 중요한 요소인 프로그램에 사용됨 • 예를 들어 시계프로그램이라면 1초에 한번씩 다시 그려야 하므로 이 메소드를 사용한다. java.util.TimerTask 주요 메소드
Zip 파일 압축과 복원 • 압축 파일 개요 • 데이터를 보다 적은 용량으로 크기를 줄이는 것 • 일반적으로 반복 발생되는 데이터를 보다 간략한 형식으로 바꾸는 방식으로 압축을 한다. • 압축의 예 AAAAABCDABCDABCD 4A3ABCD • 압축은 보통 실시간 스트리밍 방식으로 행해진다. • 일반적으로 ZIP 형식이 쓰이고, 자바에서는 jar 형식이 있으나 방식은 ZIP 와 같다.
Zip 파일 정보 얻기(1) • ZipFile 클래스는 zip 파일자체와 포함된 엔트리에 대한 정보를 제공한다. • 엔트리 : zip 파일에 포함된 각각의 원소를 가리킴 java.util.zip.ZipFile 주요 메소드
Zip 파일 정보 얻기(2) • ZipEntry 주요 메소드 java.util.zip.ZipEntry 주요 메소드
Zip File 압축 해제 • ZipFile 을 이용한 복원 • ZipFile 객체를 생성한다. • entries 메소드로 ZipEntry 목록을 얻는다. • 각 ZipEntry에 대해서 getInputStream 으로 입력 스트림을 얻는다. • 각 ZipEntry에 대해서 파일을 기록할 출력 스트림을 만들어 파일 내용을 기록한다. • 파일과 스트림을 닫는다.
Zip File 압축 • ZipOutputStream 을 이용한 복원 • ZipOutputStream 을 만든다. • 각각의 파일에 대해서 입력 스트림을 만든다. • 각각의 파일에 대해서 ZipEntry를 만들어 ZipOutputStream에 추가한다. • 각각의 파일 데이터를 ZipOutputStream에 출력한다. • 입출력 스트림을 닫는다.
Arrays 클래스(1) • 배열에 관련된 여러 기능을 제공하는 유틸리티 클래스 • 대표적인 기능은 배열에 대한 배교, 정렬, 이진 탐색, 채우기 등이다. java.util.Arrays 주요 메소드
Arrays 클래스(2) • 배열 비교 • 배열도 객체이기 때문에 단순한 동등 연산자(==)로 비교 불가 • Arrays의 equals 메소드를 사용하여 비교하여야 함 • Object의 equals 메소드도 사용은 할수 있지만 올바로 동작하지 않는다. int arr1[] = {1, 2, 3, 4}; int arr2[] = (1, 2, 3, 4}; //Arrays 의 equals 메소드 사용 if(Arrays.equals(arr1, arr2)) System.out.println("Arrays.equals(arr1, arr2)"); //Object 의 equals 메소드 사용 if(arr1.equals(arr2)) System.out.println("arr1.equals(arr2)"); 실행 결과 : Arrays.equals(arr1, arr2)
Arrays 클래스(3) • 배열 정렬 • Arrays 클래스가 제공하는 정렬은 기본적으로 오름차순으로 정렬된다. • 기본적인 산술형은 간단히 대소비교가 가능하나 객체는 복잡함 • 객체는 대소를 비교 할 일반적인 규칙이 없음 • 객체의 비교에서 기준을 프로그래머가 작성 해 주어야 함 (예를들어 문자열의 길이가 큰것을 객체가 크다고 기준을 정하던지, 프로세스가 먼저 생성된 것이 크다고 하던지 하는 기준) • 이런 기준을 Comparable 나 Comparator 인터페이스로 구현 • Comparable 과 Comparator 가 있는 객체는 대소비교가 가능한 객체로 인식되고 따라서 sort 메소드를 통해 정렬이 가능
Arrays 클래스(4) java.lang.Comparable 주요 메소드 java.lang.Comparator 주요 메소드
Arrays 클래스(5) • 배열 탐색 • 배열의 이진 탐색을 수행하기 위해서는 반드시 sort 되어 있어야 함 • 이진 탐색을 수행해 찾는 값이 존재하면 그 값의 인덱스 반환 • 찾지 못했을 경우에는 삽입 할 수 있는 위치 값을 음수로 바꾸고 1을 추가로 뺀 값을 반환 • (예 : {1, 3, 5, 8} 배열에 4를 탐색하면 인덱스[2] 에 들어갈 수 있으므로 -2 -1 = -3, 즉 -3을 반환하게 된다.) double pdata[] = {1.0, 5.0, 2.0, 8.0}; Arrays.sort(pdata); int idx = Arrays.binarySearch(pdata, 2.0); //오름차순으로 정렬수 2.0을 검색. 1 을 반환
StringTokenizer • StringTokenizer 클래스는 문자열을 토큰으로 쪼개는 역할을 한다. • 기본적으로 탭, 리턴, 공백을 경계로 토큰으로 분해한다. 출력 결과 나는 어제 일어나서 밥을 먹고 학교에 갔다. String str = "나는 어제 일어나서 밥을 먹고 학교에 갔다."; //기본 설정은 공백 단위로 토큰을 구분한다 StringTokenizer st = new StringTokenizer(str); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); }
컬렉션 프레임워크 개요 • 컬렉션 프레임워크(Collections Framework, JCF) • 데이터의 묶음인 컬렉션을 지원하는 API로 자바2 플렛폼 이후에 포함되었음 • 달걀을 모아놓은 바구니나, 장난감이 들어있는 상자로 비유됨 • 앞에서 살펴본 고전적인 컬렉션들이 체계적이지 못해 좀 더 체계적인 컬렉션 지원으로 JCF 가 개발 되었다. • JCF 의 이점 • 복잡한 자료 구조를 직접 구현 할 필요가 없다. • 표준 인터페이스 사용으로 이해가 쉽고, 유지보수가 용이 해 짐 • 일반적으로 속도와 안정성이 증가됨
JCF 인터페이스 개념 • 컬렉션 종류에 따라 크게 3가지로 분류 • Set (집합) • 중괄호( { } )로 표시, 중복된 값 불허, 값의 순서는 없음 • List • 값들의 중복 허용, 데이터 순서 중요 (예 : 배열, 벡터) • Map • 일반적으로 사전과 유사. 키값으로 대응되는 값을 얻음 (예 : Hashtable). 하나의 key는 하나의 값에만 대응되어야 함 {‘a’, ‘b’, ‘c’} == {‘b’, ‘c’, ‘a’} {‘a’, ‘b’, ‘c’, ‘a’} != {‘b’, ’a’, ‘c’, ‘a’} {{“안녕”, “Hello”}, {“잘 가”, “bye”}}
JCF 핵심 인터페이스 • 크게 Collections, Map 두 가지 종류가 있음 • Sorted 가 붙은 것은 순서가 있는 원소 관리에 사용 Map Collection List SortedMap Set SortedSet
구현 클래스 • 알고리즘에는 해시테이블, 배열, 트리, 연결리스트 이 있음 • 일반적으로 구현 클래스 이름은 <알고리즘><인터페이스>로 정해짐 • 배열 알고리즘으로 List 인터페이스 구현 : ArrayList • 해시 테이블로 Set 인터페이스 구현 : HashSet
Collection 인터페이스 • 모든 Set 과 List 클래스들이 공통으로 지원해야 할 기능 정의 java.util.Collection 원소 추가/제거 관련 메소드
Set 인터페이스 • Collection 인터페이스 상속하며 원소의 중복을 허용하지 않고 순서의 구분이 없다. • Set 인터페이스를 구현한 것으로 HashSet 과 TreeSet이 있다. java.util.Set 원소 추가/제거 관련 메소드
HashSet • Hashtable을 이용해서 Set 인터페이스를 구현한 클래스 • 거의 모든 기능을 HashMap을 이용해 구현하였으므로 중요한 알고리즘은 포함하고 있지 않다. • 초기 값으로 크기와 부하계수가 있는데 크기는 최대로 포함시킬 크기보다 약간 크게 잡으면 되고, 부하 계수는 보통 기본값인 0.75 를 그대로 사용 Set set = new HashSet(100, 0.8); // 초기 크기 100, 부하계수 0.8 Set set = new HashSet(30); // 초기 크기 30, 부하계수 0.75
List 인터페이스 • Set 달리 원소의 중복을 허용, 원소는 순서가 있다. • List 는 인덱스를 통해서 객체를 제어하거나 검색 함 • List 특성상 중간에 원소를 삽입하면 중간 이후의 모든 원소는 하나씩 밀려나고, 삭제하면 모두 하나씩 당겨지게 된다. java.util.List 원소 제어 메소드
ArrayList • 배열을 이용하여 List를 구현한 것 • ArrayList 는 버퍼 용량이 부족하면 자동으로 크기를 조절함 List list = new ArrayList(); // 공백의 리스트 생성 List list = new ArrayList(20); //초기 크기가 20인 리스트 생성
Map • Map은 키 값(Key)과 대응 값(Value)의 쌍을 관리하는 컬렉션이다. • Map은 Collection을 상속하지 않기 때문에 컬렉션 객체와 섞어서 사용 할 수 없다. java.util.Map 매핑 추가/제거 메소드
HashMap • JCF 에서 구현한 Map은 HashMap과 TreeMap이 있는데 좀 더 속도가 빠르고 효율적인 HashMap 을 주로 사용함 • 실제 사용은 앞에서 본 HashSet과 유사 • (HashSet 자체가 내부적으로 HashMap을 사용하기 때문이다) • 효율을 높이기 위해 초기 크기는 포함시킬 매핑보다 약간 크게 잡고, 부하계수는 기본값을 사용함. Map hashmap = new HashMap(20); //초기 크기 20의 맵 생성 Map hashmap = new HashMap(20, 0.50); //초기크기 20, 부하계수 0.50의 맵 생성
Collections 클래스 • 컬렉션을 사용하는데 도움이 되는 기능을 모아 놓은 클래스로 모든 메소드는 static 이다. • 주요 기능은 컬렉션의 원소 제어, 정렬, 탐색, 비교 등이 있다. • 원소 제어 • 모든 메소드는 List 를 인자로 받음(Set은 순서가 없어서 복사, 위치이동 등의 연산을 수행하지 못함) java.util.Collections 리스트 원소 제어 메소드
비교와 탐색 • 빠르게 원소의 위치를 찾거나 최대값, 최소값을 얻는 기능 • 비교/탐색 메소드 사용시 컬렉션 원소들은 서로 크기 비교가 가능하여야 하며 그렇지 않으면 예외 발생 java.util.Collections 비교/탐색 관련 메소드
정렬 • 정렬도 마찬가지로 Set은 사용 불가. List를 사용함 • 정렬 메소드가 정상적인 작동을 위해 Comparable 인터페이스를 제공하거나 Comparator 를 제공하여야 함 java.util.Collections 정렬 관련 메소드
동기화 컬렉션 • 고전적인 클래스들은 여러 스레드가 함께 사용되도 안전한, 스레드 안전 클래스 이지만 JCF 의 새로운 컬렉션은 특별한 언급이 없다면 동기화를 지원 안함 • Collections에서는 자동으로 동기화된 인터페이스 제공하는 래퍼객체를 생성해주는 메소드 가지고 있음 • 동기화된 컬렉션 만든 후 원본은 내버려두고 동기화된 컬렉션만으로 작업을 해야 함. (동기화가 깨지기 때문에…) java.util.Collections 동기화 래퍼 메소드
컬렉션 변환 배열 <-> 컬렉션 Vector <-> 컬렉션