작성
·
54
·
수정됨
0
기본형, 참조형 모두 대입을 할 땐 타입을 일치시켜야된다는 걸로 알고 있습니다.
기본형에서 대입을 할 때 타입이 다를 경우 자동으로든 수동으로든 값 자체 변환해서 타입을 일치시켜야하고,
참조형에서 대입을 할 때 타입이 다를 경우, 업 캐스팅(자동)이든 다운 캐스팅(수동)이든 실제 객체의 타입이 아닌 정적 타입을 일치시켜야 되는 걸로 압니다.
Child child = new Child();
Parent parent = (Parent)child; // 정적타입을 Child에서 Parent로 변환해서 정적타입을 일치시켰다.
Child child2 = (Parent) parent;//정적타입을 Parent에서 Child로 변환해서 정적타입을 일치시켰다
Parent parent = (Parent)new Child();//실제 객체 타입인 Child는 정적타입이 없는 상황에서 Parent로 정적타입을 설정해서 정적타입을 일치시켰다..?
질문1.
업캐스팅은 정적타입을 부모타입으로 설정하는것,
ex)
(Parent)new Child();
(Parent)child(); <- child변수는 정적타입이 Child로 가정
다운캐스팅은 정적타입을 부모타입에서 다시 자식타입으로 변경하는 것으로 이해했는데 맞을까요?
ex)
(Child)parent; <-parent변수는 정적타입이 Parent로 가정
질문2.
위에 코드에서
Parent parent = (Parent)new Child();
이 부분은 실제 객체 타입인 Child는 정적타입이 없는 상황에서 Parent로 정적타입을 설정해서 정적타입을 일치시킨건가요..?
이 부분이 전혀 이해가 되지 않습니다.
물론 업캐스팅이 생략되는 건 알고 있고 이해되지 않는 부분을 설명하고자 업캐스팅을 생략하지 않고 작성했습니다.
질문3.
강의에서 말한 부모는 자식을 담을 수 있다는 정확한 의미는 정적타입(변수의 타입)이 부모타입이고 실제 객체의 타입이 자식일 때라고 이해했는데 맞을까요?Parent parent = child;
이 경우는 Parent parent = (Parent)child;
이렇게 내부에서 타입이 일치되도록 변환을 해주기 때문에
정적타입은 결국 일치되어 부모타입의 변수에 실제 객체 타입이 자식타입으로 대입이 가능하다고 생각했습니다.
정말답답합니다 ㅠㅠㅠ 이해시켜주시면 정말 감사하겠습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ!!!!!!!!!!!!
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 김민정님.
자바에서의 “캐스팅”에 관한 질문을 주셨네요. 기본형과 참조형의 캐스팅 개념이 혼동되셨던 것 같습니다. 질문의 핵심 부분을 정리하고 답변드리겠습니다.
자동 형변환(업캐스팅): 큰 범위의 타입(long)이 작은 범위의 타입(int)보다 더 넓은 범위를 가질 때 자동으로 형변환이 됩니다. 예를 들어, long c = 2;
에서 컴파일러가 자동으로 2
를 2L
로 변환합니다.
명시적 형변환(다운캐스팅): 작은 범위의 타입으로 변환할 경우에는 명시적 형변환을 통해야 합니다. 예를 들어, int h = (int)c;
는 long
타입을 int
로 변환하기 위해 명시적 형변환이 필요합니다.
업캐스팅(자동): 자식 클래스의 객체를 부모 클래스 타입으로 변환하는 과정입니다. 이는 암시적으로 가능하며, Parent parent = new Child();
와 같이 생략해서 사용할 수 있습니다.
다운캐스팅(명시적): 부모 클래스 타입을 자식 클래스 타입으로 변환하는 과정으로 명시적 형변환이 필요합니다. 여기서 중요한 점은 실제 객체가 변하는 것이 아니라 참조하는 타입이 변하는 것입니다.
질문에서 언급하신 부분,
Parent parent = (Parent)new Child();
이 코드는 사실 업캐스팅을 명시적으로 한 상황입니다. 실질적으로는,
Parent parent = new Child();
와 동일한 작동을 합니다. Child
객체를 Parent
타입으로 가리키는 것이며, 여기서 Child
객체의 실제 객체 타입은 변하지 않습니다.
따라서, “정적 타입을 일치시킨다”라는 표현은 참조 변수의 타입을 변경하여 업캐스팅 혹은 다운캐스팅이 발생하여, 해당 클래스의 기능을 사용하도록 변환하는 것을 의미한다고 볼 수 있습니다. 이는 메모리에서 실제 객체를 바꿔버리는 것이 아니라, 어떻게 참조할 것인지에 대한 설정인 셈입니다.
관련하여 참조하실 수 있는 질문과 답변 링크는 다음과 같습니다:
이 링크들은 캐스팅과 관련한 더 상세한 설명들을 포함하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.