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

이호준님의 프로필 이미지
이호준

작성한 질문수

그림으로 배우는 자바, 파트2: 객체지향!

생성자로 객체 값 넣기

생성자 호출

작성

·

221

0

안녕하세요

공부하다가 궁금한것이 있어서 여쭤보아요

생성자 호출은

클래스_타입 변수명 = new 클래스_이름(매개변수);

이런식으로 쓴다고 말씀하셧는데

대부분의 코드를 보면 클래스_타입과 클래스_이름이 같드라구요

무조건 같아야 되나요?

같지 않아도 된다면 예시를 알려주실수 있으신가요?

그리고 클래스_타입이 뭔지 설명 가능한가요?

지금 저한테는 클래스_타입과 클래스_이름(); 이 

그냥 클래스 이름이라고 느껴지거든요

아직 이해가 부족해서 그런지 헷갈리드라구요

Ch11Question10Fig.png

이 문제는 상속에 관련된 문제이지만, 

생성자 A a = new B();

((B)a).print();

이 부분이 헷갈리드라구요

클래스 A 에서 a 라는 변수명을 가진것이 B 클래스 객체라는 말인가요?

그리고 괄호()안에 있는것부터 풀어나가야되나요? 순서가 다소 헷갈려서 여쭤보아요

답변 3

1

홍팍님의 프로필 이미지
홍팍
지식공유자

레퍼런스 변수는 그 타입에 따라 객체를 해석하는 관점이 달라집니다.

A a = new B();

위 코드는 B 객체를 만들고, 이를 레퍼런스 변수 a로 가리키게한 코드인데요. 변수 a는 B타입 객체를 가리키지만, a는 그 객체가 A타입일 것이라 해석합니다.

따라서, a.print() 라는 메소드를 수행하면 A클래스 내부에 선언된 메소드가 호출되죠. 그 결과 "A"가 출력됩니다.

B클래스에 선언된 메소드가 호출되게 하려면 어떻게 해야할까요? 다음과 같이 해석을 달리해줘야 합니다.

((B)a).print();

해당 코드는 a가 가리키는 객체를 B타입으로 해석한 뒤, print() 메소드를 호출합니다. 따라서, 클래스 B에 선언된 메소드 print()가 실행되죠. 그 결과 "B"가 출력됩니다.

0

홍팍님의 프로필 이미지
홍팍
지식공유자

static 메소드에서 인스턴스 변수 x가 보이지 않아 생기는 문제 같네요.

실제로 타이핑하셔서, 에러 발생 지점과 그 이유를 찾아보시면 좋을 것 같습니다.

0

이호준님의 프로필 이미지
이호준
질문자

감사합니다. 엄청 이해가 됐어요. 결국에는 변수명보다는 new B에 중심을 두고 해야되는 문제였네요

기본문제였는데 개념이 부족했나봐요.

Ch11Question20Fig.png

이 문제를 제가 풀어봤을땐 x is 4 and y is 4 로 생각이 되더라구요.

하지만 정답은 에러가 있다네요. 제 생각에는 final 이 문제인것 같은데, 혹시 해석이 가능할까요?

이호준님의 프로필 이미지
이호준

작성한 질문수

질문하기