2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 30] 제네릭 싱글턴 팩터리 #96

Open gmelon opened 1 year ago

gmelon commented 1 year ago

참고 내용

p.177에 나오는 제네릭 싱글턴 팩터리 관련된 내용이 이해하는데 시간이 좀 걸렸어서 제가 이해한대로 우선 예시 코드를 (본문 내용별로) 적어봤습니다.

런타임에 타입 정보가 소거 되므로 하나의 객체를 어떤 타입으로든 매개변수화 할수 있다

List<String> strings = Collections.emptyList();
List<Integer> integers = Collections.emptyList();

하지만 이렇게 하려면 요청한 타입 매개변수에맞게 매번 그 객체의 타입을 바꿔주는 정적 팩터리를 만들어야 한다. 이러한 패턴을 제네릭 싱글턴 팩터리라 한다

(실제 emptyList()가 반환에 사용하는 객체는 제네릭의 로우타입 인스턴스 → 이를 어떤 타입으로던 매개변수화 할 수 있도록 메서드를 생성해 사용함)

@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

질문

그런데 위 내용과 별개로,, 마찬가지로 p.177에 보시면

제네릭은 런타입에 타입정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화 할 수 있다. (중략) 자바의 제네릭이 실체화된다면 항등함수를 타입별로 하나씩만들어야 했겠지만, 소거 방식을 사용한 덕에 제네릭 싱글턴 하나면 충분하다

라고 되어 있는데, 이 문장이 아직 정확하게 이해되진 않네요 조금 더 찾아보고 답변 달아두겠습니다아

gmelon commented 1 year ago

제네릭은 런타입에 타입정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화 할 수 있다.

-> 이거는 결국 런타임엔 List\<String> 과 List\<Integer> 이 동일하기 때문에 문제없이 매개변수화 할 수 있다. 이 말인 것 같구요. 근데 이 경우 UnaryOperator\<Object> 뭐 이런거 처럼 Object로 선언된 경우만 가능한걸까요..???

자바의 제네릭이 실체화된다면 항등함수를 타입별로 하나씩만들어야 했겠지만, 소거 방식을 사용한 덕에 제네릭 싱글턴 하나면 충분하다

이 말은 위의 연장선인 것 같네요. 하나의 객체를 하나의 메서드를 사용해 어떤 타입으로든 매개변수화 할 수 있으니깐 항등 함수가 타입별로 하나면 충분하다는 이야기 인 것 같아요.

NuhGnod commented 1 year ago

Collections.reverseOrder() 메소드(if문 많은 것)보면 파라미터는, Compartor cmp 로 되어있는데

만약 제네릭이 실체화되지 않는 버전인경우 : 우리가 Compartor인 객체를 넘기게 되면 런타임시 파리미터는 Comparator과 마찬가지. 그렇다면 애초에 해당 메소드의 T를 String으로 바꿔서 생각해도 무방. 이 경우, Comparator인 객체가 위 메소드를 사용하려 할 때, 에러 발생 (String <-> Integer)

따라서 현재 버전인 실체화 되지 않는 제네릭이라면 : 파라미터가 Comparator cmp로 그냥 로타입으로 바뀜(런타임시), 그래서 String, Integer 어떤 타입이 와도 이 메소드하나로 해결 가능