반응형

제네릭 6

[제네릭] 타입 안전 이종 컨테이너.. 이거 어디에 사용할까?

궁금증 이펙티브 자바 "아이템 33 - 타입 안전 이종 컨테이너를 고려하라"를 읽으면서 든 궁금증이다. 그래... 다양한 타입을 하나의 컬렉션 등에 넣기 위해, 예를 들어 Map의 key에는 클래스 리터럴 값을 넣고 value에는 Object를 받는다고 치자. 저 map에서 put과 get을 할때 메서드를 직접 구현해서 type.cast() 등을 활용해서 타입 안전하게 여러 타입을 넣을 수 있게 되었다. 교재에서는 이러한 동적 형변환으로 런타임 타입 안전성을 확보하는 방식을 java.util.Collections에 있는 checkedSet, checkedList, checkedMap 같은 메서드를 만들 때 적용했다고 한다. 그래 알겠다.. 이 래퍼들은 제네릭과 로 타입을 섞어 사용하는 애플리케이션에서 클..

개발 2022.02.21

[제네릭] 컬렉션이나 단일 원소 컨테이너에서 매개변수화 되는 대상은 무엇일까?

이펙티브 자바 "아이템 33 - 타입 안전 이종 컨테이너를 고려하라"를 읽는 도중, 한 구문이 이해가 되지 않았습니다. 다음은 이펙티브 자바 198쪽에 나오는 문단입니다. 제네릭은 Set, Map 등의 컬렉션과 ThreadLocal, AtomicReference 등의 단일원소 컨테이너에도 흔히 쓰인다. 이런 모든 쓰임에서 매개변수화되는 대상은 (원소가 아닌) 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 컨테이너의 일반적인 용도에 맞게 설계된 것이니 문제될 건 없다. 예컨대 Set에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map에는 키와 값의 타입을 뜻하는 2개만 필요한 식이다. 저는 2번째 줄인 "이런 모든 쓰임에서 매개변수화되는 대..

개발 2022.02.20

[제네릭] 제네릭 메서드에 type parameter section이 존재하는 이유가 무엇일까?

이펙티브 자바 스터디에서 제가 발표한 아이템 31의 내용에 대해 스터디원께서 좋은 질문을 해주셨습니다. 바로 제네릭 메서드에서 type parameter section이 존재하는 이유가 무엇일까? 라는 질문이었습니다. 공식 문서 Generic Methods (The Java™ Tutorials > Learning the Java Language > Generics (Updated)) The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technolo..

개발 2022.02.14

[제네릭] Java에서 배열을 공변(covariant)으로 만든 이유는 무엇인가?

이펙티브 자바 스터디에서 제가 발표한 아이템 28의 내용에 대해 스터디원께서 좋은 질문을 해주셨습니다. 바로 Java에서 배열을 공변(covariant)으로 만든 이유가 무엇일까? 라는 질문이었습니다. 공변과 불공변 질문에 대한 답에 앞서 공변과 불공변에 대해 먼저 알아보도록 하겠습니다. 공변 (covariant) 정의 : 함께 변한다 배열은 공변입니다 Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 됩니다 예시 코드 // 런타임에 실패한다 Object[] objectArray = new Long[1]; // 컴파일이 되어 버린다.. objectArray[0] = "Hello"; // 런타임에 ArrayStoreException을 던진다.. 위의 코드에서 배열은 ..

개발 2022.02.14

[제네릭] Unbounded Wildcard Type인 컬렉션에는 왜 null 값만 들어가는가?

이펙티브 자바 스터디에서 제가 발표한 아이템 26의 내용에 대해 한분께서 좋은 질문을 해주셨습니다. 바로 Unbounded Wildcard Type 타입을 가지는 컬렉션에는 (null 외에는) 어떤 원소도 넣을 수 없는데 이를 왜 사용해야 하는가? 라는 질문이었습니다. raw type public class Test { public static void main(String[] args) { List list1 = new ArrayList(); list1.add("fdf"); // 컴파일 가능 list1.add(3); // ?? list1.add(true); // 너넨 왜 담아지는거야? } } 제네릭을 반드시 써야하는 이유를 알기 전에 로 타입을 쓰지 말아야 할 이유부터 알아보겠습니다. 절대 쓰지 말아야..

개발 2022.02.07
반응형