-> 블로그 이전

[명품 Java] 4장 연습문제 (클래스와 객체)

2021. 11. 22. 15:39Solution`/Java

[4장 1번]

자바의 클래스와 객체에 대한 설명 중 틀린 것은?

1. 클래스 바깥에 전역 변수는 선언할 수 없다.

2. 클래스는 객체를 생성하기 위한 틀이다.

3. 클래스의 멤버 변수를 필드라고 부르며, 클래스는 필드와 메소드로 이루어진다..

4. 필드는 클래스 내에서 private 보다 public으로 선언하는 것이 바람직하다.

 

- 4번. 필드는 클래스 내에서 public 보다 private로 선언하는 것이 바람직하다

 

 

[4장 2번]

생성자에 대한 설명 중 틀린 것은?

1. 생성자가 작성되어 있지 않으면, 컴파일러가 자동으로 기본 생성자를 추가해준다.

2. 생성자의 이름은 클래스의 이름과 반드시 같아야 한다.

3. this()는 생성자 내에서 다른 생성자를 호출하는 코드이다.

4. 생성자에서는 아무 값도 리턴하지 않기 때문에 return문을 사용할 수 없다.

 

- 4번. 생상자에서는 return을 사용할 수 있다 (실행 종료)

 

 

[4장 3번]

다음 코드 중 오류가 있는 것은?

1. Power []p = new Power[10];    
2. Power p[] = new Power[10];    
3. Power p[10] = new Power[10];    
4. Power[] p;

- 3번. Power p[] = new Power [10];로 변경해야 한다

 

 

[4장 4번]

다음 코드에 대해 설명하는 문항 중 틀린 것은?

Book[] book = new Book[10];

1. book은 배열에 대한 레퍼런스이다.

2. Book 객체가 10개 만들어진다.

3. for(int i=0; i<book.size; i++) book[i] = new Book();로 객체들을 만들어야 비로소 배열이 완성된다.

4. book[0], book[1], ... , book[9] 모두 Book 객체에 대한 레퍼런스이다.

 

- 2번. Book[] book = new Book[10]; -> 이 코드로는 객체가 아직 생성되지 않았다. 3번선지를 실행해야 비로소 객체를 생성한 것이 된다.

 

 

[4장 5번]

음 중 메소드 오버로딩에 실패한 사례는?

(1) class A{
            int x;
            void f(int a) { x = a; }
            int f(int b) { return x+b; }
}

(2) class A{
            int x;
            void f(int a ) { x = a; }
            void f() { x = 0; }
}

(3) class A {
            int x;
            inf f() { return x; }
            int f(int a, int b) { return a+b; }
}

(4) class A {
            static int x=0;
            static int f(int a) { return a+x; }
            static int f() { return 3; }
}

- 1번. 매개변수의 개수 or 타입이 달라야 하는데, 개수/타입 모두 동일하다

 

 

 

[4장 6번]

다음 코드에 대해 답하라.

class TV {
   int size;
   String manufacturer;
   public TV() {
      size = 32;
      manufacturer = "LG";
      System.out.println(size+"인치 "+manufacturer);
   }
   public TV(String manufacturer) {
      this.size = 32;
      this.manufacturer = "LG";
      System.out.println(size+"인치 "+manufacturer);
   }
   public TV(int size, String manufacturer) {
      this.size = 32;
      this.manufacturer = "LG";
      System.out.println(size+"인치 "+manufacturer);
   }
}

 

(1) this()를 이용하여 생성자를 수정하라.

class TV {
   int size;
   String manufacturer;
   public TV() {
      this(32, "LG");
   }
   public TV(String manufacturer) {
      this(32, manufacturer);
   }
   public TV(int size, String manufacturer) {
      this.size=size;
      this.manufacturer=manufacturer;
      System.out.println(size+"인치 "+manufacturer);
   }
}

 

(2) new TV(); 와 new TV("삼성");를 실행하면 실행 결과는 각각 무엇인가?

- new TV(); : 32인치 LG

- new TV("삼성"); : 32인치 삼성

 

(3) 65인치 "삼성" TV 객체를 생성하는 코드를 적어라.

new TV(65, "삼성");

 

(4) this()를 이용하는 장점은 무엇인가?

- 같은 클래스 내의 다른 생성자를 호출하여 사용할 수 있다.

 

 

[4장 7번]

다음 클래스에는 컴파일 오류가 있다. 오류 부분을 지적하고 오류를 수정할 수 있는 방법을 모두 제시하라. 그리고 그 중 객체 지향 프로그래밍에 가장 적합한 방법을 설명하라.

class Person {
    private int age;
}
public class Example {
    public static void main (String args[]) {
        Person aPerson = new Person();
        aPerson.age = 17;
    }
}

- age가 Person클래스에서 private로 지정되어 있기 때문에 Person클래스 밖에서 접근이 불가능하다


class Person {
   private int age;
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
}
public class Example {
    public static void main (String args[]) {
        Person aPerson = new Person();
        aPerson.setAge(17);
    }
}

 

 

[4장 8번]

음 코드를 객체 지향 프로그래밍 관점에서 바람직한 코드로 수정하라

class Power {
    public int kick;
    public int punch;
}
public class Example {
    public static void main (String args[]) {
        Power robot = new Power();
        robot.kick = 10;
        robot.punch = 20;
    }
}

≫ 풀이

class Power{
   private int kick;
   private int punch;
   public void setKick(int kick) {
      this.kick = kick;
   }
   public void setPunch(int punch) {
      this.punch = punch;
   }
}
public class Example {
    public static void main (String args[]) {
        Power robot = new Power();
        robot.setKick(10);
        robot.setPunch(20);
    }
}

 

 

[4장 9번]

다음은 객체 소멸에 대한 설명이다. 보기에서 빈칸에 적절한 말을 삽입하라.

자바에서는 객체를 임의로 소멸시킬수 없으며, 이것은 개발자에게 매우 다행한 일이다. 
참조하는 레퍼런스가 하나도 없는 객체를 가비지라고 판단하고, 이를 가용 메모리로 자동 
수집하는 가비지 컬렉션을 진행시킨다. 응용프로그램에서 자바 플랫폼에게 이 과정을 
지시하고자 하면 System.gc()코드를 호출하면 된다.

 

- 소멸, 다행한, 레퍼런스, 가비지, 가비지 컬렉션, System.gc()

 

 

[4장 10번]

다음 코드가 실행될 때 가비지가 발생하는가? 만일 발생한다면 발생하는 위치와 과정을 설명하라.

(1) String s = null;
      for(int n=0; n<10; n++) {
            s = new String("Hello"+n);
            System.out.println(s); 
      }
      
(2) String a = new String("aa");
      String b = a;
      String c = b;
      a = null;
      b = null;   

- (1) : s가 가리키던 new String("Hello"+n); 부분이 반복문을 실행할수록 가비지가 발생한다.

- (2) : 가비지가 발생하지 않는다. (c가 결국 String("aa")를 가리킨다)

 

 

[4장 11번]

다음 클래스에서 멤버 함수의 사용이 잘못된 것은?

class StaticTest {
    static int a;
    static int getA() { return a; } //(1)
    int b;
    int getB() { return b; } //(2)
    int f() { return getA(); } //(3)
    static int g() { return getB(); } //(4)
}

- (4) : static 메소드에서는 non-static 메소드를 접근하지 못한다

 

 

[4장 12번]

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

class StaticSample {
    public int x;
    public static int y;
    public static int f() { return y; }
}
public class UsingStatic {
    public static void main (String[] args) {
        StaticSample.x = 5; //(1)
        StaticSample.y = 10; //(2)
        int tmp = StaticSample.f(); //(3)
        StaticSample a = new StaticSample();
        tmp = a.y; //(4)
    }
}

- 1번. non-static 멤버는 클래스명(StaticSample)으로 접근할 수 없다

- 접근하려면 StaticSample StaticSample = new StaticSample();를 작성하고 접근해야 한다

 

 

[4장 13번]

다음 소스에 틀린 부분이 있는지 판단하라. 만일 있다면 수정하라.

class Test {
    public int f(int a, int b) {
        return a + b;
    }
    public static void main (String[] args) {
        int sum = f(2,4);
    }
}

- main() 메소드가 static 타입이기 때문에 f()를 호출하려면 f()도 static 타입으로 변경해야 한다

- public static int f(int a, int b){ return a+b; }

 

 

[4장 14번]

다음 코드에는 final과 관련하여 3가지 잘못된 것이 있다. 잘못된 내용을 설명하라.

final class Rect {
    final protected int x = 5;
    final public void f() {
        x++;
        System.out.print(x);
    }
}
class SpecialRect extends Rect { // SpecialRect는 Rect를 상속받는다.
    public void f() {
        System.out.print(super.x); // super.x는 Rect의 x
    }
}

1. x++; : x는 final이 붙었기 때문에 변경하지 못한다 (상수처리)

2. class SpecialRect extends Rect : final이 붙은 클래스는 상속하지 못한다

3. super.x : final이 붙은 메소드는 오버라이딩을 할 수 없다

 

 

[4장 15번]

가비지와 가비지 컬렉션은 표준 C나 C++에는 없는 자바 언어의 독특한 특성이다. 가비지란 무엇인지, 자바에서는 왜 가비지 컬렉션이 필요한지, 가비지 컬렉션이 개발자에게 주는 장점과 단점은 무엇인지 설명하라.

- 가비지 : 자바에서 new로 할당받은 후 사용하지 않게 된 객체 메모리

 

- GC(Garbage Collection) 필요한 이유 : 가비지가 많아지면 상대적으로 자바 가상 기계에서 응용프로그램에게 할당 해줄 수 있는 가용 메모리의 양이 줄어들어 자바 응용프로그램의 실행에 영향을 줄 수 있으므로 가바지를 회수해서 가용 메모리를 늘려야 한다

 

- GC 장점

  • 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽히 관리할 필요가 없어진다
  • 유효하지 않은 포인터 접근/이중 해제/메모리 누수 등 이러한 버그를 줄이거나 막을 수 있다

 

- GC 단점

  • 어떤 메모리를 해제할지 결정하는 데 비용이 든다
  • 객체가 필요 없어지는 시점에도 GC 알고리즘이 메모리 해제 시점을 추적해야 해서 오버헤드가 발생
  • GC가 일어나는 타이밍이나 점유 시간을 예측하기 힘들다 -> 할당된 메모리가 해제되는 시점을 알 수 없다
  • 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다 -> 실시간 시스템에 적합하지 않다

 

 

 

[4장 16번]

다음 표를 완성하라. 멤버가 4가지 접근 지정자로 각각 선언되었을 때, 같은 패키지의 클래스와 다른 패키지의 클래스에서 이 멤버를 접근할 수 있는지 O, X로 표기하라.

  default public protected private
같은 패키지 클래스 O O O X
다른 패키지 클래스 X O X X