본문 바로가기
WEB/Back-end

제네릭 타입(Generic Type) (Java)

by 최새벽 2024. 7. 18.

제네릭

  • 결정되지 않은 타입을 파라미터로 처리하고, 실제 사용 시 파라미터를 구체적인 타입으로 대체시키는 기능
    • Object 타입은 어떤 객체든 다 담을 수 있지만 이후 활용하기 위해 형변환을 해야함
  • 타입을 강제: 컴파일 단계에서 사전에 에러 차단
  • 타입 재정의: 형변환 불필요
  • 제한된 타입 파라미터 / 와일드카드
public class C <T>{
    public T content;
}
  • Box 클래스
@Getter @Setter
public class Box<X> {
    public X content;
}
  • GenericEx 클래스
public class GenericEx {
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        // List: 인터페이스, ArrayList: List 구현 클래스

        // list.add(1);
        list.add("1");

        list.add("홍길동");

        // list.add(new Car());
        list.add((new Car().getModel()));

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
            // 제네릭에서 String으로 지정해줬으므로 get의 return 타입도 String
            // 원래 정의는 E(element)로 되어있음
            // T(Type), K(Key), V(Value), E(Element)라는 의미로 각각 사용
        }

        Box b = new Box(); // 제네릭 안쓰면 경고메시지, Object 타입으로 사용하게 됨
        b.setContent("자바 프로그래밍");

        System.out.println(b.getContent());

        // System.out.println(b.getContent().replace("자바", "파이썬")); Object로 return이 나오므로 replace는 사용 못함
        System.out.println(((String) b.getContent()).replace("자바", "파이썬"));

        Box<String> box = new Box<>();
        box.setContent("자바 프로그래밍");
        System.out.println(box.getContent().replace("자바", "파이썬"));

    }
}

Comparator 재정의

  • 익명 구현, 제네릭, 오버라이딩
int[] arr = {2, 3, 1, 5, 4};
Arrays.sort(arr, new Comparator<T>(){
    @Override
    public int compare(T o1, T o2) {
        // TODO Auto-generated method stub
        return 0;
    }
});

생각해보기..

List<String> list1 = new ArrayList<Object>(); // 오류
List list2 = new ArrayList<Integer>(); // 됨, 근데 list2 요소에 String도 담김....
List<Integer> list3 = new ArrayList<>();

타입 추론

  • 컴파일러가 알아서 타입을 추론해서 넣어줌
  • Java11부터 가능
  • <\T>에 대입 안 하면 안됨
var b = new Box<String>();