상세 컨텐츠

본문 제목

제네릭

JAVA

by 빙하둘리 2022. 11. 22. 18:56

본문

728x90

제네릭은 일반화를 위한 일

 

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>

 

매개변수화 타입은 제너릭 타입이라고도 한다.

728x90

관련글 더보기

댓글 영역