inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

나도코딩의 자바 기본편 - 풀코스 (20시간)

상속 (후반전)

클래스 - 상속 (후반전) 강의 질문

721

Jin

작성한 질문수 22

6

 강의에서와 달리 SpeedCam.java의 public String name;을 지우지 않으니 실행 결과의 마지막 줄에서 "과속단속 카메라 : 사진을 촬영합니다" 가 아닌 "카메라 : 사진을 촬영합니다"가 나오는데, 왜 이런 결과가 나오는 것인지 궁금합니다.

제 생각으로는, SpeedCam.java의 public SpeedCam()에서 this.name = "과속단속 카메라"를 적어 놨으니 public String name;을 지우든 지우지 않든 "과속단속 카메라 : 사진을 촬영합니다" 가 나와야 할 것 같은데, public String name;을 지우지 않고 남겨 놓으니 SpeedCam()에서의 this.name이 무시가 되는 것 같아 그 이유가 궁금하여 질문드립니다.

감사합니다.

java oop

답변 3

2

나도코딩

안녕하세요?
부모 클래스인 Camera 에 name 이라는 이름의 변수가 있는데 자식 클래스인 SpeedCam 에서 같은 이름의 name 변수를 만들게 되면 이는 부모 클래스의 name 변수와는 별개인 새로운 변수가 됩니다. 아래와 같이 부모 클래스의 생성자에서 name 변수에 '카메라' 를 넣게 되면 이는 부모 클래스의 name 변수에 값을 저장하게 됩니다.

public String name; // 부모 클래스의 name 변수

public Camera() {
    this.name = "카메라"; // 부모 클래스의 name 변수
}

자식 클래스의 생성자에서 name 변수에 '과속단속 카메라' 를 넣게 되면 이는 자식 클래스의 name 변수에 값을 저장하게 됩니다.

public String name; // 자식 클래스의 name 변수

public SpeedCam() {
    this.name = "과속단속 카메라"; // 자식 클래스의 name 변수
}

만약 자식 클래스에서 name 변수를 중복 선언하지 않았다면 부모 클래스의 name 변수에 값을 저장하게 될 것입니다.

// public String name;

public SpeedCam() {
    this.name = "과속단속 카메라"; // 부모 클래스의 name 변수
}

작성하신 코드에서 takePicture() 메소드는 부모 클래스인 Camera 에 정의되어 있으며 이 때 this.name 은 부모 클래스의 name 변수에 저장된 '카메라' 를 출력하게 됩니다. (질문을 작성하실 때 마주하신 상황입니다)

public void takePicture() {
    System.out.println(this.name + " : 사진을 촬영합니다.");
}

만약 SpeedCam 의 checkSpeed() 메소드를 다음과 같이 변경하고 나서 호출하게 된다면, 이때 this.name 은 자식 클래스의 name 변수에 저장된 '과속단속 카메라' 를 출력하게 됩니다.

// 출력값에 this.name 추가
public void checkSpeed() {
    System.out.println(this.name + " : 속도를 측정합니다.");
}

즉, 호출되는 메소드가 부모 클래스(Camera) 에 있다면 부모 클래스의 name 변수 값을, 자식 클래스(SpeedCam) 에 있다면 자식 클래스의 name 변수 값을 출력하게 되는 것입니다.

감사합니다 😊

0

cksdyd1111

자식클래스에서 변수를 저장하지않고 즉 this.name만 붙여주면 불러온다는말이네요

반대로 변수를 저장하면 우선순위인 부모클래스의 name를 먼저 불러오고

질문자님의 내용에 public string name; 이부분을 그대로 놔두면 변수가 저장되서 speedcam 의 thisname 보다 부모클래스 thisname 을 먼저 불러오고 public string name; 지우면 자식클래스의 과속단속카메라를 를 먼저불러온다 이말인데.. 결론은 speedcam 클래서에서 public string name; 라는 변수를 선언하면 값을 저장하기때문에 따로 메소드명시를 안해주면 부모클래스의 this.name 을 가져오는것같네요..

0

buckshot1249

질문해주신 작성자님과 자세한 답변을 해주신 나도코딩님 덕분에 자바를 이해하는데 도움이 되었습니다.

감사합니다

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

0

136

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

110

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

70

1

사고력 키우는 법이 어떤게 있나요?

0

91

2

getter setter

0

101

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

78

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

75

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

114

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

166

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

114

2

응용이 어렵습니다.

0

203

2

IntelliJ가 보이지 않습니다.

0

182

3

JDK 버전 문의

0

128

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

120

2

Iterator 문의

0

104

1

코드 순서 문의

0

139

1

클래스 메소드

0

148

2

Quiz_05 관련 질문드립니다 !

0

117

2

다운로드가 안됩니다

0

165

2

다형성

0

118

2

HashMap

0

80

2