Growth-Collectors / effective-java

repository for effective java study
3 stars 2 forks source link

아이템 26. 로 타입은 사용하지 말라 #26

Open HanaHww2 opened 1 year ago

HanaHww2 commented 1 year ago

아이템 26. 로 타입은 사용하지 말라

📌 용어정리

한글 용어 영문 용어
매개변수화 타입 parameterized type List
실제 타입 매개변수 actual type parameter String
제네릭 타입 generic type List
정규 타입 매개변수 formal type parameter E
비한정적 와일드카드 타입 unbounded wildcard type List<?>
로 타입 raw type List
한정적 타입 매개변수 bounded type parameter
재귀적 타입 한정 recursive type bound <T extends Comparable>
한정적 와일드카드 타입 bounded wildcard type List<? extends Number>
제네릭 메서드 generic method static List asList(E[] a)
타입 토큰 type token String.class

제네릭을 사용하는 이유

public class Item26 {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        list.add(10);
        list.add(20);
        list.add("30");//컴파일 에러 발생Integer i = (Integer)list.get(2);

        System.out.println(list);
    }
}

java: incompatible types: java.lang.String cannot be converted to java.lang.Integer

로 타입

로 타입(raw type)이란?

로 타입을 사용하면 안 되는 이유

public class Item26 {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(10);
        list.add(20);
        list.add("30");

        Integer i = (Integer)list.get(2);//런타임 에러 발생

        System.out.println(list);
    }
}

Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') at item26.Item26.main(Item26.java:13)

  • 에러는 가능한 한 발생 즉시, 이상적으로는 컴파일할 때 발견하는 것이 좋다
  • 위 예시에서는 에러가 발생하고 한참 뒤인 런타임에서야 알아챌 수 있다
  • 이렇게 되면 런타임에 문제를 겪는 코드와 원인을 제공한 코드가 물리적으로 상당히 떨어져 있을 가능성이 커진다
  • 따라서 디버깅이 힘들어진다
  • 로 타입을 쓰면 제네릭이 안겨주는 안정성과 표현력을 모두 잃게 된다
  • 안정성) 컴파일 시점에서 타입을 체크한다
  • 표현력) 특정 타입의 인스턴스를 사용한다는 정보가 주석이 아닌 타입 선언 자체에서 명시된다(List)
  • 로 타입은 제네릭 이전 코드들과의 호환성을 위해서만 사용한다

로 타입의 대안

임의 객체를 허용하는 매개변수화 타입