본문 바로가기
Java/연습문제

[명품 자바] 4장 클래스와 객체 이론문제

by Meaning_ 2021. 7. 11.
728x90
반응형

1번 

 

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

 

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

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

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

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

 

2번

 

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

 

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

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

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

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

 

 

이유 --> return은 사용할 수 있지만 값을 리턴할 수 없다.

 

4번

 

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

 

Book[] book=new Book[10];

 

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

2) Book 객체가 10개 만들어진다. --> Book 객체에 대한 레퍼런스가 10개 만들어지는 것

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

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

 

5번

 

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

 

메소드 오버로딩 조건

 

1. 매소드의 이름이 같아야

2. 매개변수의 개수나 타입이 서로 달라야

--> 두개를 동시에 만족해야 메소드 오버로딩이 성공!

 

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;

  int 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;}

}
--> 매개변수의 개수가 다르고, 메소드의 이름이 다르다

 

* 주의할것! *

메소드 오버라이딩은 리턴타입이 같아야 하지만, 메소드 오버로딩은 리턴타입과 아무런 관련이 없다!

 

6번

 

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

 

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

 

32인치 LG

32인치 삼성

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

 

TV tv=new TV(65,"삼성");

 

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

 

중복되지 않고 간결하다. 초기화 생성자를 한곳에 몰아넣을 수 있다.

 

7번

 

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

 

class Person{

   private int age;

}

 

public class Example{

  public static void main(String[]args){

 

      Person aPerson=new Person();

      aPerson.age=17;

  }

}

 

 

답) 출제의도 -> getter/setter 사용

 

 

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;

   }

}

 

답) 출제의도 --> 생성자 사용

 

9번

 

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

 

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

 

 

10번

 

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

 

(1)

 

String s=null;

for(int i=0;i<10;i++){

  s=new String("Hello"+i);

  System.out.println(s);

}

 

i가 0일때는 String 객체를 가리키지만 이후부터는 다른 객체를 가리키게 되므로 i가 1부터 9까지 가비지가 발생한다. 

 

(2)

 

String a= new String("aa");

String b=a;

String c=b;

a=null;

b=null;

 

a와 b가 null이더라도 c가 String객체를 가리키므로 가비지가 발생하지 않는다. 

 

 

11번

 

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

 

class StaticTest{

  static int a;

  static int getA(){ return a;}

  int b;

  int getB(){return b;}

  int f(){ return getA()}

  static int g(){return getB()}

}

 

static에서 non-static 멤버변수 접근이 불가능하다!

 

반대로 non-static에서 static멤버변수로 접근은 가능

 

static 메소드는 static 멤버만 접근 가능 

 

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번

 

기억! static은 객체 생성없이도 접근 가능!

 

(1)이 옳게 되려면

StaticSample s=new StaticSample(); -->객체생성 후

s.x=5; // 접근 

 

 

13번

 

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

 

main메서드가 static 타입으로 f 함수도 static 타입이여야 한다.

 

cf) 같은 클래스일 때/ 다른 클래스일때 static이 어떤 영향을 미치는지 헷갈려서 정리해봤다!

14번 

 

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

 

 

final class Rect {
     final protected int x = 5;
     final public void f() {
             x++; --> final 처리된 변수는 변경되지 못한다.
            System.out.print(x);
     }
}
class SpecialRect extends Rect { // SpecialRect는 Rect를 상속받는다. -->final 로 선언된 클래스는 상속이 불가하다.
        public void f() { -->final로 선언된 메소드는 오버라이딩이 불가하다. 
              System.out.print(super.x); // super.x는 Rect의 x
        }
}

 

 

15번

 

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

 

참조하는 레퍼런스가 하나도 없는 객체를 가비지라고 한다. 가비지가 많아지는 경우,  JVM이 자바 응용프로그램에 할당하는 가용메모리가 줄어드므로 가비지 컬렉션이 필요하다. 가비지 컬렉션을 이용하면 가용 메모리 공간을 늘려 개발자는 할당 받은 메모리를 반환하는 코딩 부담을 덜게 된다.

 

728x90
반응형

댓글