chapter13. 제네릭. 


13.1 왜 제네릭을 사용해야 되는가?


* 제네릭(Generic)이란

// 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것 

// 제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거 할 수 있게 되었다.

// 자바5부터 새로 추가된 기능이다.

// 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용된다

// 제네릭을 모르면 API 도큐먼트를 해석할 수 없다 (API 도큐먼트를 보면 제네릭 표현이 많기 때문에)




* 제네릭을 사용하므로서 얻는 이점

// 컴파일시 강한 타입 체크를 할 수 있다.

// 실행시 타입 에러가 나는 것보다는 컴파일시에 미리 타입을 강하게 체크해서 에러를 사전에 방지한다


- 타입변환을 제거할 수 있다. (불필요한 타입 변환은 프로그램 성능에 악영향을 미침)



13.2 제네릭 타입(class<T>, interface<T>)

- 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.

// 선언시 클래스 또는 인터페이스 이름 뒤에 "<>" 부호가 붙는다

// "<>"사이에는 타입 파라미터가 위치한다



- 타입 파라미터

// 일반적으로 대문자 알파벳 한문자로 표현한다

// 개발 코드에서는 타입 파라미터 자리에 구체적인 타입을 지정해야 한다


- 제네릭 타입을 사용할 경우의 효과

// 비제네릭

: Object 타입을 사용하므로서, 빈번한 타입 변환 발생 -> 성능 저하


비제네릭 타입 이용 // 실행클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec02.exam01_none_generic_type;
 
public class BoxExample {
 
    public static void main(String[] args) {
        Box box = new Box();
        box.set("홍길동"); //String->Object(자동변환)
        String name = (String) box.get();//Object->String(강제변환)
        
        box.set(new Apple()); // Apple -> Object(자동변환)
        Apple apple = (Apple) box.get(); // Object->Apple(강제변환)
    }
 
}
cs


Box 클래스

1
2
3
4
5
6
7
8
9
10
11
package sec02.exam01_none_generic_type;
 
public class Box {
    private Object object;
    public void set(Object object) {
        this.object = object;
    }
    public Object get() {
        return object;
    }
}
cs


Apple 클래스

1
2
3
4
5
package sec02.exam01_none_generic_type;
 
public class Apple {
 
}
cs



* 제네릭

// 클래스를 선언할 때 타입 파라미터 기술

// 컴파일시 타입 파라미터가 구체적인 클래스로 변경됨



  

제네릭 타입 이용 // 실행 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
package sec02.exam02_generic_type;
 
public class BoxExample {
    public static void main(String[] args) {
        Box<String> box1 = new Box<String>();
        box1.set("hello");
        String str = box1.get();
 
        Box<Integer> box2 = new Box<Integer>();
        box2.set(6);
        int value = box2.get();
    }
}
cs

 

 Box 클래스

1
2
3
4
5
6
7
package sec02.exam02_generic_type;
 
public class Box<T> {
    private T t;
    public T get() { return t; }
    public void set(T t) { this.t = t; }
}
cs


Posted by 너래쟁이
: