Formoat's Open Blog
제네릭 (Generic) 본문
제네릭이란?
1) 클래스 내부에서 사용할 데이터 타입을 외부에서 인스턴스 생성시 지정하는 기법
2) 데이터 타입을 매개변수화 시키고 컴파일시에 구체적인 타입을 강력하게 체크
3) 컬렉션, 람다식(함수적 인터페이스), 스트림 등에서 사용되고 있다.
# 제네릭 타입의 클래스/인터페이스
public class 클래스<T> { ... }
public interface 인터페이스<T> { ... }
(1) 클래스/인터페이스 선언시 이름뒤에 <>기호 와 함께 타입 파라미터가 위치한다.
(2) 타입 파라미터는 일반적으로 대문자 알파벳 한문자로 표현하기로 약속되어 있다.
(3) 인스턴스 생성시 타입 파라미터가 위치한 자리에 구체적인 타입을 지정해야 한다.
# 제네릭 타입 이전의 코드
public class Test {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
Test test = new Test();
test.set("블럭");
String block = (String) test.get();
모든 클래스는 Object클래스의 자식이라는 점을 살려 형변환을 시키는 방법으로 코드를 작성할 수 있지만 빈번한 타입변환 과정을 통해 성능이 저하될 수 있고, 잘못된 변환으로 데이터 손실이 일수 있다는 단점이 있다.
Test.java (이전의 코드를 제네릭화)
public class Test<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
Test<String> test = new Test<String>(); // 인스턴스 생성시 구체적인 타입을 명시 <String>타입
test.set("블럭");
String block = test.get();
Test<Integer> test = new Test<Integer>(); // 인스턴스 생성시 구체적인 타입을 명시 <Integer>타입
test.set(10);
int value = test.get();
제네릭 메소드
1) 매개변수의 타입과 리턴 타입을 타입 파라미터로 갖는 메소드를 지칭한다.
2) 리턴 타입의 앞에 <>기호와 타입 파라미터를 기술
public <T, U> T method(U u) { ... }
# 제한된 타입 파라미터
타입 파라미터에 지정되는 구체적인 타입을 제한 해야할 필요가 있을경우 사용되며
상속 및 구현관계를 이용해 타입 파라미터를 제한할 수 있다.
// 제한된 타입 파라미터의 예시
public <T extends Parent> T method(T t) { ... }
// 위의 타입 파라미터에는 Parent타입 또는 Parent의 자식/구현 클래스들만 대입될 수 있다.
< 주의사항 >
제한된 타입 파라미터 사용시 메소드 구현부 안에서는 상위 타입(Parent)의 멤버만 사용이 가능하다.
타입 파라미터로 상위타입/자식/구현 클래스가 대입될 수 있는데, 스펙트럼이 부모타입 까지 구현이 가능해야 하기 때문에
부모 클래스가 가지고 있지않은 멤버를 사용할 수 있다면 오류가 발생할 것임이 분명하다.
# 와일드 카드 타입
제네릭 타입을 매개변수, 리턴타입으로 사용할 때 타입 파라미터를 제한할 목적으로 사용
와일드 카드 타입의 형태 (제한없음, 상위타입 제한, 하위타입 제한)
(1) 제네릭 타입<?> : 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있다.
(2) 제네릭 타입<? extends Parent> : 타입 파라미터를 대치하는 구체적인 타입으로 지정한 상위 타입부터 하위 타입이 올 수 있다.
(3) 제네릭 타입<? super Child>타입 파라미터를 대치하는 구체적인 타입으로 지정한 하위 타입부터 상위 타입이 올 수 있다.
'Java > Java Basic' 카테고리의 다른 글
IO 패키지 입출력 (Input & Output Stream) (0) | 2019.09.10 |
---|---|
Java API Document (0) | 2019.09.04 |
스트림 최종 처리 (0) | 2019.09.04 |
스트림 중간 처리 (0) | 2019.09.04 |
스트림 (Stream) (0) | 2019.09.04 |