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

Jin님의 프로필 이미지
Jin

작성한 질문수

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

상속 (후반전)

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

작성

·

600

6

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

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

감사합니다.

답변 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

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

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

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

0

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

감사합니다

Jin님의 프로필 이미지
Jin

작성한 질문수

질문하기