명품 JAVA Programming.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

일반적인 하나의 코드로 다양한 자료형을 처리하는 기법을 살펴봅시다.
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ①.
10. 예외 처리.
최윤정 Java 프로그래밍 클래스 상속 최윤정
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
연결리스트(linked list).
어서와 Java는 처음이지! 제15장 제네릭과 컬렉션. 어서와 Java는 처음이지! 제15장 제네릭과 컬렉션.
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
3. 자바에서 지원하는 패키지 자바에서 기본적으로 제공하는 패키지.
Lesson 3. 입출력과 제어문.
7장 배열 ②.
Lesson 5. 레퍼런스 데이터형.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Lesson 6. 형변환.
Power Java 제14장 제네릭과 컬렉션.
명품 Java Programming.
5장. 참조 타입.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
C++ Espresso 제12장 템플릿.
정렬 제네릭 Comparator 컬렉션 클래스
7장. 자바의 다양한 클래스.
Lesson 7. 클래스와 메소드 - 1.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
자바 5.0 프로그래밍.
11장. 1차원 배열.
Introduction To Data Structures Using C
13. 연산자 오버로딩.
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
자바 5.0 프로그래밍.
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
27강 JAVA Collections - II - Map계열 컬렉션 클래스 살펴보기 - Set계열 컬렉션 클래스 살펴보기
15장 컬렉션 프레임워크 Section 1 컬렉션 프레임워크의 개요 Section 2 리스트 Section 3 셋
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
자바 5.0 프로그래밍.
Power Java 제11장 상속.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
Canary value 스택 가드(Stack Guard).
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
데이터 동적 할당 Collection class.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
발표자 : 이지연 Programming Systems Lab.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
제 4 장 Record.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
OOP Practices OOP presentation 6 작성자 Kimjinsik 소속 Mobile computing Lab
13. 포인터와 배열! 함께 이해하기.
12장. 자료구조로 사용되는 클래스 자료구조란? 자료구조 클래스의 사용방법.
C++ Espresso 제15장 STL 알고리즘.
7 생성자 함수.
6 객체.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

명품 JAVA Programming

컬렉션(collection)의 개념 컬렉션 데이터(요소, element) 들의 저장소 각 요소는 객체이어야 함 객체들의 컨테이너라고도 불림 요소의 개수에 따라 크기 자동 조절 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동 크기를 바꿀 수 없는 배열을 다루는 어려움 해소 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

컬렉션과 제네릭 컬렉션은 제네릭(generics) 기법으로 구현됨 컬렉션의 요소는 객체만 가능 제네릭 기본적으로 int, char, double 등의 기본 타입 사용 불가 JDK 1.5부터 자동 박싱/언박싱 기능으로 기본 타입 사용 가능 제네릭 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도 록 클래스나 메소드를 일반화시키는 기법 <E>, <K>, <V> : 타입 매개 변수 요소 타입을 일반화한 타입 제네릭 클래스 사례 제네릭 벡터 : Vector<E> E에 특정 타입으로 구체화 정수만 다루는 벡터 Vector<Integer> 문자열만 다루는 벡터 Vector<String>

Stack<Integer> 제네릭의 기본 개념 JDK 1.5에서 도입(2004년 기점) 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타 입 매개 변수로 클래스나 메소드를 작성하는 기법 C++의 템플릿(template)과 동일 정수만 저장 정수 스택 ... void push(Integer element) { ... } Integer pop() { ... } 20 -345 class Stack<E> { ... void push(E element) { ... } E pop() { ... } } 123 Stack<Integer> 10 ... void push(String element) { ... } String pop() { ... } Stack<String> “Good” “C#” 제네릭 스택 특정 타입으로 구체화 “C++” “Java” 문자열 스택 문자열만 저장

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

