• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

질문이 2개 있는데요..

22.12.27 20:51 작성 22.12.27 21:31 수정 조회수 323

0

상속전

camera cam = new camera();

factorycam facam = new factorycam();

camera speedcam = new speedcam();


상속후

camera cam = new camera();

camera facam = new factorycam();

camera speedcam = new speedcam();

상속후에 부모 클래스가 자식클래스의 범위까지 포함? 커버? 하기때문에

부모클래스의 속성으로 정의된 변수

camera cam /camera facam / camera speedcam

를 통해서 자식클래스의 데이터를 만들수있는건가요?

new camera();/new factorycam();/new speedcam();

 

부모클래스의 메소드가 바뀌게되면 그에맞게 자식클래스의 오버라이딩 된 메소드 부분들도 일일이 바꿔줘야하는 수고스러움을 줄기위해 super를 사용하는것이 맞는건가요?

답변 1

답변을 작성해보세요.

1

안녕하세요 😊

(1) 작성해주신 내용과 반대로 이해하시는 게 올바른 방향입니다.
Camera 는 사진을 찍고 동영상을 촬영하는 기능만 있습니다. 그걸로 끝이죠.
거기에 더해서 SpeedCam 은 속도 측정 기능을, FactoryCam 은 화재 감지 기능을 확장한 버전입니다. SpeedCam 과 FactoryCam 은 서로가 가지고 있는 특별한 기능을 모르고, Camera 또한 SpeedCam 과 FactoryCam 의 확장 기능을 모릅니다. 하지만 SpeedCam 과 FactoryCam 은 공통적으로 부모 클래스인 Camera 의 사진 + 동영상 촬영 기능은 포함하고 있죠.
그래서 Camera factoryCam = new FactoryCam(); 을 하게 되면 아래와 같이 Camera 클래스의 메소드인 takePicture() 와 recordVideo() 는 호출할 수 있습니다. 다만 FactoryCam 이 가지는 detectFire() 메소드는 호출할 수 없습니다. 실제로 객체는 기능을 제공하고 있지만 Camera 클래스에는 정의되어 있지 않기 때문이죠.

Camera factoryCam = new FactoryCam();
factoryCam.takePicture(); // 가능
factoryCam.recordVideo(); // 가능
factoryCam.detectFire(); // 불가능

반대로 FactoryCam cam = new Camera(); 을 하게 되면 FactoryCam 이 가지는 detectFire() 라는 메소드를 호출하려고 할 때, 실제 객체가 만들어지는 Camera 클래스에는 이 메소드가 존재하지 않습니다. 그래서 이와 같은 형태로는 코드를 사용할 수 없게 되는거죠.

FactoryCam cam = new Camera(); // 에러 발생
cam.detectFire();

결국 아래 형태는 가능하지만
부모클래스 객체명 = new 부모클래스();
부모클래스 객체명 = new 자식클래스();
자식클래스 객체명 = new 자식클래스();

반대의 형태는 불가능합니다.
자식클래스 객체명 = new 부모클래스();

등호(=) 를 기준으로 봤을 때, 오른쪽에 있는 것은 최소한 왼쪽에 있는 모든 것을 포함한다, 정도로 이해하시면 되겠습니다.

(2) super 는 부모 클래스를 접근하기 위해 사용하며, 메소드 오버라이딩은 부모클래스의 동작을 재정의하기 위해 사용합니다.
A. 부모 클래스에 정의된 메소드의 동작을 그대로 수행하면서 자식 클래스에서는 추가적인 동작을 수행하도록 구현한 경우, 말씀하신 내용이 맞습니다. 부모 클래스의 메소드 내용이 변경되더라도 super 를 통해서 호출하게 되므로 자식 클래스에서는 별다른 수정 없이 부모 클래스의 변경된 동작을 그대로 따르게 됩니다.
B. 부모 클래스에 정의된 메소드의 동작을 수행하지 않고 자식 클래스에서는 완전히 다른 동작을 수행하기를 원한다면 super 를 사용할 필요가 없으며 부모 클래스에 변경이 발생하더라도 자식 클래스에는 영향을 미치지 않습니다.

다소 설명이 길었는데 문의주신 내용에 답변이 되었으면 하네요 😵
감사합니다 😀