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

문예찬님의 프로필 이미지
문예찬

작성한 질문수

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

직접 구현하는 연결 리스트4 - 제네릭 도입

new T(); 와 new Node<T>();의 차이

해결된 질문

작성

·

25

0

===================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

안녕하세요, 수업을 열심히 따라가며 코드를 작성해보면서 궁금한 점이 생겨 이렇게 질문드립니다.

 

앞서 제네릭 부분에서 타입이레이져 방식 때문에 제네릭 타입정보는 컴파일 이후 모두 사라지고 타입변수의 상한타입으로 바뀐다고 이해하였습니다. 그래서

image.png

위 처럼 new 로 직접 타입변수 T의 인스턴스를 생성하거나 instanceof T 구문을 쓰지 못한다고 하셨습니다.

컴파일 이후에는 T에 대한 정보가 없으니까요.

 

그런데 리스트에서 제네릭을 사용하는 부분을 보면 LinkedList<T>처럼 제네릭 타입을 활용해 클래스를 정의하였고 내부에 new Node<T>(); 와 같은 부분이 있어 위의 언급한 내용과 상충하는 것 같아 이 경우는 왜 가능한지 의문이었습니다.

image.png

 

구글에서 찾기 쉽지않아 직접 T를 생성하는 것(new T(); )과 Node<T>를 생성하는 것(new Node<T>(e);)의 차이를 혼자 고민해보았습니다.

T를 생성하는 것은 힙영역에 T 인스턴스를 생성하는 것인데 컴파일 이후 T에 대한 정보가 전혀 없어 T 직접생성이 불가능하지만, Node<T>의 경우 Node의 인스턴스를 생성할 때 T타입인 item이 있지만 이때 T타입의 객체를 생성하는 것이 아니라 언젠가 생성될 T객체의 참조값을 담을 변수만 선언하는 것일 뿐이고 이는 컴파일 이후 T의 정보가 없어 Object 타입으로 변수 item이 선언되더라도 후에 T타입의 객체(의 참조값)가 item에 할당될때 저절로 업캐스팅이 되어 문제없이 item변수를 사용할 수 있다고 결론내렸습니다.

 

이렇게 생각하면 문제없는걸까요?

 

 

 

 

 

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 문예찬님.

질문하신 내용은 제네릭 타입의 타입 소거(Type Erasure)와 관련된 중요한 개념으로, 자바에서 제네릭을 사용할 때 헷갈릴 수 있는 문제입니다.

“new T()“와 “new Node()“의 차이:

  1. new T()는 불가능한 이유:

    • 제네릭 타입 매개변수(T)는 컴파일 시간에는 특정 타입이지만, 런타임에는 그 타입 정보가 소거되어 Object 타입으로 변환됩니다.
    • new T()와 같은 인스턴스 생성은 컴파일된 바이트코드에서 명확한 타입을 알 수 없기 때문에 불가능합니다. 즉, 컴파일러가 T의 타입이 무엇인지 알지 못하므로 해당 타입의 생성자가 없는 상황이 되어 버립니다.
  2. new Node()와 그 사용의 가능성:

    • Node<T>Node 클래스의 인스턴스를 생성하는 것이며, 제네릭 타입 T는 해당 클래스 내부에서 데이터 타입을 유연하게 사용하기 위한 것일 뿐입니다.
    • Node 객체 안에서 T는 단순히 참조를 저장하기 위한 변수로 사용됩니다. 이 과정에서 실제로 T 타입의 객체를 생성하는 것이 아니기 때문에 new Node<T>()는 문제가 되지 않습니다.

앞에서 언급하신 Script에서 Node<T>Node 클래스 내부에서 어떻게 작동하는지를 이해하는 것이 중요합니다. 제네릭을 통해 Node 내부의 기능을 타입 안정성과 함께 사용할 수 있는 것이죠. 이런 사용은 아이템을 저장하고 가져오는 것에 문제가 없도록 해줍니다.

결론

제네릭을 사용한 클래스 선언(Node<T>)에서는 타입 인자를 이용해 내부 로직을 유연하게 구성할 수 있지만, 컴파일 후 타입 인자가 소거(타입 삭제)되기 때문에 직접적으로 인스턴스를 생성하거나 타입을 비교하는 것은 제한됩니다. 따라서 new T()는 불가능하지만 new Node<T>(e)로 노드를 생성하고 새로운 아이템을 노드에 추가할 수 있습니다.

더 추가적으로 궁금한 점이 있으시면, 언제든지 이어서 질문하여 주시기 바랍니다. 질문하신 부분에 대해 상세한 이해를 돕기 위해 알려드릴 내용이 있으니 아래의 링크를 참고해 주세요.

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

문예찬님의 프로필 이미지
문예찬

작성한 질문수

질문하기