오답노트/Java

자바(Java)_클래스 연습문제(2)

개발..너... 2022. 3. 23. 02:13

▶문제1

 

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

 

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

 

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

 

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

 

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

 

[답]

4

 

[풀이]

자바는 객체지향언어이다. 객체 지향 언어는 은닉화를 기본으로 하기에 private로 선언하는 것이 권고된다.

 

 

▶문제2

 

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

1. 생성자가 작성되어 있지 않으면, 컴파일러가 자동으로 기본 생성자를 추가해준다.
2. 생성자의 이름은 클래스의 이름과 반드시 같아야 한다.
3. this()는 생성자 내에서 다른 생성자를 호출하는 코드이다.
4. 생성자에서는 아무 값도 리턴하지 않기 때문에 return문을 사용할 수 없다.

 

[답]

4

 

[풀이]

3. this()가 메서드로서 사용할 경우를 뜻한다. 

4. 생성자의 실행을 끝내고자하면 생성자 어디서든 return 문을 상용할 수 있다.

 

 

▶문제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

 

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

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

 

[풀이]

https://www.delftstack.com/ko/howto/java/java-array-of-objects/

 

 

 

▶문제5

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(1class A{
            int x;
            void f(int a) { x = a; }
            int f(int b) { return x+b; }
}
 
(2class A{
            int x;
            void f(int a ) { x = a; }
            void f() { x = 0; }
}
 
(3class A {
            int x;
            inf f() { return x; }
            int f(int a, int b) { return a+b; }
}
 
(4class A {
            static int x=0;
            static int f(int a) { return a+x; }
            static int f() { return 3; }
}
cs

 

[답]

1

 

[풀이]

오버로드하는데 가장 중요한 것은 멤버변수의 데이터 타입으로  오버로딩의 가장 대표적인 조건이 데이터타입이 달라야하는것으로 1번이 오답이다.

 

 

▶문제6

 

TV클래스에 대한 아래 문제를 풀어라

(1)this()를 이용하여 생성자를 수정
(2)new TV(); 와 new TV("삼성");를 실행하면 실행 결과는 각각 무엇인가?
(3) 65인치 "삼성" TV 객체를 생성하는 코드를 적어라
(4) this()를 이용하는 장점은 무엇인가?

 

*TV클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
   }
}
cs

 

[답]

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
   }
}
cs

 

(2)new TV(); 와 new TV("삼성");를 실행한 실행결과

 

32인치 LG

32인치 삼성

 

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

 

Tv t = new Tv(65,"삼성");

 

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

 

코드의 간결화

같은 클래스내의 다른 생성자 호출 가능 

 

 

▶문제7

 

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

 

1
2
3
4
5
6
7
8
9
10
class Person {
    private int age;
}
public class Example {
    public static void main (String args[]) {
        Person aPerson = new Person();
        aPerson.age = 17;
    }
}
 
cs

 

[답]

 

1
2
3
4
5
6
7
8
9
class Person {
   private int age;
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
}
cs

 

[풀이]

 

age앞에 private로 제한한정자를 설정해두었기에 age는 getter와 setter로 접근해야만한다. 

객체지향 프로그램은 언제나 데이터를 은닉화시키고 이를 getter와 setter같은 별도의 메소드로 필드에 접근 하는 것을 권고하고있다.

 

▶문제8

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
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;
    }
}
 
cs

 

[답]

 

1
2
3
4
5
6
7
8
9
10
class Power{
   private int kick;
   private int punch;
   public void setKick(int kick) {
      this.kick = kick;
   }
   public void setPunch(int punch) {
      this.punch = punch;
   }
}
cs

 

 

▶문제9

 

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

자바에서는 객체를 임의로 (1)시킬수 없으며, 이것은 개발자에게 매우 (2) 일이다. 참조하는 (3)가 하나도 없는 객체를 (4)라고 판단하고, 이를 가용 메모리로 자동 수집하는 (5)을 진행시킨다. 응용프로그램에서 자바 플랫폼에게 이 과정을 지시하고자 하면 (6)코드를 호출하면 된다.

 

[답]

 

(1) 소멸

(2) 다행인

(3) 레퍼런스

(4) 가비지

(5) 가비지 컬렉션

(6) System.gc()코드

 

▶문제10

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
(1String s = null;
      for(int n=0; n<10; n++) {
            s = new String("Hello"+n);
            System.out.println(s); 
      }
      
(2String a = new String("aa");
      String b = a;
      String c = b;
      a = null;
      b = null;      
 
cs

 

[답]

 

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

- (2) 에서는 가비지가 발생하지 않는다. (결국은 c가 String("aa")를 가리키기 때문)

 

 

▶문제11

 

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

 

1
2
3
4
5
6
7
8
9
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)
}
 
cs

 

[답]

4

 

[풀이]

Static 메소드에서는 non-Static 멤버에 접근할 수 없다.