명품 JAVA Essential 1
2 학습목표 1. 컬렉션과제네릭개념 2. Vector<E> 활용 3. ArrayList<E> 활용 4. HashMap<K,V> 활용 5. Iterator<E> 활용 6. 사용자제네릭클래스만들기
컬렉션 (collection) 의개념 3 컬렉션 요소 (element) 라고불리는가변개수의객체들의저장소 객체들의컨테이너라고도불림 요소의개수에따라크기자동조절 요소의삽입, 삭제에따른요소의위치자동이동고정크기의배열을다루는어려움해소다양한객체들의삽입, 삭제, 검색등의관리용이
컬렉션자바인터페이스와클래스 4 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>
컬렉션의특징 5 1. 컬렉션은제네릭 (generics) 기법으로구현 제네릭 특정타입만다루지않고, 여러종류의타입으로변신할수있도록클래스나메소드를일반화시키는기법 클래스나인터페이스이름에 <E>, <K>, <V> 등타입매개변수포함 제네릭컬렉션사례 : 벡터 Vector<E> <E> 에서 E 에구체적인타입을주어구체적인타입만다루는벡터로활용 정수만다루는컬렉션벡터 Vector<Integer> 문자열만다루는컬렉션벡터 Vector<String> 2. 컬렉션의요소는객체만가능 int, char, double 등의기본타입으로구체화불가 컬렉션사례 Vector<int> v = new Vector<int>(); // 컴파일오류. int 는사용불가 Vector<Integer> v = new Vector<Integer>(); // 정상코드
제네릭은형판과같은개념 6 제네릭 클래스나메소드를형판에서찍어내듯이생산할수있도록 일반화된형판을만드는기법
제네릭의기본개념 7 제네릭 JDK 1.5 부터도입 (2004 년기점 ) 모든종류의데이터타입을다룰수있도록일반화된타입매개변수로클래스 ( 인터페이스 ) 나메소드를작성하는기법 C++ 의템플릿 (template) 과동일 정수스택 정수만저장 class Stack<E> {... void push(e element) {... E pop() {...... 제네릭스택 특정타입으로구체화... void push(integer element) {... Integer pop() {......... void push(string element) {... String pop() {...... 문자열스택 20-345 123 10 Good C# C++ Java 문자열만저장
8 제네릭 Stack<E> 클래스
Vector<E> 9 벡터 Vector<E> 의특성 <E> 에사용할요소의특정타입으로구체화 배열을가변크기로다룰수있게하는컨테이너 배열의길이제한극복 요소의개수가넘치면자동으로길이조절 요소객체들을삽입, 삭제, 검색하는컨테이너 삽입, 삭제에따라자동으로요소의위치조정 Vector 에삽입가능한것 객체, null 기본타입의값은 Wrapper 객체로만들어저장 Vector 에객체삽입 벡터의맨뒤, 중간에객체삽입가능 Vector 에서객체삭제 임의의위치에있는객체삭제가능
Vector<Integer> 벡터컬렉션내부 10 Vector<Integer> v = new Vector<Integer>(); add() 를이용하여요소를삽입하고 get() 을이용하여요소를검색합니다
타입매개변수사용하지않는경우경고발생 11 Vector 로만사용하면경고발생 Vector<Integer> 나 Vector<String> 등타입매개변수를사용하여야함
12 Vector<E> 클래스의주요메소드
Vector<Integer> 컬렉션활용사례 13
Vector<Integer> 컬렉션활용사례 ( 계속 ) 14
컬렉션과자동박싱 / 언박싱 15 JDK 1.5 이전 기본타입데이터를 Wrapper 객체로만들어삽입 Vector<Integer> v = new Vector<Integer>(); v.add(new Integer(4)); 컬렉션으로부터요소를얻어올때, Wrapper 클래스로캐스팅필요 Integer n = (Integer)v.get(0); int k = n.intvalue(); // k = 4 JDK 1.5 부터 자동박싱 / 언박싱이작동하여기본타입값삽입가능 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> 컬렉션활용 16 정수만다루는 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 삽입 // 벡터속의모든정수더하기 int sum = 0; for(int i=0; i<v.size(); i++) { int n = v.elementat(i); // 벡터의 i 번째정수 sum += n; System.out.println(" 벡터에있는정수합 : " + sum); // 벡터중간에삽입하기 v.add(2, 100); // 4 와 -1 사이에정수 100 삽입 System.out.println(" 벡터내의요소객체수 : " + v.size()); System.out.println(" 벡터의현재용량 : " + v.capacity()); // 모든요소정수출력하기 for(int i=0; i<v.size(); i++) { int n = v.get(i); // 벡터의 i 번째정수 System.out.println(n); 벡터내의요소객체수 : 4 벡터의현재용량 : 10 5 4 100-1 벡터에있는정수합 : 108
예제 7-2 : Point 클래스의객체들만저장하는벡터만들기 17 점 (x, y) 를표현하는 Point 클래스의객체만다루는벡터의활용을보여라. import java.util.vector; class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; public class PointVectorEx { public static void main(string[] args) { 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)); public String tostring() { return "(" + x + "," + y + ")"; v.remove(1); // 인덱스 1 의 Point(-5, 20) 객체삭제 // 벡터에있는 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) (30,-8)
ArrayList<E> 18 가변크기배열을구현한클래스 <E> 에요소로사용할특정타입으로구체화 벡터와거의동일 요소삽입, 삭제, 검색등벡터기능과거의동일 벡터와달리스레드동기화기능없음 다수스레드가동시에 ArrayList 에접근할때동기화되지않음. 개발자가스레드동기화코드작성 ArrayList<String> = new ArrayList<String>();
19 ArrayList<E> 클래스의주요메소드
ArrayList<String> 컬렉션활용사례 20
ArrayList<String> 컬렉션활용사례 ( 계속 ) 21
예제 7-3 : 문자열만다루는 ArrayList<String> 활용 22 이름을 4 개입력받아 ArrayList 에저장하고, ArrayList 에저장된이름을모두출력한후, 제일긴이름을출력하라. import java.util.*; public class ArrayListEx { public static void main(string[] args) { // 문자열만삽입가능한 ArrayList 컬렉션생성 ArrayList<String> a = new ArrayList<String>(); // 키보드로부터 4 개의이름입력받아 ArrayList 에삽입 Scanner scanner = new Scanner(System.in); for(int i=0; i<4; i++) { System.out.print(" 이름을입력하세요 >>"); String s = scanner.next(); // 키보드로부터이름입력 a.add(s); // ArrayList 컬렉션에삽입 // ArrayList 에들어있는모든이름출력 for(int i=0; i<a.size(); i++) { // ArrayList 의 i 번째문자열얻어오기 String name = a.get(i); System.out.print(name + " "); // 가장긴이름출력 int longestindex = 0; for(int i=1; i<a.size(); i++) { if(a.get(longestindex).length() < a.get(i).length()) longestindex = i; System.out.println("\n 가장긴이름은 : " + a.get(longestindex)); 이름을입력하세요 >>Mike 이름을입력하세요 >>Jane 이름을입력하세요 >>Ashley 이름을입력하세요 >>Helen Mike Jane Ashley Helen 가장긴이름은 : Ashley
컬렉션의순차검색을위한 Iterator 23 Iterator<E> 인터페이스 리스트구조의컬렉션에서요소의순차검색을위한인터페이스 Vector<E>, ArrayList<E>, LinkedList<E> 가상속받는인터페이스 Iterator 객체얻어내기 컬렉션의 iterator() 메소드호출 해당컬렉션을순차검색할수있는 Iterator 객체리턴컬렉션검색코드 Vector<Integer> v = new Vector<Integer>(); Iterator<Integer> it = v.iterator(); while(it.hasnext()) { // 모든요소방문 int n = it.next(); // 다음요소리턴... Vector<Integer> 객체와 Iterator 객체의관계
예제 7-4 : Iterator<Integer> 를이용하여정수벡터검색 24 예제 7-1 의코드중에서벡터검색부분을 Iterator<Integer> 를이용하여수정하라. 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 를이용하여모든정수더하기 int sum = 0; it = v.iterator(); // Iterator 객체얻기 while(it.hasnext()) { int n = it.next(); sum += n; System.out.println(" 벡터에있는정수합 : " + sum); // Iterator 를이용한모든정수출력하기 Iterator<Integer> it = v.iterator(); // Iterator 객체얻기 while(it.hasnext()) { int n = it.next(); System.out.println(n); 5 4 100-1 벡터에있는정수합 : 108
HashMap<K,V> 25 키 (key) 와값 (value) 의쌍으로구성되는요소를다루는컬렉션 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> 의내부구성 26 HashMap<String, String> map = new HashMap<String, String>();
27 HashMap<K,V> 의주요메소드
HashMap<String, String> 컬렉션활용사례 28
29 예제 7-5 : HashMap<String, String> 로 ( 영어, 한글 ) 단어쌍을저장하고검색하기 영어단어와한글단어의쌍을 HashMap 에저장하고, 영어단어로한글단어를검색하는프로그램을작성하라. import java.util.*; public class HashMapDicEx { public static void main(string[] args) { // 영어단어와한글단어의쌍을저장하는 HashMap 컬렉션생성 HashMap<String, String> dic = new HashMap<String, String>(); // 3 개의 (key, value) 쌍을 dic 에저장 dic.put("baby", " 아기 "); // "baby" 는 key, " 아기 " 은 value dic.put("love", " 사랑 "); dic.put("apple", " 사과 "); // dic 해시맵에들어있는모든 (key, value) 쌍출력 Set<String> keys = dic.keyset(); // 모든키를 Set 컬렉션에받아옴 Iterator<String> it = keys.iterator(); // Set 에접근하는 Iterator 리턴 while(it.hasnext()) { String key = it.next(); // 키 String value = dic.get(key); // 값 System.out.print("(" + key + "," + value + ")"); System.out.println(); // 영어단어를입력받고한글단어검색 Scanner scanner = new Scanner(System.in); for(int i=0; i<3; i++) { System.out.print(" 찾고싶은단어는?"); String eng = scanner.next(); // 해시맵에서 ' 키 ' eng 의 ' 값 ' kor 검색 String kor = dic.get(eng); if(kor == null) System.out.println(eng + " 는없는단어입니다."); else System.out.println(kor); (love, 사랑 )(apple, 사과 )(baby, 아기 ) 찾고싶은단어는?apple 사과찾고싶은단어는?babo babo 는없는단어입니다. 찾고싶은단어는?love 사랑
제네릭만들기 30 제네릭클래스작성 클래스이름옆에일반화된타입매개변수추가 val 의타입은 T public class MyClass<T> { T val; void set(t a) { val = a; T get() { return val; 제네릭객체생성및활용 T 타입의값 a 를 val 에지정 T 타입의값 val 리턴 제네릭클래스 MyClass 선언, 타입매개변수 T 제네릭타입에구체적인타입을지정하여객체를생성하는것을구체화라고함 MyClass<String> s = new MyClass<String>(); // T 를 String 으로구체화 s.set("hello"); System.out.println(s.get()); // "hello" 출력 MyClass<Integer> n = new MyClass<Integer>(); // T 를 Integer 로구체화 n.set(5); System.out.println(n.get()); // 숫자 5 출력
예제 7-6 : 제네릭스택만들기 31 스택을제네릭클래스로작성하고, String 과 Integer 형스택을사용하는예를보여라. class GStack<T> { int tos; Object [] stck; public GStack() { tos = 0; stck = new Object [10]; public void push(t item) { if(tos == 10) return; stck[tos] = item; tos++; public T pop() { if(tos == 0) return null; tos--; return (T)stck[tos]; public class MyStack { public static void main(string[] args) { GStack<String> stringstack = new GStack<String>(); stringstack.push("seoul"); stringstack.push("busan"); stringstack.push("la"); for(int n=0; n<3; n++) System.out.println(stringStack.pop()); GStack<Integer> intstack = new GStack<Integer>(); intstack.push(1); intstack.push(3); intstack.push(5); for(int n=0; n<3; n++) System.out.println(intStack.pop()); LA busan seoul 5 3 1