Java/Effective Java
-
[Effective Java] Item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라Java/Effective Java 2020. 9. 9. 23:56
매개변수화 타입은 불공변(invariant)입니다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때 List은 List의 하위 타입도 상위 타입도 아닙니다. 매개변수화 타입의 불공변이라는 특성보다 유연한 설계가 필요할 때는 한정적 와일드카드를 이용하면 됩니다. public class Stack { public Stack(); public void push(E e); public E pop(); public boolean isEmpty(); } 위 스택 클래스에서 일련의 원소를 넣는 메서드를 추가해야 한다고 가정해보겠습니다. public void pushAll(Iterable src) { for (E e : src) push(e); } 이 메서드는 정상적으로 컴파일되지만, Stack로 선언한 후에 ..
-
[Effective Java] Item 30. 이왕이면 제네릭 메서드로 만들라Java/Effective Java 2020. 9. 7. 23:54
제네릭 메서드 클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있습니다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭입니다. 예를 들어, Collections의 알고리즘 메서드(binarySearch, sort 등)는 모두 제네릭입니다. 타입 안전성이 보장되지 않은 메서드 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 위 메서드는 컴파일은 되지만 타입 안전성이 보장되지 않으므로 new HashSet(s1) 부분과 result.addAll(s2) 부분에서 경고가 발생합니다. 타입 매개변수들을 선언하는 타입 매개변수 목록은 메서드의 제한자와 반환 ..
-
[Effective Java] Item 29. 이왕이면 제네릭 타입으로 만들라Java/Effective Java 2020. 9. 6. 15:27
아래의 클래스는 Effective Java Item 7에서 다루었던 Stack 클래스입니다. import java.util.Arrays; import java.util.EmptyStackException; public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop(..
-
[Effective Java] Item 28. 배열보다는 리스트를 사용하라Java/Effective Java 2020. 9. 5. 22:57
배열과 제네릭 타입의 차이 배열은 공변(covariant)입니다. Sub가 Super의 하위 타입이라면 Sub[]는 배열 Super[]의 하위 타입이 됩니다 (공변, 즉 함께 변한다는 뜻입니다). 제네릭은 불공변(invariant)입니다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아닙니다. 런타임에 실패 Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException이 발생한다. 컴파일에 실패 List ol = new ArrayList(); // 호환되지 않는 타입 ol.add("타입이 달라 넣을 수 없다."); 어느 쪽이든 Lon..