본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 28.배열보다는 리스트를 사용하라.

by 띵커베르 2023. 2. 11.
728x90
  • 배열은 불안정 할 수 있다.
  • 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다.
  • 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보도 소거된다.
  • 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면, 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자.
//공변
Object[] objects = new Long[1];
objects[0] = "타입이 달라 넣을 수 없다.";
//불공변
List<Object> o1 = new ArrayList<Long>(); //호환되지 않는 타입이다.
o1.add("타입이 달라 넣을 수 없다.");
  • 배열은 런타임때 에러가 발생하고, 리스트를 사용하면 컴파일 시 바로 알 수 있다.
  • 제네렉은 타입 정보가 런타임에는 소거된다.
    • 이는 자바 5버전 이전의 하위호환 떄문에 컴파일러가 List<String> 이라는걸 바이트 코드로 변경할때  String 부분을 Object 으로 변경하고, 기존 List<String> 이라 적은 부분으로, 값을 깨낼때 캐스팅을 유추하여 값을 꺼낸다.
  • 가변인자(varargs) 를 사용할시 경고가 뜰 수 있는데 이는 @SafeVarargs 어노테이션으로 무시할 수있지만 정말 이 값으로 단순한 작업을 할대만 사용하는것이 좋을듯 싶다.
728x90

댓글