타입 이레이저 동작방식 질문입니다!
188
작성자 없음
작성한 질문수 0
안녕하세요! 이번에 정처기 문제에서 타입 이레이저 관련 문제가 나왔는데, 궁금한 점이 생겨서 질문 올려봅니다.
class Printer {
void print(Integer a) {
System.out.print("A" + a);
}
void print(Object a) {
System.out.print("B" + a);
}
void print(Number a) {
System.out.print("C" + a);
}
}
public class Gisafirst {
public static void main(String[] args) {
new Container<>(0).print();
}
public static class Container<T> {
T value;
public Container(T t) {
value = t;
}
public void print() {
new Printer().print(value);
}
}
}제가 이해한 바로는, 강의에서 설명해주신대로 new Container<>(0)에서
public static class Container<Integer> {
Integer value;
public Container(Integer t) {
value = t;
}
public void print() {
new Printer().print(value);
}
}컴파일러가 컴파일 시점에 이렇게 이해하고 나서 컴파일 종료 후, 타입 소거가 일어나서, Object로 변환한다고 이해했습니다.
그래서 print 메서드를 호출할 때 value는 Object 타입이므로 B0가 출력되는 것이죠.
여기서 궁금한 점은 바로 print의 오버로딩 메서드 선택 시점입니다. 제가 찾아본 바로는 오버로딩 메서드 선택시점은 컴파일 단계에서 이루어진다로 알고있습니다.
그렇다면 동작방식이 컴파일 종료 후 타입 소거가 일어나는게 아니라, 정확히는
"컴파일 시작 - 타입 소거 - 오버로딩 메서드 선택 - 컴파일 종료 - 런타임" 이런식으로 일어나는건가용?
아니면 어디서 오해하고 있는지 궁금합니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 구준형님.
타입 이레이저(Type Erasure)는 컴파일 시점에 발생하며, 제네릭 타입 정보는 런타임 전에 소거됩니다. 질문하신 상황에서는 타입 이레이저와 메서드 오버로딩 간의 관계를 이해하는 것이 중요합니다.
컴파일 시 타입 소거가 이루어짐: 제네릭 클래스나 메서드의 타입 파라미터는 컴파일 과정에서 소거되어, 더 구체적인 타입 캐스트로 대체됩니다. 예를 들어,
new Container<>(0)에서Container<Integer>는 컴파일 시Container<Object>로 변경되고, 내부에서value타입도Object로 됩니다.메서드 호출 결정: 자바에서 오버로딩 메서드 호출은 컴파일 타임에 진행됩니다. 즉, 구체적으로 어느 메서드를 호출할지를 타입 정보를 기반으로 결정합니다. 구체적 타입(Integer)이 호출할 메서드를 선택하는 데 기초합니다. 그러나 이 경우, 타입 이레이저로 인해
Object가 됩니다.
결국, 오버로딩된 메서드를 선택할 때는 value가 컴파일 단계에서 이미 객체로 인식되므로 print(Object a) 메서드가 선택됩니다.
유사한 질문 사례
- 타입 이레이저 질문
- 이 질문에서는 타입 이레이저 과정에서 보여지는 결과와 관련한 궁금점을 다루고 있습니다.
- 이 질문에서는 타입 이레이저 과정에서 보여지는 결과와 관련한 궁금점을 다루고 있습니다.
- void 메서드에서 리턴값을 다룰 때 이상한 행동에 대해 해명해 주세요!
- 메서드 오버로딩과 구체적인 동작에 대한 논의가 포함되어 있습니다.
- 메서드 오버로딩과 구체적인 동작에 대한 논의가 포함되어 있습니다.
요약:
- 타입 이레이저: 컴파일 시점에 일어남.
- 메서드 선택: 컴파일 시점의 타입 정보를 기반으로 결정됨. 타입 소거 후의 타입이 이 결정에 영향을 미칩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제네릭 타입 매개변수 제한과 관련한 문의입니다.
0
80
3
강의가 좀 버겁다 느껴질 때 학습방법 문의
1
135
4
제네릭 반환값 및 파라미터 선언 방식의 변화 <T> T
0
62
1
new T()가 안 되는 니유
0
102
1
안녕하세요, 문제와 실행 결과가 다른 부분이 있어 제보드립니다.
0
98
2
자바 로드맵 선택 질문
0
111
2
실전 자바 중급 - 2편 후 추천 강의
0
176
2
실프로젝트에서 Java25버전 사용
0
121
1
Arrays.sort
0
68
1
블로그 작성 시, 저작권 문제에 대하여
0
166
1
중급2편 56강의 bucket.add(value); 메서드가 이해가 안됩니다.
0
94
3
pop()과 poll()의 차이
0
94
1
특정 index의 노드 조회하기 질문
0
66
2
List.of() 비어있는 불변 리스트 생성
0
81
2
문제2: 개 타입 반환
0
56
2
[리뷰] 중급2편까지 겨우 완강 했습니다.
0
114
2
문제와 풀이1 Ex2와 Ex3
0
65
2
노드 삭제시 노드 null값으로 초기화
0
77
2
강의영상에 대한 질문
0
57
1
타입 매개변수 제한
0
59
1
compareTo
0
68
1
직접 구현하는 연결리스트 3 - 추가 부분 질문있습니다
0
99
3
섹션 8-58 equals and hashcode 에서 코드가 다르게 생성됨
0
70
2
퀴즈 오류 관련 문의
0
109
1





