관리 메뉴

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

클래스와 객체 20 - 단원 마무리 연습문제 실습편 풀기 : 1~6번 본문

프로그래밍 언어/자바

클래스와 객체 20 - 단원 마무리 연습문제 실습편 풀기 : 1~6번

huenuri 2024. 8. 20. 08:17

어제 하루종일 공부를 했음에도 static에서 final 개념 학습 그리고 14문제밖에 풀지 못했다. 하지만 난 한 문제를 풀 때 굉장히 심혈을 기울여 거기서 배울 수 있는 것을 모두 학습한다는 마음으로 풀었기에 그 값어치는 매우 크다고 본다.

비록 다 이해하지는 못했고 절반도 이해하지 못한 문제들도 많았지만 우선은 넘어가기로 했다. 나중에 복습을 하며 이 부분을 심화 학습해 볼 수 있으리라 믿는다.

 

어제는 부족함이 많아서 스스로에게 실망이 되고 화가 났던 그런 날이었고 이건 어제뿐만이 아니라 매일 그런 것 같다. 하지만 얼마나 많이 하는 것보다 포기하지 않고 그 일을 하는지가 가장 중요하다. 오늘부터는 새벽 기상도 1시간 당길 수 있어서 정말 좋았다. 지난 1주일이 넘도록 새벽 6시 기상에 도전했고 그 일을 잘 해냈으니 이제 한 단계 수준을 올릴 수 있게 되었다. 처음부터 새벽 4시에 일어나려고 했으면 분명 실패했을 것이다.

하지만 이처럼 한 단계씩 올라가다보면 어느새 정상에 다다르게 된다. 개발 공부도 마찬가지일 것이다.


 

 

 

 

연습문제 실습편 문제 풀기

 

1번 문제

자바 클래스를 작성하는 연습을 해보자. 다음 main() 메서드를 실행했을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.

 

예제를 조금 참조했지만 잘 풀었다. 생성자부터 만들고 메소드는 어떤 기능을 만드는 것이다. 여기는 출력을 할 예정이니 이 분분을 show()로 만들어주면 된다.


 

 

 

 

문제 2번

3과목의 점수를 입력 받아 Grade 객체를 생성하고 성적 평균을 출력하는 main()을 작성하라.

 

입력은 되는데 출력이 되지 않았다. 그 이유가 뭔가 했더니 average() 메서드 내에서 average()를 다시 호출하는 재귀 호출로 인해 스택 오버플로우가 발생한 거였다. 괄호가 있으면 함수가 된다는 것을 깜박 잊었다. 올바르게 계산된 average 값을 반환해야겠다.


 

 

 

언제나 틀려봐야 더 많은 걸 배우는 것 같다. 이제 이 부분을 확실히 풀 수 있을 것 같다. 이젠 하도 많이 문제를 풀어서 어떤 코드인지 쓰지 않아도 이해가 된다.


 

 

 

 

문제 3번

노래 한 곡을 나타내는 Song 클래스를 작성하라.

 

 

혼자서도 이 문제를 모두 잘 풀었다.


 

 

 

문제 4번

다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.

 

 

잘 만들긴 했는데 포함한다는 말이 두 번이나 출력되고 있다. 이 부분을 수정해야 할 것 같다.


 

 

else if 구문을 수정하니 이렇게 사각형이 이 안에 들어있는지 조건을 검사할 필요가 없었지만 그래도 한번 이런 식으로 코드를 작성해 본다.

contains 메서드의 로직:

이 로직은 현재 사각형(this)이 다른 사각형(r)을 완전히 포함하는지 확인한다. 포함하려면 r의 모든 꼭짓점이 this 사각형의 내부에 있어야 한다.

  1. this.x <= r.x
    • r 사각형의 좌측 상단 모서리의 x 좌표가 this 사각형의 좌측 상단 모서리의 x 좌표보다 오른쪽에 있거나 동일한지 확인한다.
    • r의 왼쪽이 this의 왼쪽보다 안쪽(오른쪽)이어야 한다.
  2. this.y <= r.y
    • r 사각형의 좌측 상단 모서리의 y 좌표가 this 사각형의 좌측 상단 모서리의 y 좌표보다 아래쪽에 있거나 동일한지 확인한다.
    • r의 위쪽이 this의 위쪽보다 안쪽(아래쪽)이어야 한다.
  3. this.x + this.width >= r.x + r.width
    • r 사각형의 우측 하단 모서리의 x 좌표가 this 사각형의 우측 하단 모서리의 x 좌표보다 왼쪽에 있거나 동일한지 확인한다.
    • 즉, r의 오른쪽이 this의 오른쪽보다 안쪽(왼쪽)이어야 한다.
  4. this.y + this.height >= r.y + r.height
    • r 사각형의 우측 하단 모서리의 y 좌표가 this 사각형의 우측 하단 모서리의 y 좌표보다 위쪽에 있거나 동일한지 확인한다.
    • 즉, r의 아래쪽이 this의 아래쪽보다 안쪽(위쪽)이어야 한다.

 

 

 

이제 둘 중의 하나만 출력이 되고 있다. if-else 구문을 사용할 때는 그 안에 다른 것이 들어있지 않아야 한다. 근데 prinfln을 사용한 것이 문제였다. 다 풀었는데 여기서 막혔다. 그래도 정말 잘했다.


 

 

 

 

 

문제 5번

Cirelce 클래스와 CircleManager 클래스를 완성하라.

 

 

 

이제 이 문제도 풀 수 있게 되었다. 정답을 조금 참고하면서 풀었다. 객체 배열을 적용하는 부분은 조금 어려웠기 때문이다. 여기서 주의할 점은 값을 입력받을 때 원래 사용한 변수를 써야 한다는 것이다. 난 다른 변수인 줄 알고 그걸 썼다가 오류가 났다. 그리고 자료형에 맞게 객체를 생성하는 것도 아주 중요하다. 객체 배열에는 뒤에 변수가 붙지 않아서 조금 헷갈렸다.

그리고 객체 배열을 출력할 때도 c[i].show()로 일반 메서드 출력과 크게 다르지 않았다.


 

 

 

 

문제 6번

5번 문제를 수정하여 면적이 가장 큰 원을 구하라.

 

 

 

 

이렇게 면적이 가장 큰 원까지 계산했다. 이걸 알기 위해서는 원의 넓이를 구하는 공식을 알아야 하고, 조건을 만들어서 가장 큰 원을 찾아야 한다. 늘 하던 대로 첫 번째 배열 요소를 가장 큰 원으로 설정하고 그 원보다 크면 largestCircle 값을 바꾸어준다.

조금만 생각하면 풀 수 있는 문제인데 처음 풀어보는 거라 예제를 참고하면서 풀어보았다.


 

 

 

 

학습을 마치고

이렇게 해서 오늘 새벽에 실습문제 7번까지 풀어보았다. 보통 한 문제를 푸는데 30분 정도 걸린 것 같다. 그래도 이렇게 풀어볼 수 있어 정말 기뻤다.

7번 문제는 인사교 가기 전에 한번 풀어보고 8번부터 남은 5문제는 아침 수업 시간에 풀어보려고 한다. 그리고 가변배열에서 수업을 듣지 못한 부분을 공부해 볼 것이다.