1. 제네릭 없이 여러 객체를 저장하는 클래스 작성하기
ex) 사과와 연필을 각각 저장 및 관리
- 사과를 저장(set)하고 가져오기(get)
class Apple {
}
class Goods1 {
private Apple apple = new Apple();
public Apple get() {
return apple;
}
public void set(Apple apple) {
this.apple =apple;
}
}
Goods1 goods1 = new Goods1();
goods1.set(new Apple());
Apple apple = goods1.get();
- 연필을 저장(set)하고 가져오기(get)
class Pencil {
}
class Goods2 {
private Pencil pencil = new Pencil();
public Pencil get() {
return pencil;
}
public void set(Pencil pencil) {
this.pencil = pencil;
}
}
Goods goods2 = new Goods2();
goods2.set(new Pencil());
Pencil pencil = goods2.get();
- 사과와 연필을 저장하고 관리하기 위해 각각의 기능을 수행하는 클래스를 2개 만듬
- 1개의 상품 클래스로 모든 타입의 상품을 저장하고 관리할 수 없을까??
해결책 1. 필드를 모든 자바 클래스의 최상위 클래스인 Object 타입으로 선언
- Object 객체를 저장하고 관리하는 클래스를 생성하면 사과이든 연필이든 저장하거나 읽을 수 있음
- 각 상품마다 각각의 클래스를 생성하는 대신, 최상위 클래스인 Object 타입의 필드를 선언하면 모든 타입의 상품을 저장할 수 있는 클래스를 생성 가능
class Apple {}
class Pencil{}
class Goods {
private Object object = new Object();
public Object get() {
return object;
}
public void set(Object object) {
this.object = object;
}
}
- 저장한 데이터를 각각의 타입(Apple, Pencil)으로 꺼내오기 위해서는 저장된 형태로 캐스팅 해야함
-> Apple 객체를 저장했을 때는 get() 메서드로 가져온 Object를 Apple타입, Pencil 객체를 저장했을 때는 가져온 Object 타입을 Pencil 객체로 다운캐스팅
Goods goods1 = new Goods();
goods1.set(new Apple());
Apple apple = (Apple)goods1.get(); //Object -> Apple
Goods goods2 = new Goods();
goods2.set(new Pencil());
Pencil pencil = (Pencil)goods2.get(); //Object -> Pencil
- 약한 타입 체크(weak type checking) 발생
-> 잘못된 타입 캐스팅에도 문법 오류를 발생시키지 않는 것
-> 잘못 캐스팅했을 때 발생하는 예외인 ClassCastException은 실행예외 이기 때문에 문법 오류 발생 X
ex) Apple 객체를 저장했는데, 가져온 Object를 Pencil 객체로 캐스팅
Goods goods3 = new Goods();
goods3.set(new Apple()); //Apple 객체 저장
Pencil pen = (Pencil)goods3.get(); // Pencil 타입으로 캐스팅 -> ClassCastException 발생
'Java > 문법' 카테고리의 다른 글
16 -3장 제네릭 메서드 (0) | 2023.06.15 |
---|---|
16 -2 장 제네릭의 문법 (0) | 2023.06.15 |
15 - 5장 쓰레드의 상태 (0) | 2023.06.15 |
10 - 6장 최상위 클래스 Object (0) | 2023.06.01 |
10 - 5장 super 키워드와 super() 메서드 (0) | 2023.06.01 |