Presentation is loading. Please wait.

Presentation is loading. Please wait.

[INA470] Java Programming Youn-Hee Han

Similar presentations


Presentation on theme: "[INA470] Java Programming Youn-Hee Han"— Presentation transcript:

1 [INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr
14. 제네릭과 컬렉션 [INA470] Java Programming Youn-Hee Han

2 1. 제네릭 클래스 제네릭 프로그래밍(generic programming)
일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법 제네릭은 컬렉션 라이브러리에 많이 사용

3 1. 제네릭 클래스 Generic 처리를 위한 기존의 방법 일반적인 객체를 처리하려면 Object 참조 변수를 사용

4 1. 제네릭 클래스 Generic 처리를 위한 기존의 방법 Store 객체 s는 어떠한 타입의 객체라도 저장할 수 있다.
문제점 데이터를 꺼낼 때마다 항상 타입 변환 요구됨 (위의  참조) 문자열을 저장하고서도 부주의하게 Integer 객체로 형변환을 할 수 있으며 이것은 컴파일시간이 아니라 런타임시에 오류를 발생시킴 예외: ClassCastException

5 1. 제네릭 클래스 Generic 처리를 위한 새로운 방법
Generic Class 정의시에 타입을 매게변수로 받는 Type Parameter (<T>) 를 정의한다. Type Parameter에 할당되는 타입은 프로그래머에 의해 Generic Class의 객체를 생성할 때에 결정된다. 문자열을 저장하려면 다음과 같이 객체 생성 Store<String> store = new Store<String>(); 정수를 저장하려면 다음과 같이 객체 생성 Store<Integer> store = new Store<Integer>();

6 1. 제네릭 클래스 Generic 처리를 위한 새로운 방법

7 1. 제네릭 클래스 Generic 처리를 위한 새로운 방법 Generic 사용 전

8 1. 제네릭 클래스 Generic 처리를 위한 새로운 방법 Generic 사용 후

9 2. 제네릭 메소드 Generic 메소드 Type Parameter를 사용하여서 제네릭 메소드를 정의할 수 있다.
Type Parameter의 Scope가 메소드 내부로 제한된다. Type Parameter <T>는 변경자와 리턴형 사이에 위치 배열의 마지막 원소를 반환하는 메소드

10 2. 제네릭 메소드 Generic 클래스 및 메소드 관련예제 (1/2) import java.util.*;
GenericTest.java import java.util.*; public class GenericTest { public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } public static void main(String[] args) { Set<String> s1 = new HashSet<String>(Arrays.asList("Tom", "Dick", "Harry")); Set<String> s2 = new HashSet<String>(Arrays.asList("Larry", "Moe", "Curly")); Set<Integer> s3 = new HashSet<Integer>(Arrays.asList(new Integer(1), new Integer(2))); Set<String> us1 = GenericTest.union(s1, s2); Set us2 = GenericTest.union(s1, s3); System.out.println(us1); System.out.println(us2);

11 2. 제네릭 메소드 Generic 클래스 및 메소드 관련예제 (2/2) import java.util.*;
GenericTest.java import java.util.*; public class GenericTest { public static <T> Set<T> union(Set<T> s1, Set<T> s2) { Set<T> result = new HashSet<T>(s1); result.addAll(s2); return result; } public static void main(String[] args) { Set<String> s1 = new HashSet<String>(Arrays.asList("Tom", "Dick", "Harry")); Set<String> s2 = new HashSet<String>(Arrays.asList("Larry", "Moe", "Curly")); Set<Integer> s3 = new HashSet<Integer>(Arrays.asList(new Integer(1), new Integer(2))); Set<String> us1 = GenericTest.union(s1, s2); //Set us2 = GenericTest.union(s1, s3); System.out.println(us1); //System.out.println(us2);

12 2. 제네릭 메소드 한정 타입 매개 변수 (Bounded Type Parameter) 위 코드에서 발생가능한 문제점
compareTo() 메소드를 구현하지 않은 타입 T 가 사용되면 컴파일은 되지만 실행시간에 에러 발생 그러므로, compareTo() 메소드를 구현하도록 강제하는 Comparable 인터페이스를 구현하는 타입 T임을 명시할 필요 있음 public class Array { public static <T> T getMax(T[] a) { if (a == null || a.length == 0) return null; T largest = a[0]; for (int i = 1; i < a.length; i++) { if (largest.compareTo(a[i]) > 0) largest = a[i]; } return largest;

13 2. 제네릭 메소드 한정 타입 매개 변수 (Bounded Type Parameter)
위와 같은 코드를 작성하면 컴파일시에 타입 T가 Comparable을 구현하고 있는지 미리 파악할 수 있다. 주의할 점 <> 내부에 implements 키워드가 아닌 extends 키워드를 사용 public class Array { public static <T extends Comparable> T getMax(T[] a) { if (a == null || a.length == 0) return null; T largest = a[0]; for (int i = 1; i < a.length; i++) { if (largest.compareTo(a[i]) > 0) largest = a[i]; } return largest;

14 3. 컬렉션 컬렉션(Collection) 컬렉션(collection)은 자바에서 자료 구조를 구현한 클래스
자료 구조로는 리스트(list), 스택(stack), 큐(queue), 집합(set), 해쉬 테이블(hash table) 등이 있다. 프로그램을 작성하면서 자료를 저장해야 하는 경우 현재 문제에 가장 적합한 최선의 자료 구조를 선택해서 사용해야 한다.

15 3. 컬렉션 컬렉션(Collection)의 종류 컬렉션 인터페이스 컬렉션 컬렉션 클래스
: 이 인터페이스를 직접 구현하여 자신만의 클래스를 만들어 사용가능 컬렉션 (Map까지 포함한 통칭) 컬렉션 클래스 : 이미 위 인터페이스 중 하나를 구현하고 있는 클래스 : 바로 사용이 가능하다.

16 4. Collection 인터페이스 컬렉션(Collection) 인터페이스가 제공하는 메소드

17 5. ArrayList List 인터페이스 순서를 가지는 원소들의 모임 중복된 원소가 허용된다.
위치인덱스를 사용하여 원소에 접근한다. (0부터 시작) 구현한 클래스 종류 ArrayList: 리스트를 배열로 구현 LinkedList: 리스트를 연결리스트로 구현 Vector: 멀티쓰레드 환경에서 동기화가 지원됨

18 5. ArrayList ArrayList 클래스
일반적인 배열과 다르게 저장되는 데이터의 개수에 따라 자동적으로 저장 크기(capacity)가 변화된다. 즉, 원소가 가득차면 자동으로 동적으로 저장 크기(capacity)를 늘린다. ArrayList는 가변 크기(variable capacity)의 배열 ArrayList의 생성 ArrayList<String> list = new ArrayList<String>(); 원소 추가 list.add( "MILK" ); list.add( "BREAD" ); list.add( "BUTTER" );

19 5. ArrayList ArrayList 클래스 저장된 것을 가져올 때 String s = list.get(1);

20 5. ArrayList ArrayList 클래스 예제 import java.util.*;
ArrayListTest.java import java.util.*; public class ArrayListTest { public static void main(String args[]) { ArrayList<String> list = new ArrayList<String>(); list.add("MILK"); list.add("BREAD"); list.add("BUTTER"); list.add(1, "APPLE"); // 인덱스 1에 “APPLE"을 삽입 list.set(2, "GRAPE"); // 인덱스 2의 원소를 “GRAPE"로 대체 list.remove(3); // 인덱스 3의 원소를 삭제한다. for (int i = 0; i < list.size(); i++) System.out.println(list.get(i)); System.out.println("Index of APPLE: " + list.indexOf("APPLE")); System.out.println("Size of list: " + list.size()); } for (String s : list) System.out.println(s);

21 5. ArrayList Iterator (반복자) 컬렉션의 원소들을 하나씩 처리하는데 사용
Iterator e = list.iterator(); Iterator 객체 e에 정의된 3 개의 메소드 실제로 이 두 개의 메소드 사용

22 5. ArrayList Iterator 사용 예제 import java.util.*;
ArrayListTest.java import java.util.*; public class ArrayListTest { System.out.println("[Iterator Test]"); String s; Iterator e = list.iterator(); while(e.hasNext()) { s = (String)e.next(); System.out.println(s); } 기존 코드에 추가

23 5. ArrayList ListIterator
List를 구현한 클래스인 ArrayList, LinkedList, Vector에만 사용 컬렉션의 원소들을 하나씩 처리하는데 사용하지만 앞으로 검색이 가능하기도 하며 뒤로도 검색 가능 컬렉션 객체의 원소를 지니고 있는 Iterator 객체 생성하는 방법 ListIterator e2 = list.listIterator(); ListIterator 객체 e2에 정의된 주요 메소드 hasNext() next() hasPrevious(): 이전의 원소가 있는지 판단 previous(): 이전의 원소를 돌려줌

24 5. ArrayList ListIterator 사용 예제 import java.util.*;
ArrayListTest.java import java.util.*; public class ArrayListTest { System.out.println("[ListIterator Test]"); ListIterator e2 = list.listIterator(); while(e2.hasNext()) { s = (String)e2.next(); System.out.println(s); } while(e2.hasPrevious()) { s = (String)e2.previous(); 기존 코드에 추가

25 6. LinkedList LinkedList 이중 연결 리스트로 구현됨 ArrayList와 사용방법 거의 동일
거의 동일한 메소드가 정의되어 있으며 효과도 동일 LinkedList 에만 추가된 메소드 addFirst(), getFirst(), removeFirst(), removeLast(), addLast(), getLast() ArrayList 를 생성할 시에는 initial capacity를 미리 지정할 수 있는 생성자가 존재하지만 LinkedList에는 그러한 생성자가 없다. 그렇다면 ArrayList와 LinkedList 중 어느 것을 사용하는 것이 좋은 것인가?

26 6. LinkedList ArrayList vs. LinkedList 내부 구현 특징 공간적인 면 접근 속도면 (단순 읽기)
ArrayList는 10개의 공간을 initial capacity로 지닌 이후에 2배씩 늘림 그러므로, 공간의 낭비가 어느정도 있음 LinkedList는 실행 시 필요에 따라 새로운 원소를 위한 공간을 생성하므로 공간이 절약됨 접근 속도면 (단순 읽기) ArrayList는 인덱스와 함께 원소가 저장되는 구조이기 때문에 접근이 빠름 LinkedList는 어떤 원소에 접근하기 위하여 맨 처음부터 따라가서 찾아야 하는 어려움이 있음

27 6. LinkedList ArrayList vs. LinkedList 삭제와 삽입면
ArrayList는 삽입시에는 오른쪽 밀림(Shift Right) 연산이 일어나고 삭제시에는 왼쪽 밀림(Shift Left) 연산이 필요하므로 효율이 좋지 않음 LinkedList는 인접 노드의 포인터만 변경하면 되기 때문에 삭제와 삽입 시간 면에서 유리 A B C D E 1 2 3 4 5 N

28 6. LinkedList ArrayList vs. LinkedList 어떤 자료구조? 검색위주이면 ArrayList가 유리

29 6. LinkedList List를 일반 배열 자료로 변경하기 일반 배열 자료를 List로 변경하기
String[] stringArray = list.toArray(new String[list.size()]); 위에서 toArray의 파라미터로 String 타입의 비어있는 배열 객체를 넣어주어 toArray 메소드로 하여금 만들어야 할 배열의 정확한 타입과 원소 개수를 알도록 해준다. 일반 배열 자료를 List로 변경하기 String[] stringArray = {"AAA", "BBB", "CCC", "DDD"}; List<String> list = Arrays.asList(stringArray);

30 6. LinkedList List배열, 배열List 예제 import java.util.*;
ArrayListTest.java import java.util.*; public class ArrayListTest { System.out.println("[Array ==> List]"); String[] stringArray = {"AAA", "BBB", "CCC", "DDD"}; List<String> list2 = Arrays.asList(stringArray); Iterator e3 = list2.iterator(); while(e3.hasNext()) { s = (String)e3.next(); System.out.println(s); } System.out.println("[List ==> Array]"); String[] stringArray2 = list2.toArray(new String[list2.size()]); for (String s2 : stringArray2) { System.out.println(s2); 기존 코드에 추가

31 7. Set Set 인터페이스의 기본 개념 순서에 상관없이 원소 저장 중복을 허용하지 않음
List 계열 보다는 호출 가능 메소드의 개수가 적음 Collection 인터페이스에 정의된 정도의 메소드만 지원 대표적인 메소드 add(Object o) contains(Object o) isEmpty() remove(Object o) size() iterator() toArray(Object[] a)

32 7. Set Set 의 내부 구현 방법  HashTable (헤시 테이블) 추가되는 각 원소에 대해 Hash Code를 계산

33 7. Set Set 인터페이스를 구현한 클래스 HashSet TreeSet LinkedHashSet 성능면에서 가장 우수
원소들의 순서가 일정하지 않고 예상조차 할 수 없다. TreeSet 레드 블렉 트리(Red-Black Tree) 원소의 내부 내용에 따라서 순서를 고려하여 관리한다. LinkedHashSet 원소가 삽입되는 순서대로 그 순서가 보장된다. 약간의 비용을 들여서 HashSet의 순서무보장의 결함을 해결한다.

34 7. Set Set 관련 예제 1 import java.util.*; public class SetTest {
SetTest.java import java.util.*; public class SetTest { public static void main(String args[]) { HashSet<String> set = new HashSet<String>(); //LinkedHashSet<String> set = new LinkedHashSet<String>(); //TreeSet<String> set = new TreeSet<String>(); set.add("Milk"); set.add("Bread"); set.add("Butter"); set.add("Cheese"); set.add("Ham"); System.out.println(set); }

35 7. Set Set의 대량 연산 메소드 표준적인 집합 연산 수행
위에서 addAll, retainAll, removeAll 메소드는 원집합인 s1을 변경한다. 원집합의 변경을 원하지 않으면 다음과 같이 코딩한다. Set<String> union = new HashSet<String>(s1); union.addAll(s2);

36 7. Set Set의 대량 연산 메소드 예제 import java.util.*; public class SetTest1 {
SetTest1.java import java.util.*; public class SetTest1 { public static void main(String[] args) { Set<String> s1 = new HashSet<String>(); Set<String> s2 = new HashSet<String>(); s1.add("A"); s1.add("B"); s1.add("C"); s2.add("A"); s2.add("D"); Set<String> union = new HashSet<String>(s1); union.addAll(s2); Set<String> intersection = new HashSet<String>(s1); intersection.retainAll(s2); System.out.println("합집합 " + union); System.out.println("교집합 " + intersection); }

37 8. Queue 자료구조 시간에 배운 것을 참고하여 각자 학습 Note: LinkedList 는 Queue의 일종임
Stack도 학습할 것

38 9. Map Map 인터페이스의 개념 Map을 구현한 클래스 사전과 같은 자료 구조 키(key)에 값(value)이 매핑된다.
중복된 키를 가질 수 없다. 키자 제시되면 값을 돌려준다. Key: 학생 객체의 학번, Value: 학생 객체 Map을 구현한 클래스 HashMap TreeMap 트리구조에 데이터를 정렬 만약 키들을 정렬된 순서로 돌려받을 필요가 있을 때 사용 LinkedHashMap

39 9. Map Map 사용 방법 데이터 저장 방법 객체 추출 방법
Map<String, Student> freshman = new HashMap<String, Student>(); Student kim = new Student(" ", "김준표", "서울 서초구"); Freshman.put(" ", kim); 객체 추출 방법 String id = " "; st = freshman.get(s);

40 9. Map Map 사용 예제 1 (autoboxing, unboxing과 함께 사용) import java.util.*;
MapTest.java import java.util.*; class Student { int number; String name; public Student(int number, String name) { this.number = number; this.name = name; } public String toString() { return name;

41 9. Map Map 사용 예제 1 (autoboxing, unboxing과 함께 사용)
MapTest.java public class MapTest { public static void main(String[] args) { Map<Integer, Student> st = new HashMap<Integer, Student>(); st.put( , new Student( , "구준표")); st.put( , new Student( , "금잔디")); st.put( , new Student( , "윤지후")); System.out.println(st); st.remove( ); st.put( , new Student( , "소이정")); System.out.println(st.get( )); for (Map.Entry<Integer, Student> s : st.entrySet()) { int key = s.getKey(); Student value = s.getValue(); System.out.println("key=" + key + ", value=" + value); }

42 9. Map Map 사용 예제 2 import java.util.*; public class WordFreq {
WordFreq.java import java.util.*; public class WordFreq { public static void main(String[] args) { Map<String, Integer> m = new HashMap<String, Integer>(); String[] sample = { "to", "be", "or", "not", "to", "be", "is", "a", "problem" }; // 문자열에 포함된 단어의 빈도를 계산한다. for (String a : sample) { Integer freq = m.get(a); m.put(a, (freq == null) ? 1 : freq + 1); } System.out.println(m.size() + " 단어가 있습니다."); System.out.println(m.containsKey("to")); System.out.println(m.isEmpty()); System.out.println(m); for (String a : sample) { int freq = m.get(a); m.put(a, (freq == 0) ? 1 : freq + 1); } Runtime 시 에러. Why?

43 10. Collection 클래스 Collections 클래스의 유용한 기능 및 정적 메소드 Sorting Shuffling
Collections.sort(List list) 리스트의 정렬에 사용 Shuffling Collections.shuffle(List list, Random rnd) 리스트내의 원소를 섞는데 사용 Searching Collections.binarySearch(List list, Object key) 리스트내에서 특정 원소가 있는지 검사하여 그 위치의 인덱스를 돌려줌

44 10. Collection 클래스 Collections 클래스 사용 예제 1 import java.util.*;
Sort.java import java.util.*; public class Sort { public static void main(String[] args) { String[] sample = { "i", "walk", "the", "line" }; List<String> list = Arrays.asList(sample); // 배열을 리스트로 변경 Collections.sort(list); System.out.println(list); }

45 10. Collection 클래스 Collections 클래스 사용 예제 2-1 import java.util.*;
SortTest.java import java.util.*; class Student implements Comparable<Student> { int number; String name; public Student(int number, String name) { this.number = number; this.name = name; } public String toString() { return name; public int compareTo(Student s) { return number - s.number;

46 10. Collection 클래스 Collections 클래스 사용 예제 2-2 public class SortTest {
SortTest.java public class SortTest { public static void main(String[] args) { Student array[] = { new Student( , "이철수"), new Student( , "김철수"), new Student( , "박철수"), }; List<Student> list = Arrays.asList(array); Collections.sort(list); System.out.println(list); }

47 10. Collection 클래스 Collections 클래스 사용 예제 3 import java.util.*;
Shuffle.java import java.util.*; public class Shuffle { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++) list.add(i); Collections.shuffle(list, new Random(System.currentTimeMillis())); System.out.println(list); }

48 10. Collection 클래스 Collections 클래스 사용 예제 4 import java.util.*;
Search.java import java.util.*; public class Search { public static void main(String[] args) { int key = 50; List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 100; i++) list.add(i); int index = Collections.binarySearch(list, key); System.out.println("탐색의 반환값 =" + index); }

49 10. Collection 클래스 Collections 클래스의 다른 메소드
Object min(Collection coll), Object max(Collection coll) 컬렉션에서 최대값과 최소값을 찾는다. void reverse(List list) list 원소들의 순서를 반대로 바꾼다. void fill(List list, Object obj) list에 지정된 obj로 원소를 채운다. void copy(List dest, List src) src리스트의 원소들을 dest 리스트에 복사한다. void swap(List list, int i, int j) list의 지정된 두 위치의 원소를 바꾼다.


Download ppt "[INA470] Java Programming Youn-Hee Han"

Similar presentations


Ads by Google