충분히 쌓여가는
13.1 제네릭이란? 본문
제네릭
결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
Object 타입은 모든 클래스의 최상위 부모 클래스
따라서 모든 객체는 부모 타입인 Object로 자동 타입 변환이 된다
Box 클래스에 넣을 내용물로 content 필드를 선언
Box는 다양한 내용물을 저장해야 하므로 특정 클래스 타입으로 선언할 수 없다
그래서 Object 타입으로 선언함
public class Box {
public Object content;
}
content는 Object 타입이므로 어떤 객체가 대입되어 있는지 확실하지 않다
대입된 내용물의 타입을 안다면 강제 타입 변환을 거쳐 얻을 수 있다
Box box = new Box();
String content = (String) box.content
어떤 내용물이 저장되어 있는지 모른다면 instanceof 연산자로 타입을 조사할 수 있지만
모든 종류의 클래스를 대상으로 조사할 수는 없다
따라서 Object 필드를 선언하는 것은 좋은 방법이 아니다
Box를 생성하기 전에 어떤 내용물을 넣을지 미리 알고 있고
Box를 생성할 때 저장할 내용물의 타입을 미리 알려주면 Box는 content에 무엇이 대입되고, 읽을 때 어떤 타입으로 제공할지를 알게된다
이것이 제네릭이다
즉 제네릭(Generic)이란, 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
Box 클래스에서 결정되지 않은 content 타입을 T라는 타입 파라미터로 정의한 것이다
public class Box <T> {
public T content;
}
<T>
T가 타입 파라미터임을 뜻하는 기호로 타입이 필요한 자리에 T를 사용할 수 있음을 알려주는 역할을 한다
T대신 A부터 Z까지 어떤 알파벳을 사용해도 된다
주의할 점
타입 파라미터를 대체하는 타입은 클래스 및 인터페이스라는 것
ex. Box<int>는 기본 타입이기 때문에 안되고 Box<Integer>이어야 한다
만약 Box의 내용물로 String을 저장하고 싶다면 Box를 생성할 때 타입 파라미터 T 대신 String으로 대체하면 된다
Box<String> box = new Box<String>();
box.content = "안녕하세요";
String content = box.content; //강제 타입 변환 없이 "안녕하세요"를 바로 얻을 수 있다
Box의 내용물로 100을 저장하고 싶다면 타입 파라미터 T 대신 Integer로 대체하면 된다
Box<Integer> box = new Box<Integer>();
box.content = 100;
int content = box.content; //강제 타입 변환 없이 100을 바로 얻을 수 있다
변수를 선언할 때와 동일한 타입으로 호출하고 싶다면 생성자 호출 시 생성자에는 타입을 명시하지 않고 <>만 붙일 수 있다
Box<String> box = new Box<String>();
Box<String> box = new Box<>(); //가능
Box<Integer> box = new Box<Integer>();
Box<Integer> box = new Box<>(); //가능
예제
package ch13.sec01;
public class Box<T> {
public T content;
}
package ch13.sec01;
public class GenericExample {
public static void main(String[] args) {
Box<String> box1 = new Box<>();
box1.content = "안녕하세요";
String str = box1.content;
System.out.println(str);
Box<Integer> box2 = new Box<>();
box2.content = 100;
int value = box2.content;
System.out.println(value);
}
}
안녕하세요
100
'이것이 자바다 > 13 제네릭' 카테고리의 다른 글
13.2 제네릭 타입 (0) | 2024.04.11 |
---|