들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 가변인자는 메서드에 ... 형태로 전달되는 녀석들이다. 가변인자는 배열 ([])로 전달된다. 배열을 사용하는 것은 Heap Polution의 가능성이 있다. Heap Polution은 들어오지 말아야 할 타입의 값이 들어오고, 이 값이 런타임에서 처리될 때 ClassCastException 같은 런타임 에러를 낼 수 있음을 암시한다. 제네릭 가변인수도 마찬가지다. 제네릭 가변인수는 제네릭 []을 생성하고, 제네릭 [] 역시 Heap Polution 가능성이 존재한다. Heap Polution 경고가 뜨지만, Heap Polution이 발생하지 않을 상황에서만 @SafeVarargs를 이용해서 컴파일 경고를 무시한다. ..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 제네릭 사용 시, 유연성을 제공하기 위해 한정적 와일드카드를 제공하자 Producer 타입 (매개변수로 전달된 Collection에서 객체를 꺼내쓰는 것)에는 하나만 사용하는 것은 헬퍼 메서드 등을 재정의 해야하기 때문에 비효율적이다. 와일드카드 하나만 사용할꺼라면 타입 한정 매개변수 를 사용하고, 는 PECS 따를 때만 사용하는 것이 좋다. 핵심 정리 1 : Chooser와 Union API 개선 (사진 붙이기) 와일드 카드(?)를 사용할 때는 PECS 일 때만 사용하자. PECS: Producer-Extends, Consumer-Super Producer-Extends Producer는 매개변수로 전..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 배열은 공변이므로 타입 불안정성이 존재한다. 제네릭은 불공변이므로, 타입 불안정성이 해결된다. 따라서 배열대신 제네릭을 사용한 리스트를 사용하라. 배열은 실체화 되지만, 제네릭은 소거된다. 배열은 컴파일 되어도 바이트 코드에 남아있으나, 제네릭은 컴파일되면 소거되어 바이트 코드에 남아있지 않는다. 제네릭은 컴파일 단계에서 소거되어 Raw 타입으로만 남는다. 대신 컴파일러는 필요한 시점에 캐스팅 코드를 넣어준다. 제네릭 타입의 배열은 생성할 수 없다. 그렇지만 형변환해서 사용할 수는 있다. 배열보다는 리스트를 사용하는 것을 추천한다. 제네릭 타입을 지원하기 때문이다. 배열을 사용할 경우, 특히 상위 타입의..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 어노테이션은 @Retention을 통해서 어노테이션의 참조 시점을 결정할 수 있다. Runtime : JVM 메모리에 올라감 → 런타임 참조 가능 Class : 바이트 코드까지만 참조 가능. Class 파일에만 선언되어있음. Source : 컴파일러가 컴파일 할 때만 참조 가능 @Target 어노테이션을 이용해 어노테이션의 사용 위치를 설정할 수 있음. 완벽 공략 41. 어노테이션 자바 어노테이션을 정의하는 방법 @Retention: 어노테이션의 정보를 얼마나 오래 유지할 것인가 Runtime, Source, Class이 존재함. @Target : 어노테이션을 사용할 수 있는 위치 Type, Field, Method,..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 비검사 경고는 컴파일러가 컴파일 환경에서 타입 안정성을 추론하는데 불안정한 데이터가 제공되면 발생한다. 비검사 경고가 발생하더라도 컴파일이 완료되며 코드도 실행 가능하다. 다만 런타임 에러가 발생할 수 있다. 비검사 경고는 발생하면 가능한한 조치를 취해서 모두 제거해준다. 비검사 경고 제거가 불가능할 경우, @SuppressWarnings("uncheck") 어노테이션으로 비검사 경고를 무시한다. @SuppressWarnings는 타입 안정성을 보장할 수 없지만, 실질적으로 타입 안전할 때 사용한다. @SuppressWarnings는 가능한 좁은 범위에 작성. @SuppressWarnings의 이유를 작..