제네릭 Stack<E> 클래스의 JDK 매뉴얼 스택 생성 Stack< E > myStack = new Stack< E > (); 메쏘드 boolean empty() Tests if this stack is empty. E peek() Looks at the object at the top of this stack without removing it from the stack. E pop() Removes the object at the top of this stack and returns that object as the value of this function. E push(E item) Pushes an item onto the top of this stack.

StackTest.java import java.util.Stack; public class StackTest { public static void main( String[] args ) Stack< String > myStack = new Stack< String > (); System.out.println( "myStack.empty()--> " + myStack.empty() ); System.out.println(); myStack.push( "1st" ); System.out.println( myStack ); myStack.push( "2nd" ); System.out.println( myStack ); myStack.push( "3rd" ); System.out.println( myStack ); myStack.push( "4th" ); System.out.println( myStack ); myStack.empty()--> true [1st] [1st, 2nd] [1st, 2nd, 3rd] [1st, 2nd, 3rd, 4th]

System. out. println( "myStack. peek()--> “ + myStack System.out.println( "myStack.peek()--> “ + myStack.peek() ); System.out.println(); String element; System.out.println( myStack ); element = myStack.pop(); System.out.println( "myStack.pop() --> " + element ); myStack.push( "5th" ); System.out.println( myStack ); } myStack.peek()--> 4th [1st, 2nd, 3rd, 4th] myStack.pop() --> 4th [1st, 2nd, 3rd] myStack.pop() --> 3rd [1st, 2nd, 5th]

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

Vector<E> Vector<E>의 특성 java.util.Vector <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스 배열의 길이 제한 극복 원소의 개수가 넘쳐나면 자동으로 크기 조절 Vector에 삽입 가능한 것 객체, null 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장 Vector에 객체 삽입 벡터의 맨 뒤에 객체 추가 벡터 중간에 객체 삽입 Vector에서 객체 삭제 임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 자동 자리 이동

Vector<Integer> 컬렉션 내부 구성 Vector<Integer> v = new Vector<Integer>(); add()를 이용하여 요소를 삽입하고 get()을 이용하여 요소를 검색합니다

Vector<E> 클래스의 주요 메소드

컬렉션과 자동 박싱/언박싱 JDK 1.5 이전 JDK 1.5부터 기본 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요 JDK 1.5부터 자동 박싱/언박싱이 작동하여 기본 타입 값 사용 가능 제네릭의 타입 매개 변수를 기본 타입으로 구체화할 수는 없음 Vector<Integer> v = new Vector<Integer>(); v.add(new Integer(4)); Integer n = (Integer)v.get(0); int k = n.intValue(); // k = 4 Vector<Integer> v = new Vector<Integer> (); v.add(4); // 4 → new Integer(4)로 자동 박싱 int k = v.get(0); // Integer 타입이 int 타입으로 자동 언박싱, k = 4 Vector<int> v = new Vector<int> (); // 오류

