관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

상속 22 - 연습문제 이론편 문제 풀기 4 : 문제 12~16번 본문

프로그래밍 언어/자바

상속 22 - 연습문제 이론편 문제 풀기 4 : 문제 12~16번

huenuri 2024. 12. 2. 16:47

이론 문제 마지막 학습이 될 것 같다. 문제가 정말 많지만 그래도 처음 접할 때보다 문제를 푸는 감이 생겼다.


 

 

 

 

연습문제 이론편 문제 풀기 네 번째

 

문제 12번

 


 

 

 

 

문제 코드

 

 

 

 

 

 

이 문제는 동적 바인딩이 적용된 코드에서 출력 결과를 예측한다. s.paint()의 결과를 Circle 또는 Shape로 출력되게끔 빈칸에 적절한 코드를 삽입해야 한다.


 

 

 

 

 

문제 풀기

 

(1) Shape s = new Circle(); s.draw()의 결과

 

 

 

코드 분석

  1. Shape s = new Circle();
    • 부모 클래스 Shape 타입의 참조 변수 s가 자식 클래스 Circle 객체를 참조한다(업캐스팅).
  2. s.draw()
    • 동적 바인딩에 의해, 실제 객체 타입인 Circle의 draw() 메서드가 호출된다.

 

 

 

 

(2) s.paint()가 호출되면 "Circle"이 출력되도록 빈 칸에 적절한 코드 삽입

문제

  • paint() 메서드는 Circle 클래스에 정의되어 있지만, Shape 타입 참조 변수로는 paint()를 호출할 수 없다.
  • 이를 해결하기 위해 다운캐스팅을 사용해야 한다.

 

 

Circle 클래스를 이와같이 수정했다.

 

 

 

 

 

그런 다음 Main 메서드에 코드를 추가했다.

 

 

 

Circle이 잘 출력되었다.


 

 

 

 

(3) s.paint()가 호출되면 "Shape"이 출력되도록 빈칸에 적절한 코드 삽입

문제

  • paint() 메서드에서 Shape의 draw()를 호출하도록 수정해야 한다.
  • 이를 위해 super.draw()를 사용한다.

 

 

Circle 클래스에 부모 클래스의 draw 메서드를 호출하도록 수정했다.

 

실행 흐름

  1. s.paint() 호출 시, paint() 메서드 실행
  2. super.draw()는 부모 클래스(Shape)의 draw() 메서드를 호출

이제 메인 클래스의 코드만 추가하면 된다.

 

 

 

 

 

 

이번에는 두번째 메서드도 Shape으로 바뀌었다. 그 이유는 Circle 클래스에서 부모 메서드를 호출하도록 수정했기 때문이다.


 

 

 

 

 

문제 13번

 


 

 

 

 

문제 코드

 

 

 


 

 

 

문제 풀기

 

(1) 오류가 발생하는 것을 고르라

주어진 코드 분석

  • Shape : 추상 클래스이며, 추상 메서드 draw()를 가지고 있음
  • Circle : 추상 클래스 Shape를 상속받으며, draw() 메서드를 구현하지 않음. 따라서 Circle도 추상 클래스

 

실행 결과를 확인하기 위해 Main 클래스를 다음과 같이 작성했다.

 

 

①번 문제

 

추상 클래스 타입의 참조 변수를 선언하는 것은 가능하다.


 

 

②번 문제

 

추상 클래스는 인스턴스화할 수 없다.


 

 

 

③번 문제

 

추상 클래스 타입의 참조 변수를 선언하는 것은 가능하다.


 

 

 

 

④번 문제

 

이 역시 추상 클래스는 인스턴스화할 수 없다.


 

 

 

 

 

(2) 다음 코드의 실행 결과와 "반지름=10"이 출력되도록 Circle 클래스를 수정

Main 클래스에서 주어진 문제의 코드를 수정하면 된다.

문제

  • Circle 클래스는 추상 클래스이며, 직접 객체를 생성할 수 없다.
  • draw() 메서드가 구현되지 않음
  • 이 문제를 해결하려면, Circle 클래스를 일반 클래스로 만들고 draw() 메서드를 구현해야 한다.

 

 

지금은 이렇게 오류가 발생한다. 이제 Circle 클래스를 수정해 보겠다.


 

 

 

반지름이 10이 되도록 오버라이딩을 했다. 그 이유는 다음과 같다. draw()를 오버라이딩한 이유Shape 클래스의 draw()가 추상 메서드로 선언되어 있기 때문이다.

 

 

왜 draw()를 오버라이딩해야 하는가?

1. draw()는 추상 메서드

  • Shape 클래스에서 draw()는 다음과 같이 선언되어 있다.
    • 추상 메서드는 구현되지 않은 메서드로, 이를 상속받은 클래스에서 반드시 구현해야 한다.
    • 만약 draw()를 구현하지 않으면, 그 클래스(Circle) 역시 추상 클래스가 되어야 한다.
abstract public void draw();

 

2. Circle 클래스가 추상 클래스가 아니라면

  • Circle 클래스가 일반 클래스가 되려면 Shape의 추상 메서드 draw()를 반드시 구현해야 한다.
  • 그렇지 않으면 컴파일 오류가 발생한다.

 

 

 

 

 

 

이제 오류도 사라졌고 출력도 잘 되고 있다.


 

 

 

 

 

 

 

문제 14번

자바에서 다형성은 모호한 문제가 아니라 유연한 코드를 작성하기 위한 중요한 개념이다.

 

 

문제 15번

인터페이스는 클래스와 같이 멤버 변수(필드)의 선언이 가능하다.

  • 인터페이스에서 필드는 public static final로 선언된다.

인터페이스의 추상 메서드는 자동으로 public이다.

  • 인터페이스의 메서드는 자동으로 public abstract입니다. 따라서 틀린 답이다.

클래스에서 인터페이스를 구현할 때 implements 키워드를 이용하며, 모든 추상 메서드를 작성해야 한다.

  • implements 키워드로 인터페이스를 구현할 때, 모든 추상 메서드를 오버라이딩해야 한다.

 

 

 

 

 

문제 16번


 

 

 

 

문제 코드

 

 

 

 

 

코드 설명

  1. Device 클래스
    • on()과 off()를 추상 메서드로 선언
    • TV 클래스에서 이를 반드시 구현해야 한다.
  2. TV 클래스
    • Device를 상속받아 추상 메서드 on()과 off()를 오버라이딩하여 구현
    • watch() 메서드를 추가하여 "방송중입니다."를 출력하도록 작성
  3. main() 메서드 실행
    • myTV.on(): "켜졌습니다." 출력
    • myTV.watch(): "방송중입니다." 출력
    • myTV.off(): "종료합니다." 출력

 

 

abstract으로 선언한다는 것을  잊지 말자.


 

 

 

 

학습을 마치고

이렇게 해서 아침부터 5시간 가까이 투자해서 이론 문제를 모두 풀었다. 한 3시간이면 풀 수 있을 줄 알았는데 하나의 문제를 정확이 알고 넘어가다 보니 예상보다 훨씬 더 많이 걸렸다.

공부를 하며 처음의 힘들었던 마음도 조금은 할만해졌다. 계속해서 실습 문제도 풀어볼 것이다. 훨씬 더 어렵겠지만 충분히 풀 수 있을 거라 생각한다.