본문 바로가기
공부/Java

[즐거운자바] 객체지향(8) - 제네릭

by 다음에바꿔야지 2023. 10. 18.

<ObjectBox>

어떤 객체를 저장할 수 있고 꺼낼 수 있는 Box를 만들어보자.

public class ObjectBox {
	private Object object;
    
    // 저장한다
    public void set(Object obj) {
    	this.object = obj;
    }
    
    // 꺼낸다
    public Object get() {
    	return this.object;
    }
}
public class ObjectBoxMain {
	public static void main(String[] args) {
    	ObjectBox box = new ObjectBox;
        
        box.set("kim");
        String str = (String)box.get();	// 형 변환 필요
        System.out.println(str.toUpperCase()); // KIM 출력 
        
        box.set(new Integer(5));
        Integer i = (Integer)box.get();	// 형 변환 필요
        System.out.println(i.intValue());
    }
}

ObjectBox는 object 타입을 가지기 때문에 object 후손들을 넣었다가 꺼낼 수 있다. 단, 꺼내서 사용할 때는 원래 타입으로 변환시키는 과정이 필요하다.

 

그래서 형 변환 필요없이, 박스에 타입을 지정하고 수정할 수 있는 GenericBox 가 필요하다.

 

<GenericBox>

public class GenericBox<T> {
    private T t;
    
    public void set(T obj) {
    	this.t = obj;
    }
    
    public T get() {
    	return this.t;
    }
}

<T>: T라는 이름의 제네릭 타입을 선언한다.

제네릭은 클래스 이름 뒤나, 메소드의 리턴타입 앞에 붙을 수 있다.

public class GenericBoxMain {
    public static void main(String[] args) {
    	// String을 저장할 수 있는 Box를 만든다.
        GenericBox<String> genericBox = new GenericBox<>();

        genericBox.set("kim");
        String str = genericBox.get();
        System.out.println(str.toUpperCase());

    	// Integer을 저장할 수 있는 Box를 만든다.
        GenericBox<Integer> intBox = new GenericBox<>();

        intBox.set(new Integer(5));
        Integer intValue = intBox.get();
        System.out.println(intValue);

        GenericBox<Object> objBox = new GenericBox<>();

        objBox.set("hello");
        String str2 = (String)objBox.get();	//object박스에 들어있었기 때문에 형변환 필요.
        System.out.println(str);
    }
}

제네릭의 장점: 정해진 타입만 사용하도록 강제한다. -> 타입을 강제하면 컴파일할때 잘못된 타입의 값이 저장되는 것을 방지할 수 있다.