제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점
- 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라 실제 사용하는 생성 시점에 타입을 결정하는 것임
- 메서드의 매개변수와 인자의 관계와 비슷함
void method1() {
printIn("hello");
}
"hello"라는 값만 출력할 수 있음 void method2(String param) {
println(param);
}
void main() {
method2("hello");
method2("hi");
}
String param)를 지정하고, 매서드를 사용할 때 원하는 값을 인자("hello", "hi")로 전달하면 됨//method2("hello") 호출 예
void method2(String param="hello") {
println(param);
}
//method2("hi") 호출 예
void method2(String param="hi") {
println(param);
}
void method(String param) // 매개변수
void main() {
String arg = "hello";
ethod(arg) //인수 전달
}
String paramarg제네릭도 앞서 설명한 메서드의 매개변수와 인자의 관계와 비슷하게 작동함
제네릭 클래스를 정의할 때 내부에서 사용할 타입을 미리 결정하는 것이 아니라, 해당 클래스를 실제 사용하는 생성 시점에 내부에서 사용할 타입을 결정하는 것임
차이가 있다면 메서드의 매개변수는 사용할 값에 대한 결정을 나중으로 미루는 것이고, 제네릭의 타입 매개변수는 사용할 타입에 대한 결정을 나중으로 미루는 것임
- 메서드의 매개변수에 인자를 전달해서 사용할 값을 결정함
- 제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정함
제네릭에서 사용하는 용어도 매개변수, 인자의 용어를 그대로 가져다 사용함
다만 값이 아니라 타입을 결정하는 것이기 때문에 앞에 타입을 붙임
- 타입 매개변수:
GenericBox<T>에서T- 타입 인자:
GenericBox<Integer>에서IntegerGenericBox<String>에서String
제네릭 타입의 타입 매개변수 <T>에 타입 인자를 전달해서 제네릭 사용 타입을 결정함
GenericBox<T>
String->GenericBox<String>Integer->GenericBox<Integer>
int등)을 모두 합쳐서 부르는 말class GenericBox<T> { private T t; }GenericBox<T>를 제네릭 타입이라고 함GenericBox<T>T를 타입 매개변수라고 함GenericBox<Integer>Integer를 타입 인자라고 함class Data(K, V) {}
int, double...)은 사용할 수 없음Integer, Double)를 사용하면 됨package generic.ex1;
public class RawTypeMain {
public static void main(String[] args) {
GenericBox integerBox = new GenericBox();
//GenericBox<Object> integerBox = new GenericBox<>(); // 권장
integerBox.set(10);
Integer result = (Integer) integerBox.get();
System.out.println("result = " + result);
}
}
result = 10
<>를 사용해서 사용 시점에 원하는 타입을 지정해야 함<>을 지정하지 않을 수 있는데, 이런 것을 raw type 또는 원시 타입이라고 함GenericBox integerBox = new GenericBox();
Object로 사용된다고 이해하면 됨제네릭 타입을 사용할 때는 항상 <>를 사용해서 사용시점에 타입을 지정해야 하는데, 이런 raw 타입을 지원하는 이유
자바의 제네릭이 자바가 처음 등장할 때부터 있었던 것이 아니라, 자바가 오랜기간 사용된 이후에 등장했기 때문
제네릭이 없던 시절의 과거 코드와의 하위 호환이 필요했음
따라서 어쩔 수 없이 이런 raw type을 지원함
결론적으로 raw type을 사용하지 않는 것이 권장됨
Object 타입을 사용해야 한다면, 아래와 같이 타입 인자로 Object를 지정해서 사용하는 것이 권장됨GenericBox<Object> integerBox = new GenericBox<>();