[이펙티브자바] 5-26. 로 타입은 사용하지 말라

한지연·2023년 3월 12일

📘 로 타입은 사용하지 말라

📚 제네릭 타입

  • 제네릭 클래스, 제네릭 인터페이스: 클래스와 인터페이스 선언에 타입 매개변수가 쓰인 것
  • 제네릭 클래스와 제네릭 인터페이스를 통들어 제네릭타입이라고 함
  • 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의
    ex: List<String>
  • 제네릭 타입을 정의하면 그에 딸린 로타입도 함께 정의됨
    로타입: 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때

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

// ex
private final Collection collects = ...;
  • 코드를 사용하면 실제로 다른 타입을 넣어도 아무 오류없이 컴파일되고 실행 됨
  • 로 타입을 쓰면 제네릭이 안겨주는 안전성과 표현력 모두 잃게 됨
  • ❗️ 로타입을 만드는 이유
    : 제네릭이 있기 전 코드들과의 호환성 때문

📚 List<Object>

  • 임의 객체를 허용하는 매개변수화 타입
  • 모든 타입을 허용한다는 의사를 컴파일러에 명확히 전달한 것
  • 매개변수로 List를 받는 메서드에 List<String>은 넘길 수 있지만 List<Object>는 넘길 수 없음

📚 와일드카드 타입

  • 타입이 들어갈 자리에 ?를 씀
  • 제네릭 타입을 사용하고 싶지만 실제 타입 매개변수가 무엇인지 신경 쓰고 싶지 않을 때 사용
  • 모종의 타입 객체만 저장할 수 있는 와일드카드 타입
  • 로타입과 달리 안전함

📚 로타입을 사용하는 경우

  • class 리터얼은 로타입 사용
  • instanceOf 연산자
    런타임에는 제네릭타입 정보가 지워지므로 instanceOf 연산자는 비한정적 와일드가드 타입 이 외의 매개변수화 타입에 적용할 수 없음
profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글