Archive

Java Day 16 제네릭,컬렉션

|

Java Day 16 제네릭,컬렉션


  1. 제네릭

    • 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 <타입 파라미터=""> 반환형 메소드명 (타입 매개변수) {...}의 형태.


  2. 컬렉션 프레임워크

    • 자료구조를 바탕으로 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값은 중복 허용이 안된다.


  3. 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
    


  4. 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 : 고길동, 나예리, 다람이, 홍길동
    


  5. 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 : 한국 미국 일본 중국 독일
    


외에도 많은 클래스와 인터페이스, 메소드가 있지만 워낙 방대한 양이라 필요할 때 그때그때 찾아서 사용하자 !




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료