Java
-
아이템33. 타입 안전 이종 컨테이너를 고려하라.Java/이펙티브 자바 2023. 11. 9. 15:22
핵심정리 - 타입 토큰을 사용한 타입 안전 이종 컨테이너 -타입 안전 이종 컨테이너: 한 타입의 객체만 담을 수 있는 컨테이너가 아니라 여러 다른 타입 (이종)을 담을 수 있는 타입 안전한 컨테이너. - 타입 토큰: String.class 또는 Class - 타입 안전 이종 컨테이너 구현 방법: 컨테이너가 아니라 "키"를 매개변수화 하라! public class Favorites { private Map .class 도 활용가능하다! public class Favorites2 { private final Map annotationType = null; // 비한정적 타입 토큰 try { annotationType = Class.forName(annotationTypeName); } catch (Excep..
-
아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라.Java/이펙티브 자바 2023. 11. 5. 21:10
핵심정리 - 제네릭 가변인수 배열에 값을 저장하는 것은 안전하지 않다. ㆍ힙 오염이 발생할 수 있다 (컴파일 경고 발생) ㆍ자바7에 추가된 @SafeVarargs 애노테이션을 사용할 수 있다. static void dangerous(List... stringLists) { // List[] myList = new ArrayList[10]; // 컴파일러가 허용하지 않는다! List intList = List.of(42); Object[] objects = stringLists; objects[0] = intList; // 힙 오염 발생 String s = stringLists[0].get(0); // ClassCastException } @SafeVarargs // 가변인자는 안전하게 사용되고 있다. s..
-
아이템31. 한정적 와일드카드를 사용해 API 유연성을 높이라Java/이펙티브 자바 2023. 10. 31. 16:32
핵심정리 - Chooser와 Union API 개선 PECS : Producer-Extends, Consumer-Super - Producer-Extends ㆍObject의 컬렉션 Number나 Integer를 넣을 수 있다. ㆍNumber의 컬렉션에 Integer를 넣을 수 있다. - Consumer-Super ㆍInteger의 컬렉션의 객체를 꺼내서 Number의 컬렉션에 담을 수 있다. ㆍNumber나 Integer의 컬렉션의 객체를 꺼내서 Object의 컬렉션에 담을 수 있다. - 예시) // 코드 31-2 E 생산자(producer) 매개변수에 와일드카드 타입 적용 (182쪽) public void pushAll(Iterable list, int i, int j) { list.set(i, lis..
-
아이템29 & 아이템30Java/이펙티브 자바 2023. 9. 28. 16:05
아이템29. 핵심 정리 - 이왕이면 제네릭 타입으로 만들라 - 배열을 사용하는 코드를 제네릭으로 만들 때 해결책 두 가지 - 첫번째 방법 : 제네릭 배열(E[]) 대신에 Object 배열을 생성한 뒤에 제네릭 배열로 형변환한다. ㆍ형변환을 배열 생성시 한 번만 한다. ㆍ가독성이 좋다. ㆍ힙 오염이 발생할 수 있다. - 두번째 방법 : 제네릭 배열 대신에 Object 배열을 사용하고, 배열이 반환한 원소를 E로 형변환한다. ㆍ원소를 읽을 때마다 형변환을 해줘야 한다. 아이템29. 완벽 공략 - 한정적 타입 매개 변수 Bounded Type Parameters - 매개변수화 타입을 특정한 타입으로 한정짓고 싶을 때 사용할 수 있다. ㆍ, 선언할 수 있는 제네릭 타입을 Number를 상속(extends)했거나..
-
아이템28. 배열보다는 리스트를 사용하라Java/이펙티브 자바 2023. 9. 23. 12:28
핵심 정리1 - 배열과 제네릭은 잘 어울리지 않는다. - 배열은 공변(covariant), 제네릭은 불공변 - 배열은 실체화(reify) 되지만, 제네릭은 실체화 되지 않는다. (소거) ㆍ제네릭은 컴파일할 때 타입이 사라진다. - new Generic[배열] 은 컴파일 할 수 없다. - 제네릭 소거 : 원소의 타입은 컴파일 타임에만 검사하며 런타임에는 알 수 없다. public static void main(String[] args) { // 공변 : 같이 변한다. Object[] anything = new String[10]; anything[0] = 1; // 잘못된 동작이지만 컴파일러가 잡지 못한다. - 런타임 에러 // 불공변 : 같이 변하지 않는다. List names = new ArrayLis..
-
아이템 27. 비검사 경고를 제거하라Java/이펙티브 자바 2023. 9. 21. 10:30
핵심 정리 - "비검사 (unchecked) 경고" 란? ㆍ컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분치 않을 때 발생시키는 경고 public static void main(String[] args) { Set names = new HashSet(); Set strings = new HashSet(); } - 할 수 있는 한 모든 비검사 경고를 제거하라. - 경고를 제거할 수 없지만 안전하다고 확신한다면 @SuppressWarnings("unchecked") 애노테이션을 달아 경고를 숨기자 - @SuppressWarnings 애노테이션은 항상 가능한 한 좁은 범위에 적용하자. - @SuppressWarnings("unchecked") 애노테이션을 사용할 때면 그 경고를 무시해도 안전한 이유를 ..
-
아이템26. 로 타입은 사용하지 말라.Java/이펙티브 자바 2023. 9. 18. 13:04
핵심 정리 - 제네릭 용어 정리 - 로 타입 : List - 제네릭 타입 : List - 매개변수화 타입 : List - 타입 매개변수 : E - 실제 타입 매개변수 : String - 한정적 타입 매개변수 : List - 비한정적 와일드카드 타입 : Class ㆍ아무런 타입이나 다 받는다. - 한정적 와일드카드 타입 : Class의 차이는? ㆍ 한종류를 다루는 Set ㆍ와일드 카드 시 add라는 함수로 값을 넣을 수 없다. (null은 가능) -> 안전성 확보 public class Numbers { static int numElementsInCommon(Set s1, Set s2) { // 해당 컬렉션에 아무거나 넣을 수 있다. int result = 0; for (Object o1 : s1) { i..
-
아이템 22 & 아이템 23 & 아이템 24 & 아이템 25Java/이펙티브 자바 2023. 9. 7. 11:02
아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라. 핵심 정리 - 상수를 정의하는 용도로 인터페이스를 사용하지 말 것! ㆍ클래스 내부에서 사용할 상수는 내부 구현에 해당한다. ㆍ내부 구현을 클래스의 API로 노출하는 행위가 된다. ㆍ클라이언트에 혼란을 준다. public class MyClass implements PhysicalConstants{ public static void main(String[] args) { System.out.println(PhysicalConstants.ELECTRON_MASS); System.out.println(BOLTZMANN_CONTANT); // 상속 시 위와 같이 사용 가능 - 인터페이스의 의도(타입 정의) 오염 } } - 상수를 정의하는 방법 ㆍ특정..