본문 바로가기

반응형

1_스터디

(6)
[EffectiveJava] ITEM 33. 타입 안전 이종 컨테이너를 고려하라 이종 컨테이너 패턴 (type safe heterogeneous container pattern) 제네릭은 Set, Map 등의 컬렉션과 ThreadLocal, AtomicReference 등의 단일원소 컨테이너도 흔히 쓰인다. 이런 모든 쓰임에서 매개변수화되는 대상은 원소가 아닌 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 예를들어, Set 에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map 에는 key, value의 타입을 뜻하는 2개만 필요한 식이다. 더 유연한 방식이 필요할때가 있다. 데이터베이스희 행(row)은 임의 개수의 열(column)을 가질 수 있는데, 모두 열을 타입 안전하게 이용할 수 있다면 더 편할 것이다. 여기에..
[EffectiveJava]ITEM 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 가변인수 메서드 가변인수(varargs) 메서드와 제네릭은 함께 사용이 어렵다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해준다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 그런데 내부로 감춰야 했을 이 배열을 클라이언트에 노출시키는 문제가 생겼다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. static void dangerous(List... stringLists) { List intList = List.of(2); Object[] objects = stringLists; objects[0] = intList; // 힙 오염 /* stringList 는 Integer 타..
[Effectvie Java] ITEM 31. 한정적 와일드카드를 사용해 API 유연성을 높이라. 매개변수화 타입은 불공변(invariant)이다. 리스코프 치환원칙에 어긋난다. 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 한다. 즉, B가 A의 자식일 때, A 타입을 사용하는 부분에서 B로 치환해도 문제없이 동작이 되어야 한다. https://brownbears.tistory.com/579 [SOLID] 리스코프 원칙 법칙이란 (Liskov Substitution Principle, LSP) 리스코프 치환 법칙은 SOLID 원칙에서 L에 해당하는 법칙입니다. 해당 법칙은 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 합니다. 즉, B가 A의 자식일 때, A 타입을 사 brownbears.tistory.com 한정적 와일드카드 타입 Iterable
[EffectiveJava] ITEM 30. 이왕이면 제네릭 메서드로 만들라 제네릭 메서드 메서드도 제네릭으로 변경 가능. 샘플 로변환 예제 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 제네릭 싱글턴 팩터리 요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔줌. Collections.reverseOrder 같은 함수 객체나 Collections.emptySet 같은 컬렉션용으로 사용한다 재귀 타입 한정 자기자신이 들어간 표현식을 사용하여 타입 매개변수의 허용 범위를 한정 할 수 있다. Comparable 인터페이스와 함께 쓰인다.
[EffectiveJava] ITEM 29. 이왕이면 제네릭 타입으로 만들라 제네릭 타입 배열을 사용하는 코드는 제네릭으로 변환을 고려 해야 한다. 클라이언트단 (소스) 에서 직접 형변환을 해줘야하는 것 보다 제네릭 으로 사용하는 것이 안정성이 높다. ​ 샘플코드 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() { if( si..
[EffectiveJava] ITEM 28. 배열보다는 리스트를 사용하라 배열 제네릭 차이 1. 배열은 공변이다. 상위 하위 타입이 존재하며, 이런 관계가 성립 될 시에는 문제가 있는 코드도 '런타임 시점'에 오류를 발견 할 수 있다. 이와는 다르게 제네릭의 경우 상 하위 관계가 성립되지 않으며, 불공변 관계이므로 서로 종속적일 수 없다. 공변, 불공변 관련 참고 URL : https://hwan33.tistory.com/24​ ​ 2. 배열은 실체화 된다. 제네릭은 런타임에는 타입정보가 소거 된다. ( 컴파일에만 검사, 런타임에는 확인 하지 않는다 ) 그렇기 때문에 제네릭은 컴파일시점에 안전성이 높다. (런타임에선 낮음) 배열의 경우 런타임시점에 체크를 하기때문에 런타임 시점에 안정성이 높다. 다만 컴파일시에는 체크를 하지 못한다. 제네릭 타입 시스템의 취지 >> 런타임에 ..

반응형