관리 메뉴

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

클래스와 객체 19 - 단원 연습문제 이론편 문제 풀기 : 9~16번 본문

프로그래밍 언어/자바

클래스와 객체 19 - 단원 연습문제 이론편 문제 풀기 : 9~16번

huenuri 2024. 8. 19. 23:17

이제 마지막 이론 문제를 풀어보려고 한다. 조금 전에 4시 반쯤 너무 졸려서 수업 시간에 나와서 휴게실에서 20분 이상 잠을 실컷 잔 것 같다. 그러고 나니 피로가 많이 풀렸지만 아직 머리가 멍하고 공부가 재미가 없어졌다.

정말 하기 싫지만 남은 8교시 수업 동안 나머지 이론 문제를 풀어보고 있다. 하루종일 이 문제를 풀어도 몇 개밖에 풀지 못해서 나 자신에게 좀 화가 난 것 같다. 이렇게 진도가 느려서 어느 세월에 프로그래밍 공부를 다 마칠 수 있을지..

 

그래도 하는 데까지 최선을 다해봐야겠다. 오늘부터는 다시 걷기 운동도 시작하고 날씨가 덥든 덥지 않든 저녁 6시 반이면 나가서 운동을 하려고 한다.


 

 

 

 

연습문제 이론 편 문제 풀기

 

9번 문제


 

 

10번 문제

가비지가 발생하는 여부와 발생 위치, 과정 설명하기

 

(1)번 문제

 

 

가비지가 발생한다. s가 새로운 String 객체를 참조할 때마다, 이전의 String 객체는 가비지가 된다.

 

가비지 컬렉션 발생 과정

  1. 문자열 객체 생성
    • s = new String("Hello" + n); 코드가 실행될 때, 매 루프마다 new String("Hello" + n) 표현식이 평가되어 새로운 String 객체가 생성된다. 이 객체는 s 변수에 할당된다.
  2. 객체의 참조 변경
    • 루프의 각 반복에서, s는 새로운 String 객체를 참조한다. 즉, s는 이전에 참조하던 String 객체를 더 이상 참조하지 않게 된다.
  3. 가비지 발생
    • 루프가 한 번 실행될 때마다, 새로운 String 객체가 생성되고 s는 이 새로운 객체를 참조하게 된다. 이로 인해 이전에 참조되던 String 객체는 더 이상 참조되지 않게 된다. 이 객체들은 더 이상 어떤 변수나 객체의 참조도 받지 않기 때문에 가비지가 된다.
    • 가비지 컬렉터는 이런 가비지 객체들을 식별하고, 메모리에서 제거하여 재사용할 수 있는 공간을 확보한다.
  4. 가비지 위치 및 과정
    • 위치: s가 새로운 객체를 참조하게 되면서 이전 객체들은 가비지가 된다. 즉, s가 새로운 String 객체를 참조할 때마다, 이전의 String 객체는 가비지가 된다.
    • 과정: 가비지 컬렉터는 메모리에서 더 이상 참조되지 않는 객체를 자동으로 식별하고 제거한다. 이 과정은 JVM의 가비지 컬렉션 프로세스에 의해 수행한다.

요약하면

  • for 루프의 각 반복에서 s는 새로운 String 객체를 생성하여 참조한다.
  • 이전에 s가 참조하던 객체는 더 이상 참조되지 않으므로 가비지가 된다.
  • 가비지 컬렉터는 이 가비지 객체를 메모리에서 제거하여 자원을 회수한다.

이 방식은 객체 생성이 반복될 때 메모리 사용을 관리하는 데 중요한 역할을 한다.


 

 

 

(2)번 문제

 

이 문제는 가비지가 발생하지 않는다. "aa"라는 문자열 리터럴을 바탕으로 새로운 String 객체가 힙 메모리에 생성된다. 이 객체의 참조는 변수 a에 저장됩니다. 변수 a는 null로 설정되며, 더 이상 객체를 참조하지 않게 된다. 그러나 b와 c는 여전히 같은 객체를 참조하고 있다.

변수 b도 null로 설정되어, 이 시점에서 b도 객체를 참조하지 않게 된다. 그러나 c는 여전히 같은 객체를 참조하고 있다. 현재 상태에서 a와 b는 객체를 참조하지 않으며, 여전히 c만이 객체를 참조하고 있다. 따라서 a와 b가 참조하던 객체는 가비지가 발생하지 않는다.

 

 

 

이 코드에서 노란 줄이 뜨지 않도록 수정해 보았다.


 

 

 

 

문제 11번

멤버 함수의 사용이 잘못된 것은?

 

 

g() 메서드는 static 메서드이기 때문에, 클래스 자체에 속하며 클래스의 인스턴스가 없어도 호출될 수 있다. 반면, getB() 메서드는 b라는 인스턴스 변수와 관련된 메서드로, 특정 인스턴스에 의존한다. 즉, getB() 메서드는 인스턴스가 존재해야만 호출이 가능하다.

static 메서드는 인스턴스와 무관하게 동작해야 한다. 그러나 getB() 메서드는 인스턴스 변수를 반환하는 인스턴스 메서드이기 때문에, static 메서드인 g()에서 이를 호출하는 것은 논리적으로 맞지 않다.

 

 

해결방법 1 : g() 메서드를 인스턴스 메서드로 변경


 

 

 

해결방법 2 : getB() 대신 getA() 호출

 

