작성
·
69
·
수정됨
답변 3
1
안녕하세요. rucy0510님, 공식 서포터즈 David입니다.
T unit = s.out(); 없이 s.getName()을 할 수 없는 이유에 대해 질문하신걸로 이해했습니다.
이해한 걸 전제로 설명드리면, s의 타입은 Shuttle입니다. Shuttle은 getName 메서드에 대한 정보가 없습니다. 대신, Shuttle에 전달되는 타입은 Shuttle 내에서 BioUnit으로 상한이 정해져있습니다. 이로인해 s.out()을 하게 되면 BioUnit 타입이 나오게 됩니다. 따라서, s.out()을 통해 유닛을 꺼내온 다음에야 유닛에 대한 정보를 출력하는 getName()을 호출할 수 있게 되는 것입니다.
감사합니다.
0
T
가 가지는 추가적인 메서드를 호출하기 위해서는 해당 타입의 인스턴스를 명시적으로 가져와야 합니다.
<- 이 말은 즉 메서드를 사용하려면 T t1, T t2 와 같 명확히 타입으로 정의되어 있어야 하고 아래와 같이 명확하지 않은 인스턴스 객체 형태로 받는경우 메서드를 사용할수 없다는 건가요?
0
안녕하세요, 인프런 AI 인턴입니다. rucy0510님
질문하신 내용에 대해 설명드리겠습니다. 제네릭 타입을 사용할 때, 메서드 내에서 특정 타입의 메서드를 호출하려면 해당 타입의 인스턴스가 필요합니다. 제네릭을 사용하면 컴파일러는 실제 타입을 알 수 없기 때문에, 타입 안정성을 위해 인스턴스를 통해 메서드를 호출하도록 요구합니다.
Shuttle<T>
클래스는 내부적으로 BioUnit
타입의 배열을 사용하며, 특정 타입의 BioUnit
을 반환하기 위해 out()
메서드에서 타입 캐스팅을 수행합니다. 이 과정에서 실제 타입이 어떤 것인지 확신할 수 없기 때문에 캐스팅을 해야 하는데, 이로 인해 Unchecked cast
경고가 발생합니다. 이는 컴파일러가 타입 안전성을 보장할 수 없음을 의미하는 경고입니다.
캐스팅을 통해 BioUnit
을 실제 타입으로 변환한 후에야 그 타입의 메서드들을 사용할 수 있습니다. 제네릭 타입 파라미터 T
가 BioUnit
을 상속하기 때문에, BioUnit
에서 정의된 메서드들은 사용할 수 있지만, T
가 가지는 추가적인 메서드를 호출하기 위해서는 해당 타입의 인스턴스를 명시적으로 가져와야 합니다.
이러한 문제를 해결하기 위해 여러 접근법이 있을 수 있습니다:
1. out()
메서드에서 제네릭 타입에 대한 안전한 타입 캐스팅을 확보하도록 코드를 구조화합니다.
2. 타입 체킹을 미리 수행하여 Unchecked cast
경고를 없애기 위한 방법을 고려합니다.
유사한 사례에 대한 추가적인 이해를 위해 다음 질문과 답변을 참고하시면 좋겠습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 이해했습니다 감사합니다!