관리 메뉴

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

상속 27 - 연습문제 실습편 문제 풀기 5 : 문제 11~12번 본문

프로그래밍 언어/자바

상속 27 - 연습문제 실습편 문제 풀기 5 : 문제 11~12번

huenuri 2024. 12. 3. 06:26

이번에도 실습 문제 두 문제를 풀어보려고 한다. 가능하면 6시까지 다 마쳐볼 생각이다. 그리고 오늘부터는 다시 운동도 열심히 할테니 아침 7시까지는 새벽 공부를 다 마칠 것이다.

그리고 아침 루틴을 수행한 후 적어도 7시 반에는 걷기 운동을 나갈 예정이다. 어제는 큐티와 수학 공부를 다시 시작했었다. 오늘의 목표는 운동 3가지를 다시 시작하는 것이다. 요즘 내가 새롭게 들이고 있는 습관은 인스턴트 음식 횟수와 양을 절반 이상으로 줄이고 요리하는 습관이다.

 

요리도 해보니 정말 재미있었고, 어제는 유통기한이 일주일이나 지난 두부면으로 야채볶음을 해먹었는데 기대 이상으로 맛있었다. 사실 어제 진짜 외식을 하고 싶었는데 잘 참았다. 이렇게 건강하고 좋은 습관은 나쁜 습관에 비해 잘 들이기 힘들고 유혹을 이기는 것도 쉽지 않다.

하지만 매일 꾸준히 노력하여 1년의 시간을 들이면 그 어떤 것도 습관으로 만들 수 있다는 것을 지난 1년 2개월의 시간동안 배울 수 있었다. 이제 남은 문제도 열심히 풀어볼 것이다. 잘 안풀린다고 좌절하지 말고 하나라도 배운 게 있다면 그것으로 만족할 것이다.


 

 

 

 

연습문제 실습편 문제 풀기 다섯 번째

 

문제 11번

 

 

이 문제는 추상 클래스 Calc를 설계하고 이를 상속받는 Add, Sub, Mul, Div 클래스에서 각각의 연산을 수행하도록 구현해야 한다. main() 메서드에서는 입력받은 두 숫자와 연산자에 따라 적절한 연산을 수행한다.


 

 

 

 

문제 풀기

 

Calc 클래스


 

 

 

사칙연산 클래스

 

 

 

 

 

 

 


 

 

 

 

Main 클래스


 

 

 

코드 설명

  1. Calc 추상 클래스
    • 두 개의 정수(a, b)를 필드로 가지며, 값을 설정하는 setValue() 메서드와 연산을 수행하는 calculate() 추상 메서드로 구성된다.
  2. Add, Sub, Mul, Div 클래스
    • 각각 Calc를 상속받아 calculate() 메서드를 구현한다.
    • Add는 덧셈, Sub는 뺄셈, Mul은 곱셈, Div는 나눗셈을 수행한다.
    • Div 클래스는 0으로 나누는 경우 예외 처리를 한다.
  3. Main 클래스
    • 사용자로부터 두 정수와 연산자를 입력받아, 입력된 연산자에 따라 적절한 연산 객체(Add, Sub, Mul, Div)를 생성한다.
    • 생성된 객체의 setValue() 메서드로 값을 설정하고, calculate() 메서드를 호출하여 결과를 출력한다.

 

 

 

0으로 나누려하자 Exception 오류에 설정한 문구가 뜨고 있다. 이러한 연산 문제는 지금까지 많이 풀어봐서 충분히 구현할 수 있지만 추상화하여 작성하는 것은 처음이라 조금 생소했다.


 

 

 

 

 

문제 12번

 


 

 

 

 

문제 코드

 

사용자가 입력한 명령에 따라 그래픽 편집기 기능을 수행하는 GraphicEditor 클래스와 이를 구현하는 프로그램을 작성할 것이다. 주어진 클래스 설계를 이용해 Shape, Line, Rect, Circle 등을 활용하여 "삽입", "삭제", "모두 보기", "종료" 명령을 처리해야 한다.


 

 

 

 

문제 풀기

 

Line 클래스


 

 

 

 

Rect 클래스


 

 

 

 

Circle 클래스


 

 

 

GraphicEditor 클래스


 

 

 

 

 

Main 클래스


 

 

 

코드 설명

  1. Shape 추상 클래스
    • 도형 리스트의 기본 구조를 정의한다.
    • next 필드를 통해 도형들을 연결(링크드 리스트 구조)하며, draw() 추상 메서드를 통해 각 도형을 그린다.
  2. Line, Rect, Circle 클래스
    • 각각 Shape를 상속받아 draw() 메서드를 구현한다.
    • 도형의 종류를 출력한다.
  3. GraphicEditor 클래스
    • insert() 메서드 : 새로운 도형을 리스트의 끝에 삽입한다.
    • delete() 메서드 : 지정된 위치의 도형을 삭제한다.
    • show() 메서드 : 리스트에 있는 모든 도형을 출력한다.
    • run() 메서드 : 사용자 입력을 처리하여 프로그램의 실행 흐름을 제어한다.
  4. 메인 실행 흐름
    • 사용자는 삽입, 삭제, 보기, 종료를 선택하여 명령을 수행한다.
    • 종료 명령이 입력되면 프로그램이 종료된다.

 

 

 

 

코드 실행해보기

 

 

여기에 진짜로 그래픽이 그려지면 멋진 프로그램으로 만들어질 것 같다.

 

 

 

 

 

삭제할 도형의 위치에 0번을 입력하자 이렇게 오류가 뜬다. 이번에는 사용한 코드가 잘 출력되는지 보기 위해 테스트를 해보겠다.

 

 

 

 

 

삭제가 잘 되는 것을 확인할 수 있다.


 

 

 

 

 

학습을 마치고

코드가 복잡하고 클래스가 많은 문제들을 풀어보았다. 특히 12번 문제에서 GraphicEditor는 코드를 해석하는 것도 어려웠다. 하지만 자세히 들여다보면 그동안 모두 배웠던 내용들이고 다만 길뿐 이해하는데 어려움은 없는 코드이다. 다만 여기까지 생각을 하는 것이 어려운 것 같다.

이제 우리에게는 ChatGPT라는 유용한 도구가 있어서 코드 같은 건 간단하게 작성해줄 수 있다. 그러나 똑같은 코드가 아닌 자신만의 코드로 만들고 이를 활용하며 적용하는 것은 개발자의 실력에 달려있다.

 

앞으로 난 코드는 보는 힘과 적용하여 내 것으로 만드는 힘을 키워보기로 했다. 아직은 더 배워야 하니 기본적인 교육이 끝나면 이런 훈련을 정말 많이 해볼 생각이다.