일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ChatGPT
- 데이터분석
- 혼공머신
- 상속
- 중학1-1
- 데이터베이스
- JDBC
- 머신러닝
- 연습문제
- 자바스크립트심화
- 자바
- 디버깅
- 정보처리기사필기
- 개발일기
- 순환신경망
- JSP
- rnn
- 중학수학
- 컴퓨터구조
- 컴퓨터비전
- html/css
- CSS
- 파이썬
- 자바 실습
- c언어
- JSP/Servlet
- 자바스크립트
- 딥러닝
- 정보처리기사실기
- SQL
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
상속 22 - 연습문제 이론편 문제 풀기 4 : 문제 12~16번 본문
이론 문제 마지막 학습이 될 것 같다. 문제가 정말 많지만 그래도 처음 접할 때보다 문제를 푸는 감이 생겼다.
연습문제 이론편 문제 풀기 네 번째
문제 12번
문제 코드
이 문제는 동적 바인딩이 적용된 코드에서 출력 결과를 예측한다. s.paint()의 결과를 Circle 또는 Shape로 출력되게끔 빈칸에 적절한 코드를 삽입해야 한다.
문제 풀기
(1) Shape s = new Circle(); s.draw()의 결과
코드 분석
- Shape s = new Circle();
- 부모 클래스 Shape 타입의 참조 변수 s가 자식 클래스 Circle 객체를 참조한다(업캐스팅).
- 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 메서드를 호출하도록 수정했다.
실행 흐름
- s.paint() 호출 시, paint() 메서드 실행
- 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번
문제 코드
코드 설명
- Device 클래스
- on()과 off()를 추상 메서드로 선언
- TV 클래스에서 이를 반드시 구현해야 한다.
- TV 클래스
- Device를 상속받아 추상 메서드 on()과 off()를 오버라이딩하여 구현
- watch() 메서드를 추가하여 "방송중입니다."를 출력하도록 작성
- main() 메서드 실행
- myTV.on(): "켜졌습니다." 출력
- myTV.watch(): "방송중입니다." 출력
- myTV.off(): "종료합니다." 출력
abstract으로 선언한다는 것을 잊지 말자.
학습을 마치고
이렇게 해서 아침부터 5시간 가까이 투자해서 이론 문제를 모두 풀었다. 한 3시간이면 풀 수 있을 줄 알았는데 하나의 문제를 정확이 알고 넘어가다 보니 예상보다 훨씬 더 많이 걸렸다.
공부를 하며 처음의 힘들었던 마음도 조금은 할만해졌다. 계속해서 실습 문제도 풀어볼 것이다. 훨씬 더 어렵겠지만 충분히 풀 수 있을 거라 생각한다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
상속 24 - 연습문제 실습편 문제 풀기 2 : 문제 3~4번 (0) | 2024.12.03 |
---|---|
상속 23 - 연습문제 실습편 문제 풀기 1 : 문제 1~2번 (0) | 2024.12.02 |
상속 21 - 연습문제 이론편 문제 풀기 3 : 문제 9~11번 (0) | 2024.12.02 |
상속 20 - 연습문제 이론편 문제 풀기 2 : 문제 6~8번 (1) | 2024.12.02 |
상속 19 - 연습문제 이론편 문제 풀기 1 : 문제 1~5번 (0) | 2024.12.02 |