예제 7-1 : 정수 값만 다루는 Vector<Integer> 정수 값만 다루는 제네릭 벡터를 생성하고 활용하는 사례를 보인다. 다음 코드에 대한 결과는 무엇인가? import java.util.Vector; public class VectorEx { public static void main(String[] args) { // 정수 값만 다루는 제네릭 벡터 생성 Vector<Integer> v = new Vector<Integer>(); v.add(5); // 5 삽입 v.add(4); // 4 삽입 v.add(-1); // -1 삽입 // 벡터 중간에 삽입하기 v.add(2, 100); // 4와 -1 사이에 정수 100 삽입 System.out.println(“v.size() : " + v.size()); System.out.println(“v.capacity() : " + v.capacity()); System.out.println(“v.toString(): “ + v ); // 모든 요소 정수 출력하기 for(int i=0; i<v.size(); i++) { int n = v.get(i); System.out.println(n); } // 벡터 속의 모든 정수 더하기 int sum = 0; for(int i=0; i<v.size(); i++) { int n = v.elementAt(i); sum += n; } System.out.println(“Sum : “ + sum); v.size() : 4 v.capacity(): 10 v.toString(): [5, 4, 100, -1] 5 4 100 -1 Sum: 108

예제 7-2 Point 클래스의 객체들만 저장하는 벡터 만들기 (x, y) 한 점을 추상화한 Point 클래스를 만들고 Point 클래스의 객체만 저장하는 벡터를 작성하라. import java.util.Vector; class Point { private int x, y; public Point(int x, int y) this.x = x; this.y = y; } public String toString() return "(" + x + "," + y + ")"; public class PointVectorEx { public static void main(String[] args) // Point 객체를 요소로만 가지는 벡터 생성 Vector<Point> v = new Vector<Point>(); // 3 개의 Point 객체 삽입 v.add(new Point(2, 3)); v.add(new Point(-5, 20)); v.add(new Point(30, -8)); System.out.println( v ); // 벡터에 있는 Point 객체 모두 검색하여 출력 for(int i=0; i<v.size(); i++) Point p = v.get(i); // 벡터에서 i 번째 Point 객체 얻어내기 System.out.println(p); // p.toString()을 이용하여 객체 p 출력 } [(2,3), (-5,20), (30,-8)] (2,3) (-5,20) (30,-8)`

Vector<E> vs. ArrayList<E> 공통점 List<E> 인터페이스를 구현 중복을 허용 저장순서 유지 내부적으로 배열 사용 차이점 Vector<E>는 멀티쓰레드에 대한 동기화 제공(thread-safe) ArrayList<E>는 멀티쓰레드에 대한 동기화 제공하지 않음 ArrayList<E>가 Vector<E>보다 빠름 Vector<E>는 호환성을 위해 남아있음. ArrayList<E>를 사용하는 것이 좋음. ArrayList<E>를 멀티쓰레드 환경에서 사용할 때 static List Collections.synchronizedList(List list)를 사용할 수 있 음.

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

ArrayList<E> ArrayList<E>의 특성 Vector<E>와 거의 동일 java.util.ArrayList, 내부적으로 배열에 데이터 저장 <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화 ArrayList에 삽입 가능한 것 객체, null 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장 ArrayList에 객체 삽입/삭제 리스트의 맨 뒤에 객체 추가 리스트의 중간에 객체 삽입 임의의 위치에 있는 객체 삭제 가능 벡터와 달리 스레드 동기화 기능 없음 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음

ArrayList<String> 컬렉션의 내부 구성 ArrayList<String> list = new ArrayList<String>(); add()를 이용하여 요소를 삽입하고 get()을 이용하 여 요소를 검색합니다

ArrayList<E> 클래스의 주요 메소드

예제 7-3 : ArrayList에 문자열 저장 키보드로 문자열을 입력 받아 ArrayList에 삽입하고 가장 긴 이름을 출력하라. import java.util.*; public class ArrayListEx { public static void main(String[] args) { // 문자열만 삽입가능한 ArrayList 컬렉션 생성 ArrayList<String> list = new ArrayList<String>(); // 키보드로부터 4개의 이름 입력받아 ArrayList에 삽입 Scanner scanner = new Scanner(System.in); for(int i=0; i<4; i++) { System.out.print(“Enter name>>"); String s = scanner.next(); // 키보드로부터 이름 입력 list.add(s); // ArrayList 컬렉션에 삽입 } // ArrayList에 들어 있는 모든 이름 출력 for(int i=0; i<list.size(); i++) { // ArrayList의 i 번째 문자열 얻어오기 String name = list.get(i); System.out.print(name + " "); // 가장 긴 이름 출력 int longestIndex = 0; for(int i=1; i<list.size(); i++) { if( list.get(longestIndex).length() < list.get(i).length() ) longestIndex = i; } System.out.println(“ \nThe longest name : " + list.get(longestIndex) ); Enter name>>Mike Enter name>>Jane Enter name >>Ashley Enter name >>Helen Mike Jane Ashley Helen The longest name : Ashley

컬렉션의 순차 검색을 위한 Iterator iterator() 메쏘드 iterator()를 호출하면 Iterator 객체 반환 Vector<Integer> v = new Vector<Integer>(); Iterator<Integer> it = v.iterator(); while(it.hasNext()) { // 모든 요소 방문 int n = it.next(); // 다음 요소 리턴 ... }

예제 7-4 : Iterator를 이용하여 Vector의 모든 요소 출력하고 합 구하기 Vector<Integer>로부터 Iterator를 얻어내고 벡터의 모든 정수를 출력하고 합을 구하라. import java.util.*; public class IteratorEx { public static void main(String[] args) { // 정수 값만 다루는 제네릭 벡터 생성 Vector<Integer> v = new Vector<Integer>(); v.add(5); // 5 삽입 v.add(4); // 4 삽입 v.add(-1); // -1 삽입 v.add(2, 100); // 4와 -1 사이에 정수 100 삽입 // Iterator를 이용한 모든 정수 출력하기 Iterator<Integer> it = v.iterator(); // Iterator 객체 얻기 while(it.hasNext()) { int n = it.next(); System.out.println(n); } // Iterator를 이용하여 모든 정수 더하기 int sum = 0; it = v.iterator(); // Iterator 객체 얻기 while(it.hasNext()) { int n = it.next(); sum += n; } System.out.println(“Sum : " + sum); 5 4 100 -1 Sum : 108

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

LinkedList<E> LinkedList<E>의 특성 java.util.LinkedList Vector, ArrayList 클래스와 매우 유사하게 작동 요소 객체들은 양방향으로 연결되어 관리됨 요소 객체는 맨 앞, 맨 뒤에 추가 가능 요소 객체는 인덱스를 이용하여 중간에 삽입 가능 맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능

LinkedList<String>의 내부 구성과 put(), get() 메소드 LinkedList<String> list = new LinkedList<String>(); first last

LinkedList<E> as a list ArrayList<E>와 사용방법이 거의 동일함 List<E> 인터페이스 add(E e) add(int index, E e) addAll(Collection c) get(in index) remove(int index) remove(Object o) removeAll(Collection c) isEmpty() contains(Object o) size() …

예제 7-3 : LinkedList에 문자열 저장 (p.26 예제와 동일) import java.util.*; public class LinkedListEx { public static void main(String[] args) { // 문자열만 삽입가능한 LinkedList 컬렉션 생성 LinkedList<String> list = new LinkedList<String>(); // 키보드로부터 4개의 이름 입력받아 LinkedList에 삽입 Scanner scanner = new Scanner(System.in); for(int i=0; i<4; i++) { System.out.print(“Enter name>>"); String s = scanner.next(); // 키보드로부터 이름 입력 list.add(s); // LinkedList 컬렉션에 삽입 } // LinkedList에 들어 있는 모든 이름 출력 for(int i=0; i<a.size(); i++) { // LinkedList의 i 번째 문자열 얻어오기 String name = list.get(i); System.out.print(name + " "); // 가장 긴 이름 출력 int longestIndex = 0; for(int i=1; i<list.size(); i++) { if( list.get(longestIndex).length() < list.get(i).length()) longestIndex = i; } System.out.println("\nThe longest name : " + list.get(longestIndex)); Enter name>>Mike Enter name>>Jane Enter name >>Ashley Enter name >>Helen Mike Jane Ashley Helen The longest name : Ashley

LinkedList<E> as a stack Stack : Last-In First-Out (LIFO) 연결리스트의 head (first element) = stack top 데이터의 추가, 삭제 모두 맨 앞에서 스택으로 사용할 때 push() pop()

StringReverse.java LinkedList를 스택으로 사용하여 주어진 문자열을 거꾸 로 출력하는 프로그램 import java.util.*; public class StringReverse { public static void main( String[] args ) String s = "abcdedf"; LinkedList<Character> stack = new LinkedList<Character>(); for(int i=0; i<s.length(); i++) stack.push( s.charAt(i) ); while( stack.isEmpty()==false ) System.out.print( stack.pop() ); System.out.println(); } fdedcba

CheckBrace.java 문자열에 들어 있는 괄호가 맞는지 검사한다. 괄호는 [], {}, ()를 사용할 수 있으며, 서로 중첩할 수 있다. import java.util.*; public class CheckBrace { public static void main( String[] args ) String s = "( 4 + [ 3 + { x - y } / 2 ] ) * 7 "; LinkedList<Character> stack = new LinkedList<Character>(); for(int i=0; i<s.length(); i++) char c = s.charAt(i); if ( c=='(' || c=='[' || c=='{' ) stack.push( c ); System.out.println( stack ); }

[ ( ] [ [, ( ] [ {, [, ( ] [ ] Match if ( c==')' || c==']' || c=='}' ) if ( stack.isEmpty() ) System.out.println("Not match"); System.exit(1); } char d = stack.pop(); System.out.println( stack ); if ( ( c==')' && d!='(' ) || ( c==']' && d!='[' ) || ( c=='}' && d!='{' ) ) } // for if ( !stack.isEmpty() ) System.out.println("Match"); } // main [ ( ] [ [, ( ] [ {, [, ( ] [ ] Match

LinkedList<E> as a queue Queue : First-In First-Out 데이터의 추가는 맨 뒤에 (tail) 데이터의 삭제는 맨 앞에서 (head) Queue<E> interface 오류 시 예외 발생 오류 시 false/null 리턴 데이터 추가 add() offer() 데이터 삭제 remove() poll() Head 데이터 조회 element() peek()

QueueTest.java p.8 스택예제와 동일함. import java.util.*; public class QueueTest { public static void main( String[] args ) LinkedList< String > myQueue = new LinkedList< String > (); System.out.println( "myQueue.empty()--> " + myQueue.isEmpty() ); System.out.println(); myQueue.offer( "1st" ); System.out.println( myQueue ); myQueue.offer( "2nd" ); System.out.println( myQueue ); myQueue.offer( "3rd" ); System.out.println( myQueue ); myQueue.offer( "4th" ); System.out.println( myQueue ); myQueue.empty()--> true [1st] [1st, 2nd] [1st, 2nd, 3rd] [1st, 2nd, 3rd, 4th]

System. out. println( "myQueue. peek()--> " + myQueue System.out.println( "myQueue.peek()--> " + myQueue.peek() ); System.out.println(); String element; System.out.println( myQueue ); element = myQueue.poll(); System.out.println( "myQueue.poll() --> " + element ); myQueue.offer( "5th" ); System.out.println( myQueue ); } myQueue.peek()--> 1st [1st, 2nd, 3rd, 4th] myQueue.poll() --> 1st [2nd, 3rd, 4th] myQueue.poll() --> 2nd [3rd, 4th, 5th]]

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

HashSet<E> Set<E> 인터페이스 HashSet<E> 데이터의 중복을 허용하지 않음, 데이터의 순서가 없음 HashSet<E>, TreeSet<E>, … HashSet<E> 데이터를 해쉬테이블에 저장함 메쏘드 boolean add(E e) : Adds the specified element to this set if it is not already present. void clear() : Removes all of the elements from this set. boolean contains(Object o) : Returns true if this set contains the specified element. boolean isEmpty() : Returns true if this set contains no elements. Iterator<E> iterator() : Returns an iterator over the elements in this set. boolean remove(Object o) : Removes the specified element from this set int size() : Returns the number of elements in this set (its cardinality).

HashSetTest.java import java.util.*; public class HashSetTest { public static void main( String[] args ) String[] arr = { "a", "b", "c", "d" }; HashSet< String> hset = new HashSet< String >(); for( String s : arr ) hset.add( s ); System.out.println( hset ); hset.remove( "d" ); hset.add( “a” ); [d, b, c, a] b c a

HashSetTest.java // Enhanced for for( String s : hset) System.out.print( s + " " ); System.out.println(); // iterator Iterator<String> it = hset.iterator(); while( it.hasNext() ) { String s = it.next(); } [d, b, c, a] b c a

NoDuplication.java arr = a b b a a a c list = [a, b, b, a, a, a, c] import java.util.*; public class NoDuplication { public static void main( String[] args ) String[] arr = { "a", "b", "b", "a", "a", "a", "c" }; System.out.print( "arr = " ); for( String s : arr ) System.out.print( s + " " ); System.out.println( ); List<String> list = Arrays.asList( arr ); System.out.println( "list = " + list ); HashSet<String> hset = new HashSet<String>( list ); System.out.println( "hset = " + hset ); } arr = a b b a a a c list = [a, b, b, a, a, a, c] hset = [b, c, a]

Lotto645.java 1~45 사이의 정수 중에서 서로 다른 6개를 선택하여 출력 import java.util.*; public class Lotto645 { public static void main( String[] args ) HashSet<Integer> hset = new HashSet<Integer>(); Random rand = new Random(); while( hset.size() < 6 ) hset.add( 1 + rand.nextInt(45) ); System.out.println( hset ); ArrayList<Integer> list = new ArrayList<Integer>( hset ); Collections.sort( list ); System.out.println( list ); } [35, 1, 18, 38, 21, 23] [1, 18, 21, 23, 35, 38]

컬렉션을 위한 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

HashMap<K,V> HashMap<K,V> 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션 java.util.HashMap K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정 키와 값이 한 쌍으로 삽입 키는 해시맵에 삽입되는 위치 결정에 사용 값을 검색하기 위해서는 반드시 키 이용 삽입 및 검색이 빠른 특징 요소 삽입 : put() 메소드 요소 검색 : get() 메소드 예) HashMap<String, String> 생성, 요소 삽입, 요소 검색 HashMap<String, String> h = new HashMap<String, String>(); h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 해시맵에 삽입 String kor = h.get("apple"); // "apple" 키로 값 검색. kor는 "사과“

HashMap<String, String>의 내부 구성과 put(), get() 메소드 HashMap<String, String> map = new HashMap<String, String>();

HashMap<K,V>의 주요 메소드

예제 7-5 : HashMap을 이용하여 ID와 PW를 쌍으로 저장하고 검색하는 사례 import java.util.*; public class HashMapTest { public static void main(String[] args) { // ID와 PW의 쌍을 저장하는 HashMap 컬렉션 생성 HashMap<String, String> db = new HashMap<String, String>(); // 3 개의 (key, value) 쌍을 db에 저장 db.put("schan", "h1234"); db.put("mkpark", "parkminkyu"); db.put("mshin", "sunny11"); System.out.println( db ); // db 컬렉션에 들어 있는 모든 (key, value) 쌍 출력 Set<String> keys = db.keySet(); // key 문자열을 가진 Set 리턴 Iterator<String> it = keys.iterator(); while( it.hasNext() ) { String key = it.next(); String value = db.get(key); System.out.printf( "(%s, %s)\n”, key, value ); } // ID를 입력 받고, 검색하여 PW 출력 Scanner scanner = new Scanner(System.in); for(int i=0; i<3; i++) { System.out.print(“ID: "); String id = scanner.next(); System.out.println( db.get(id) ); } ({mkpark=parkminkyu, mshin=sunny11, schan=h1234} (mkpark, parkminkyu) (mshin, sunny11) (schan, h1234) ID: mkpark parkminkyu ID: schan h1234 ID: babo null “babo”를 해시맵에서 찾을 수 없기 때문에 null 리턴

예제 7-6 HashMap을 이용하여 자바 과목의 점수를 기록 관리하는 코드 작성 import java.util.*; public class HashMapScoreEx { public static void main(String[] args) { // 사용자 이름과 점수를 기록하는 HashMap 컬렉션 생성 HashMap<String, Integer> scoreDB = new HashMap<String, Integer>(); // 5 개의 점수 저장 scoreDB.put(“Han", 97); scoreDB.put(“Kim", 34); scoreDB.put(“Lee", 98); scoreDB.put(“Jung", 70); scoreDB.put(“Park", 99); System.out.println("HashMap size: " + scoreDB.size() ); // 모든 사람의 점수 출력. // scoreDB에 들어 있는 모든 (key, value) 쌍 출력 // key 문자열을 가진 집합 Set 컬렉션 리턴 Set<String> keys = scoreDB.keySet(); // key 문자열을 순서대로 접근할 수 있는 Iterator 리턴 Iterator<String> it = keys.iterator(); while( it.hasNext() ) { String name = it.next(); int score = scoreDB.get(name); System.out.println(name + " : " + score); } HashMap size: 5 Jung : 70 Lee : 98 Park : 99 Han : 97 Kim : 34

예제 7-7 HashMap을 이용한 학생 정보 저장 id와 전화번호로 구성되는 Student 클래스를 만들고, 이름을 ‘키’로 하고 Student 객체를 ‘값’으로 하는 해시맵을 작성하라. import java.util.*; class Student { // 학생을 표현하는 클래스 int id; String tel; public Student(int id, String tel) { this.id = id; this.tel = tel; } public class HashMapStudentEx { public static void main(String[] args) { // 학생 이름과 Student 객체를 쌍으로 저장하는 HashMap 컬렉션 생성 HashMap<String, Student> map = new HashMap<String, Student>(); // 3 명의 학생 저장 map.put(“Park", new Student(1, "010-111-1111")); map.put(“Han", new Student(2, "010-222-2222")); map.put(“Lee", new Student(3, "010-333-3333")); System.out.println("HashMap size :" + map.size()); // 모든 학생 출력. map에 들어 있는 모든 (key, value) 쌍 출력 // key 문자열을 가진 집합 Set 컬렉션 리턴 Set<String> names = map.keySet(); // key 문자열을 순서대로 접근할 수 있는 Iterator 리턴 Iterator<String> it = names.iterator(); while(it.hasNext()) { String name = it.next(); // 다음 키. 학생 이름 Student student = map.get(name); System.out.println(name + " : " + student.id + " " + student.tel); } HashMap size :3 Lee : 3 010-333-3333 Park : 1 010-111-1111 Han : 2 010-222-2222 출력된 결과는 삽입된 결과와 다르다는 점을 기억하기 바람

Collections 클래스 활용 Collections 클래스 java.util 패키지에 포함 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴 모든 메소드는 static 타입 주요 메소드 컬렉션에 포함된 요소들을 소팅하는 sort() 메소드 요소의 순서를 반대로 하는 reverse() 메소드 요소들의 최대, 최솟값을 찾아내는 max(), min() 메소드 특정 값을 검색하는 binarySearch() 메소드

예제 7-8 : Collections 클래스의 활용 실행하는 사례를 살펴보자. import java.util.*; public class CollectionsEx { public static void main( String[] args ) { LinkedList<String> myList = new LinkedList<String>(); myList.add(“Transformer”); myList.add(“Starwars”); myList.add(“Matrix”); myList.add(0,“Terminator”); myList.add(2,“Avatar”); System.out.println( myList ); Collections.sort( myList ); // 요소 정렬 int index = Collections.binarySearch( myList, “Starwars”) ; System.out.println( “Starwars is at “ + index ); Collections.reverse( myList ); // 요소의 순서를 반대로 } [Terminator, Transformer, Avatar, Starwars, Matrix] [Avatar, Matrix, Starwars, Terminator, Transformer] Starwars is at 2 [Transformer, Terminator, Starwars, Matrix, Avatar]