본문 바로가기

JAVA

[Java] 5-1강 - Generic Programming 1 (generic의 기본)

0. Generic Programming 

각 type별로 코드를 따로 만드는 것이 아니라

같은 코드로 여러 type을 다루는 방법

(동일한 코드는 한 번만 만드는 게 좋다.)

이와 같이 A, B라는 class 말고

아래와 같이 Object라는 class로 한 번에 다루면 됩니다.

 

하지만 이 또한 type casting을 해야하는 등 불편한 점이 많습니다.


 

그래서 Generic class라는 것을 생성하도록 합니다.

 

1. Generic Class

1) Generic Class 기본

1> Generic Class 정의

[1] class 이름과 (<T>)

[2] class 내부 특정 object의 type을 (T)

아래와 같이 T로 설정합니다.

(T는 type에서 비롯된 글자이지만 T가 아닌 다른 문자를 써도 됩니다.)

2> Generic Class 활용

instance를 만들 때, T의 type을 <>로 알려줍니다.

 

2) Generic Class에서 여러 개의 type variable을 사용

1> Generic Class 정의

2> Generic Class 활용

굳이 type variable을 중복할 필요가 없으므로

비워놓아도 

자동으로 type variable을 순서대로 인식합니다.

 

3) 용어 정리

1> Box<T> : generic class

2> T : type variable

3> Box : raw type

4> String : parameterized type (T의 매개변수로 쓰이니까)

 

4) Generic Class의 단점 (한계)

1> type variable (type T)에 static variable로 정의할 수 없습니다. 

type variable의 type은 object가 만들어 질 때 결정되는데

static variable은 object를 만들지 않고 사용하기 때문입니다. (type 결정이 안 되니까)

 

2> generic class 내부에서는 type variable의 instance를 만들 수 없습니다.

(compile 과정에서 <T>는 제거되고 알맞은 type으로 변경합니다.)

-> 3> type variable은 array로 만들 수 없습니다. (generic class 밖에서도 못 만듭니다.)

4> primitive type (e.g. int)은 parameterized type으로 사용할 수 없습니다. 

 

5) example 1

1> class 정의

2> class 활용

[1] 주황 박스

parameterize type은 생성자의 type과 동일해야 합니다.

[2] 노란 박스

Apple은 Fruit의 subclass여서 argument로 넘겨주는 것이 가능합니다.

[3] 하늘색 박스

Toy는 Apple의 subclass가 아니어서 argument로 넘겨주는 것이 불가능합니다.

[4] 하늘색 박스

subclass 아니어서 불가능

 

3> 결론

[1] parameterize type은 생성자의 type과 동일해야 합니다. (상속 관계도 안 됩니다.) (<>는 동일해야 함)

[2] raw type 간에는 상속 관계가 있어도 됩니다. (<> 앞은 상속 관계 있어도 됩니다.)