반응형

개발 18

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

이펙티브 자바 "아이템 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

[Java] 공급자 Supplier<T>

공급자 내부 코드 @FunctionalInterface public interface Supplier { T get(); } Supplier는 매개변수를 받지 않고 단순히 반환하는 추상 메서드가 존재한다 활용 방식 1. 문자열 return public class SupplierStringReturn { public static void main(String[] args) { Supplier helloSupplier = () -> "Hi"; System.out.println(helloSupplier.get()); } } // 결과 // Hi 2. 객체 return public class SupplierObjectReturn { static class Point { } public static void ma..

개발 2022.01.25

[5분 개념] 제네릭 싱글턴 팩터리

제네릭 싱글턴 팩터리 정의 제네릭으로 타입 설정 가능한 인스턴스를 만들어두고, 반환 시에 제네릭으로 받은 타입을 이용해 타입을 결정한다. 장점 여러 타입으로 내부 객체를 받아도 에러가 나지 않는다 큰 유연성을 제공한다 public class GenericSingletonFactory { public static final Set EMPTY_SET = new HashSet(); public static final Set emptySet() { return (Set) EMPTY_SET; } public static void main(String[] args) { Set set1 = GenericSingletonFactory.emptySet(); Set set2 = GenericSingletonFactory...

개발 2022.01.24

[Java] 예제 코드로 알아보는 다형성 - 2

2022.01.24 - [Java] - [Java] 예제 코드로 알아보는 다형성 - 1 [Java] 예제 코드로 알아보는 다형성 - 1 정의 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 hwan33.tistory.com 이전 포스팅을 이어가도록 하겠습니다. 다형성 Quiz 1. 다음 코드의 결과를 예측하시오 class SuperClass { String x = "super"; public void method() { System.out.println("super class method"); } } class SubClass extends SuperClass..

개발 2022.01.24

[Java] 예제 코드로 알아보는 다형성 - 1

정의 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다. 다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다. 참고 Tcp School 저도 다형성의 정의에 대해서는 이해하고 있다고만 생각했습니다. 왜냐하면 아래와 같은 코드들을 활용한다면 다형성을 충분히 이용하는 것이라 생각했기 때문입니다. class Animal {...} class Human extends Animal {...} class Korean extends Human {...} public class Main { public..

개발 2022.01.24
반응형