Box 인스턴스에서 내용물을 꺼낼 때 형 변환을 하는데, 실수하면? 답이 없다.
class Apple {
public String toString() {
return "I am an apple.";
}
}
class Orange {
public String toString9) {
return "I am an orange.";
}
}
class Box { // 무엇이든지 담을 수 있는 상자
private Object ob; // Object를 상속하는 인스턴스면 무엇이든 담는다.
public void set(Object o) {
ob = o;
}
public object get() {
return ob;
}
}
class FruitAndBox2 {
public static void main(String[] args) {
Box aBox = new Box(); // 상자 생성
Box oBox = new Box(); // 상자 생성
aBox.set(new Apple()); // 상자에 사과를 담는다.
oBox.set(new Orange()); // 상자에 오렌지를 담는다.
Apple ap = (Apple)aBox.get(); // 상자에서 사과를 꺼낸다.
Orange og = (Orange)oBox.get(); // 상자에서 오렌지를 꺼낸다.
System.out.println(ap);
System.out.println(og);
}
}
실수의 예시) set으로 사과(객체)가 아닌 '문자열'을 담았을 때
그걸 방지하기 위해서 제네릭이라는게 생겼다!
Object형 인스턴스를 저장하고 반환하는 Box 클래스
자료형에 의존적이지 않은 형태로 클래스를 정의하기 위해서 Object를 T로 대체
class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get(0 {
return ob;
}
}
T는 인스턴스를 생성할 때 결정하면 된다. 사과 저장 목적이면 T를 Apple로 결정하고, 오렌지를 저장할 목적이면 T를 Orange로 결정하면 된다. 인스턴스 생성 시 T의 자료형을 결정하는 것이 '제네릭'
class Box<T> 표시를 해준 이유) 완성된 제너릭 기반의 클래스 정의라는 것을 알려주기 위해서
즉, 이를 통해 T는 인스턴스 생성 시 자료형을 결정하기 위한 표식임을 알리는 것이다.
Box<Apple> aBox = new Box<Apple>();
->T를 Apple로 결정하여 인스턴스 생성
->따라서 Apple 또는 Apple을 상속하는 하위 클래스의 인스턴스 저장 가능
타입 매개변수) Box<T>에서 T
타입 인자) Box<Apple>에서 Apple
매개변수화 타입) Box<Apple>
매개변수화 타입은 제너릭 타입이라고도 한다.
제네릭 심화 문법 마무리 (0) | 2022.12.19 |
---|---|
자바는 문자열의 끝을 표시하나요? (0) | 2022.12.18 |
String 배열 관련 글 (0) | 2022.11.17 |
[JAVA] 윤성우 자바 네스티드(Nested) 클래스와 이너(Inner) 클래스 ③ (0) | 2022.11.13 |
자바 getter setter 복습 노트 (0) | 2022.09.21 |
댓글 영역