인프런 커뮤니티 질문&답변

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

김영한의 실전 자바 - 중급 2편

타입 이레이저

타입 이레이저 에서 나온 코드(EraserBox<T>) 질문

해결된 질문

작성

·

54

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요. 타입 이레이저 를 복습하는 도중에 뭔가 이상한점을 발견해서 질문을 드립니다.

영한님 강의에서 보면

image.png

이런식으로 하셨는데

여기서 의문이 2가지 생겼습니다.

이때까지 영한님의 코드를 살펴보면

image.png

제네릭 클래스를 만들고,

타입 매개변수(private T value or t1;)를 만들었습니다.

근데 여기에서는 바로 'T'를 사용 하셨습니다.

그리고 2번째 메서드 에서

return new T(); 라는 코드가 이해가 안 갑니다.

 

즉 첫 번째 질문은

첫번째 메서드 에서 바로 'T'를 사용하신 이유가 궁금하고

두번째 질문은

return new T() 코드가 어떤 코드인지 설명 해주실수 있으신가요?

답변 부탁 드립니다.

답변 1

1

안녕하세요, 인프런 AI 인턴입니다. 생각하는자님.

타입 이레이저 관련 질문에 대해 답변을 드리겠습니다.

질문 1: 첫번째 메서드에서 바로 ’T’를 사용한 이유

제네릭 클래스에서 T는 컴파일 시 타입을 지정할 수 있는 타입 매개변수입니다. 따라서 메서드 내부에서도 T를 사용할 수 있는데, 컴파일 시점에서는 T가 실제 타입으로 대체됩니다. 하지만 런타임에 타입 소거(Type Erasure)가 발생하여 TObject로 변환됩니다.

param instanceof T와 같이 T를 직접 사용하는 것은 컴파일러가 타입 정보를 런타임에 유지할 수 없어 오류를 발생시킵니다. 그래서 주석처리된 코드는 올바르게 작동하지 않습니다. 이 부분을 설명하기 위해 코드에서 주석으로만 보여준 것입니다.

타입 에러 주석

질문 2: return new T(); 코드에 대한 설명

제네릭 클래스에서는 타입 정보가 런타임에 없기 때문에 new T()와 같은 코드는 사용할 수 없습니다. 이는 컴파일 시간에 오류로 이어지며, 이유는 제네릭 타입 매개변수 T는 실제 타입이 무엇인지 알 수 없기 때문입니다. 따라서 인스턴스를 생성할 수 없고, 이를 이해시키기 위해 주석으로만 남겨둔 것입니다.

인스턴스 오브젝트 주석

실제로 클래스에서 제네릭 타입 T의 인스턴스를 생성하려면, 팩토리 패턴 또는 다른 디자인 패턴을 통해 객체 생성을 위임하거나, 타입 매개변수가 아닌 구체적인 클래스를 통해 생성해야 합니다.

유사 질문 링크:

  1. 타입 매개변수 제한 강의 질문: 이 질문에서 제네릭 타입 매개변수와 관련된 추가 정보를 얻을 수 있습니다.
  2. 파라미터 질문: 제네릭 클래스와 생성자 관련 개념이 설명되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

... 분명히 들었는데, 제대로 안 들었나 보네요..

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

질문하기