본문 바로가기

Java/문법

16 -1장 제네릭 클래스와 제네릭 인터페이스

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