getA()처럼 static 메서드를 호출하여 static 메서드 안에서 static 변수만 사용하도록 변경했다.


 

 

 

 

문제 12번

다음 코드에서 잘못된 문장은?

 

 

여기 이렇게 빨간 줄이 뜨는 부분이 잘못된 문장이다. 이 부분을 한번 고쳐보겠다.


 

 

 

수정한 부분에 대한 설명은 다음과 같다.

  1. StaticSample.x = 5;:
    • x는 static 변수가 아니기 때문에, 인스턴스 없이 접근할 수 없다.
    • 수정 방법: x에 접근하려면 먼저 객체를 생성해야 한다.
  2. tmp = a.y;:
    • y는 static 변수이므로 인스턴스 a를 통해 접근하는 것은 비효율적이다.
    • 수정 방법: y는 StaticSample.y로 접근하는 것이 더 적절하다.

 

 

 

 

문제 13번

코드의 틀린 부분 수정하기

 

 

f(2, 4) 메서드를 호출할 때 오류가 발생하는데 그 이유는 f 메서드가 인스턴스 메서드이기 때문이다. f 메서드를 호출하려면 먼저 Text 클래스의 객체를 생성해야 한다.

 

 

 


 

 

 

 

문제 14번 

final과 관련하여 잘못된 내용 설명하기

 

문제의 오류를 고쳐보자.

  1. Rect 클래스의 x 변수 수정 불가 오류
    • final protected int x = 5;에서 x는 final 키워드로 선언되어 있기 때문에 값이 한 번 초기화된 후에는 수정할 수 없다. 그러나 f() 메서드에서 x++을 시도하고 있다. 이로 인해 컴파일 오류가 발생한다.
  2. Rect 클래스의 f() 메서드 수정 불가 오류
    • final public void f() 메서드는 final로 선언되어 있어, 서브클래스에서 오버라이드할 수 없다. 그러나 SpecialRect 클래스에서 f() 메서드를 오버라이드하려고 하여 컴파일 오류가 발생한다.
  3. 상속 불가 오류:
    • Rect 클래스 자체가 final로 선언되어 있기 때문에, 다른 클래스에서 이를 상속받는 것이 불가능하다. 따라서 SpecialRect 클래스에서 Rect 클래스를 상속하려고 하면 오류가 발생한다.

 

 

 

 

어젯밤에 이 부분을 고쳐보려고 했는데 잘 되지 않았다. 드디어 해결 방법을 찾아서 고쳐본다. Rect 클래스가 final로 선언되어 있어서, 이를 상속하려는 RectSpecial 클래스에서 상속할 수 없다. final로는 상속할 수 없다는 걸 알게 되었다. 클래스에 final을 사용하려면 상속을 방지하고 싶을 때 사용해야 하며, 만약 상속을 허용하고 싶다면 final 키워드를 사용하지 않아야 했다.


 

 

 

문제 15번

가비지란 무엇이며 자바에서는 왜 가바지 컬렉션이 필요하며 개발자에게 주는 장점과 단점에 대해서 설명하라.

new 연산자를 이용하여 시스템으로부터 할당받아 사용하다 더 이상 사용하지 않는 객체나 배열 메모리를 가비지라 한다. 가비지가 많아지면 상대적으로 자바 가상 기계에서 응용프로그램에게 할당해 줄 수 있는 가용 메모리의 양이 줄어들어 자
바 응용프로그램의 실행에 영향을 줄 수 있으므로 자바 가상 기계는 가용 공간이 일정 크기 이하로 줄어들게 되면 자동으로 가비지를 회수하여 가용 메모리 공간을 늘린다. 이러한 가비지 컬렉션 때문에 개발자는 할당받은 메모리를 반환하는 코딩
부담을 덜게 된다. 단점은 가비지 컬렉터가 실행되는 동안 프로그램은 실행을 멈추고 잠시 동작이 일시정시되기도 한다.


 

 

 

 

문제 16번


 

 

 

 

 

학습을 마치고

이번 이론 연습문제는 따로 학습할 분량도 많고 여러 가지 생각할 것들이 많아서 실습문제 못지않게 정말 어려웠다. 글 등록은 전날 오후에 하고 저녁과 다음날 새벽에 걸쳐 푼 문제를 수정하여 올려본다.

어제는 공부하기 정말 싫은 날이었고 마음이 상한 일들도 많이 있었다. 선생들에 대한 실망도 정말 크고 이런 내가 사회생활에 적응할 수 있을지 의문에 들었다. 정말 전에 손승현 강사님이 하신 말씀이 딱 맞았다. 회사라는 곳은 겉으로는 웃고 있지만 속으로는 뒤에 칼을 숨기고 있는 사람들이 있는 곳이라는 걸..

하지만 난 이런 것을 회사뿐 아니라 광주 게임 학원에 다니기 시작한 9월 말부터 뼈저리게 느끼고 있다. GCC에서도 인공지능 사관학교에서도 언제나 똑같았다. 더 심했으면 더 심했지. 내가 해야 할 것은 그저 공부밖에 없었다.

 

그런 사람들 때문에 상처받고 무시받고 굉장히 힘든 시간을 겪었지만 지난 1년 동안 포기하지 않고 이 자리에 있다는 것만으로도 참 대단한 것이다. 비록 이 2가지는 끊지 못했지만 이것도 분명 잘 되는 날이 있으리라 본다.