Java Day 16 제네릭,컬렉션
22 Dec 2020 | JavaJava Day 16 제네릭,컬렉션
-
제네릭
- Generic을 사용하면 타입 오류를 컴파일 과정에서 강하게 체크하여 미연에 방지 할 수 있다.
- 타입 변환을 제거하여 프로그램 성능을 향상시킬 수 있다.
//Generic을 사용하지 않은 경우 ArrayList list = new ArrayList(); list.add("안녕?"); String str = (String) list.get(0); //명시적 타입변환이 필요 //Generic을 사용한 경우 ArrayList<String> list = new ArrayList<String>(); list.add("안녕?"); String str = list.get(0); //타입변환 필요 x
- Generic 타입을 가지는 클래스와 인터페이스를 활용하여 타입변환을 최소화 할 수 있다.
- 타입 파라미터는 일반적으로 대문자 한 글자로 표현한다, T, K, V 등등..
public class Zoo<T> { private T t; public T get() { return t; } public void set(T t){ this.t = t; } } //Generic 타입 Class의 사용 Zoo<String> zoo = new Zoo<String>(); zoo.set("fox"); String str = zoo.get(); //fox 출력 Zoo<Integer> zoo = new Zoo<Integer>(); zoo.set(20); int age = zoo.get(); //20 출력
- Generic 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드다.
- public <타입 파라미터=""> 반환형 메소드명 (타입 매개변수) {...}의 형태.타입>
-
컬렉션 프레임워크
- 자료구조를 바탕으로 java.util 패키지에서 제공하는 컬렉션과 관련된 인터페이스 및 클래스
- 이들을 모아놓은 것이 컬렉션 프레임워크(Collection Framework)다.
- 주요 인터페이스로는 List, Queue, Set, Map이 있다.
- List 인터페이스는 중복을 허용하고 순서가 있는 자료를 관리한다. FILO (First In Last Out), LIFO(Last In First Out)의 자료구조를 가진다.
- Queue 인터페이스는 FIFO(First In First Out) 자료구조를 가진다.
- Set 인터페이스는 중복을 허용하지 않고 순서가 없다. 집합 형태의 자료구조.
- Map 인터페이스는 key-value 쌍으로 이루어져있고 key값은 중복 허용이 안된다.
-
List 인터페이스
- Stack, Vector, ArrayList 클래스가 있으며 물리적으로 배열과 같은 형태이지만 가변길이를 지원한다.
- Vector와 ArrayList는 동일하게 기능하지만 Vector는 멀티 쓰레드 환경에서 동기화를 지원하나 성능면에서 ArrayList보다 떨어진다.
주요 메소드는 너무 방대하므로 그때그때 구글링해서 사용하자..
import java.util.*; public class StackEx{ public static void main(String[] args){ String[] group = {"1","2","3","4","5"}; Stack<String> stack = new Stack<>(); for(String n : group){ stack.push(n); } while(!stack.isEmpty()){ System.out.println(stack.pop()); } } }//output : 5 4 3 2 1
-
Set 인터페이스
- HashSet, TreeSet 클래스가 있고 HashSet은 순서 없이 결과값을 출력하고 TreeSet은 결과값을 오름차순으로 정렬하여 출력한다.
- 인덱스가 없기때문에 인덱스를 매개로 갖는 메소드가 없다. (당연한 말이지만)
- 인덱스가 없어서 for문을 못돌리니깐 iterator 객체를 생성하여 요소를 순회 할 수 있다.
import java.util.*; class Adata { int x; public Adata(int x){ this.x = x; } public void disp(){ System.out.println("x = "+x); } } public class HashSetEx{ public static void main(String[] args) { Adata ap = new Adata(1); Adata bp = new Adata(2); Adata cp = new Adata(3); HashSet<Adata> hs = new HashSet<>(); //타입을 유추 할 수 있을때 제네릭의 생략 표현이 가능하다 hs.add(ap); hs.add(bp); hs.add(cp); Iterator<Adata> ir = hs.iterator(); //순회자(반복자) 생성 while(ir.hasNext()){ //hasNext() : 다음 요소가 있으면 true 반환 ir.next().disp(); //next() : 다음에 있는 요소를 반환 } } }//output : 3 1 2 출력 (순서가 없다)
//TreeSet 활용 (오름차순) import java.util.*; public class TreeSetTest{ public static void main(String[] args){ TreeSet<String> ts = new TreeSet<String>(); ts.add("홍길동"); ts.add("고길동"); ts.add("나예리"); ts.add("다람이"); for(String str : ts){ System.out.println(str); } } }//output : 고길동, 나예리, 다람이, 홍길동
-
Map 인터페이스
- HashMap, HashTable, TreeMap(key값으로 정렬), Properties 클래스가 있다.
- 대체로 키를 매개로 갖는 메소드가 많다.
import java.util.*; public class MapEx{ public static void main(String[] args){ String[] msg = {"한국","미국","일본","중국","독일"}; HashMap<Integer,String> hm = new HashMap<>(); for(int i=0; i<msg.length; i++){ hm.put(i, msg[i]); } Set<Integer> keys = hm.keySet(); for(Integer n : keys){ System.out.println(hm.get(n)); } } }//output : 한국 미국 일본 중국 독일
외에도 많은 클래스와 인터페이스, 메소드가 있지만 워낙 방대한 양이라 필요할 때 그때그때 찾아서 사용하자 !
참고 자료
KG아이티뱅크 자바 강의자료