Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

제네릭 (Generic) 본문

Java/Java Basic

제네릭 (Generic)

snd-snd 2019. 9. 4. 00:29

제네릭이란?

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
Comments