2018-4-8 TIL JAVA Generic(2)

타겟타입

  • 자바의컴파일러는 생략된 자료형 정보에 대해서 유추를 할 수 있다. 컴파일러가 생각보다 자료형을 유추를 하는 것이 다양하다.
package yoon;

class EmptyBoxFactory {
    public static <T> Box2<T> makeBox() {
        Box2<T> box = new Box2<>();
        return box;
    }
}

public class TargetTypes {
    public static void main(String [] args) {
        Box2<Integer> iBox = EmptyBoxFactory.<Integer>makeBox();
        iBox.set(25);
        System.out.println(iBox.get());
    }
}
//result
25
  • makeBox메소드에서 인자를 전달받지 않았다. 위의 메소드에서는 인자를 전달받지 않았으므로, T에 대한 타입인자를 전달해야한다.
  • Box iBox = EmptyBoxFactory.makeBox()
  • T의 유추에 사용된 정보 Box2를 가리켜 '타겟타입'이라고한다.

와일드카드

class Unboxer {
    public static <T> T openBox(Box2<T> box) {
        return box.get();
    }

    // 상자안의 내용물을 확인하는 기능의 제네릭 메소드
    // ?는 와일드카드 기호이다
    public static <T> void peekBox(Box2<?> box) {
        System.out.println(box);
    }
}

public class WildcardUnboxer {
    public static void main(String [] args) {
        Box2<String> box = new Box2<>();
        box.set("So Simpe String");
        Unboxer.peekBox(box);
    }
}
//result
So Simple String
  • Box2<?> box와 같이 ?기호로 표시되는 와일드카드를 선언하면, Box2, Box2와 Box2를 기반으로 생성된 매개변수를 전달받을 수 있다.
public static <T> void peekBox(Box<T> box) {
	System.out.println(box);
    // 제네릭 메소드 정의
}

public static void peekBox(Box<?> box) {
	System.out.println(box);
    // 와일드카드 기반의 메소드 정의
}
  • 위의 두 메소드는 기능이 완전 동일하지만, 코드가 조금 더 간결해지는 이유로 와일드카드 기반의 메소드를 더 선호한다.
Written on April 8, 2018