코딩일기/자격증

[정보처리기사] [ Java ] 클래스, 객체, 상속, 생성자, super | 2020년 2회 정보처리기사 실기 기출문제

jhy_2023 2024. 10. 15. 14:42
728x90
반응형

문제

다음은 자바 코드이다. 출력 결과를 쓰시오.

class A {
    private int a;
    public A(int a) {
        this.a = a;
    }
    public void display() {
        System.out.println("a=" + a);
    }
}

class B extends A {
    public B(int a) {
        super(a);
        super.display();
    }
}

public class good {
    public static void main(String[] args) {
        B obj = new B(10);
    }
}

정답

a = 10


해설

✔ 코드 전체 흐름

이 코드는 크게 3개의 부분으로 나뉘어 있습니다.

  1. 클래스 A: 인스턴스 변수 a와 이를 초기화하는 생성자 및 값을 출력하는 display() 메서드를 가진 부모 클래스입니다.
  2. 클래스 B: 클래스 A를 상속받아 부모 클래스의 기능을 확장하고 있는 자식 클래스입니다.
  3. 클래스 good: 자바 애플리케이션이 실행되는 진입점인 main() 메서드를 포함한 실행 클래스입니다. 

이 프로그램의 실행 흐름은 main() 메서드에서 시작됩니다. 이때 B 클래스의 객체가 생성되고, 그 과정에서 부모 클래스 A의 생성자와 메서드가 호출됩니다.


코드 흐름 순서 : 

  1. 클래스 good  : B obj = new B(10);에서 클래스 B의 객체가 생성됩니다.
  2. 클래스 B  : 클래스 B의 생성자가 호출됩니다. 이때 super(a)를 통해 부모 클래스 A의 생성자가 호출되어 a가 10으로 초기화됩니다.
  3. 클래스 A : 부모 클래스 A의 display() 메서드가 호출되어 a = 10이 출력됩니다.

코드 세부 설명

📌 class A

class A {
    private int a;
    public A(int a) {
        this.a = a;
    }
    public void display() {
        System.out.println("a=" + a);
    }
}

1. class A {

  • 자바에서 **클래스(Class)**는 **객체(Object)**를 정의하는 일종의 설계도 또는 청사진이라고 할 수 있습니다. 객체지향 프로그래밍에서 객체는 클래스에 정의된 속성(변수)과 기능(메서드)을 가진 실체이며, 클래스는 이러한 객체를 생성하기 위한 구조와 동작 방식을 정의합니다.
  • class A는 자바에서 클래스 A를 정의하는 부분입니다. 클래스 A는 앞으로 이 프로그램에서 하나의 데이터 타입처럼 사용될 수 있습니다.

2. private int a;

  • 클래스 A의 속성 중 하나인 a를 선언한 부분입니다. private으로 선언했기 때문에, 클래스 외부에서 직접 접근할 수 없습니다. 클래스 내부에서만 사용 가능하며, 외부에서 값을 설정하거나 가져오려면 메서드를 통해 접근해야 합니다.
  • 인스턴스 변수란 객체가 생성될 때 각각의 객체마다 따로 저장되는 변수입니다. 즉, 객체가 여러 개 생성되면, 각각의 객체마다 자신만의 a 값을 가지게 됩니다.
  • 클래스와 객체의 관계
    • 클래스는 객체를 만드는 틀이고, 객체는 이 틀을 기반으로 만들어진 실제 데이터와 동작을 담고 있는 실체입니다. 예를 들어, 클래스를 통해 자동차라는 개념을 정의하면, 객체는 실제로 존재하는 특정 자동차입니다. 클래스 A는 a라는 속성을 가지고 있으며, 이 클래스의 객체를 생성하면 그 객체는 자신만의 a 값을 가지게 됩니다.
    • 아래 코드에서 obj1과 obj2는 각각 다른 값을 가지는 객체입니다. obj1.display()를 호출하면 a = 10이 출력되고, obj2.display()를 호출하면 a = 20이 출력됩니다.
A obj1 = new A(10);  // 첫 번째 객체, a = 10
A obj2 = new A(20);  // 두 번째 객체, a = 20

3. public A(int a) {

  • 생성자(Constructor):
    • 이 줄은 클래스 A의 생성자를 정의한 부분입니다. 생성자는 객체가 생성될 때 자동으로 호출되며, 객체의 초기 상태를 설정하는 역할을 합니다. 여기서는 객체가 생성될 때 매개변수로 받은 값을 인스턴스 변수 a에 저장하도록 되어 있습니다.
    • 예를 들어, A obj = new A(10);처럼 객체를 생성하면, 생성자 A(int a)가 호출되어 a에 10이 저장됩니다.

4. this.a = a;

  • this 키워드:
    • this.a는 클래스 A의 인스턴스 변수 a를 나타냅니다. this는 현재 객체를 가리키는 특별한 키워드로, 인스턴스 변수와 매개변수의 이름이 같을 때 혼동을 방지하기 위해 사용됩니다.
    • 이 코드는 매개변수 a의 값을 현재 객체의 인스턴스 변수 a에 저장하는 역할을 합니다. 즉, 전달된 값으로 객체의 속성 a를 초기화합니다.

5. public void display() {

  • 메서드 display():
    • 이 메서드는 인스턴스 변수 a의 값을 출력하는 역할을 합니다. void는 이 메서드가 반환값을 가지지 않는다는 의미입니다.
    • 메서드 display()를 호출하면, 인스턴스 변수 a에 저장된 값이 System.out.println("a=" + a);을 통해 출력됩니다.
    • System.out.println("a=" + a);
      • 이 줄은 출력문입니다. System.out.println()은 콘솔에 값을 출력하는 역할을 하며, "a=" + a는 문자열과 변수 a의 값을 결합하여 출력합니다. 예를 들어, a의 값이 10이라면, a=10이라는 문자열이 출력됩니다.
반응형

📌 class B

class B extends A {
    public B(int a) {
        super(a);
        super.display();
    }
}

1. class B extends A {

  • 이 줄은 클래스 B를 정의하고 있습니다. extends A는 클래스 B가 클래스 A를 상속받는다는 것을 의미합니다. 상속은 객체지향 프로그래밍에서 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있도록 하는 기능입니다. 즉, 상속을 통해 클래스 B가 클래스 A의 모든 필드와 메서드를 사용할 수 있다는 의미이며 B는 부모 클래스 A의 속성을 물려받고, 필요에 따라 기능을 확장하거나 수정할 수 있습니다.

2. public B(int a) {

  • 클래스 B의 생성자입니다. 클래스 A의 생성자와 동일하게 매개변수 a를 전달받으며, 이 값을 부모 클래스에 전달하여 초기화합니다.
  • 생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다. 클래스 B의 객체가 만들어질 때 B obj = new B(10);와 같이 생성자가 호출되며, 이때 매개변수로 전달된 값(여기서는 10)이 a로 전달됩니다.

3. super(a);

  • super(a) 호출:
    • super 키워드는 자식 클래스에서 부모 클래스의 생성자나 메서드를 호출할 때 사용합니다. 여기서 super(a)는 부모 클래스 A의 **생성자 A(int a)**를 호출하는 코드입니다.
    • 이 호출은 자식 클래스 B가 부모 클래스 A를 상속받았으므로, 부모 클래스 A의 생성자 A(int a)를 호출하여, 부모 클래스의 필드 a를 초기화합니다.
    • super(a)의 역할:
      • 클래스 B가 생성될 때, super(a)를 통해 클래스 A의 생성자가 먼저 호출되고, A 클래스의 인스턴스 변수 a가 초기화됩니다.
      • 즉, 부모 클래스의 생성자가 먼저 실행되어, 클래스 A의 인스턴스 변수 a에 전달된 값(여기서는 10)이 저장됩니다.

4. super.display();

  • 부모 클래스 A의 display() 메서드 호출:
    • **super.display();**는 부모 클래스 A의 display() 메서드를 호출하는 코드입니다. 상속을 통해 클래스 B는 부모 클래스 A의 모든 메서드를 상속받았으므로, super 키워드를 통해 명시적으로 부모 클래스의 메서드를 호출할 수 있습니다.
    • super.display();를 호출하면, A 클래스의 display() 메서드가 실행되어 인스턴스 변수 a의 값이 출력됩니다. 즉,  부모 클래스 A의 display() 메서드를 호출하여 이를 통해 System.out.println("a=" + a);가 실행되며, 현재 a의 값이 출력됩니다. 이 경우 부모 클래스에서 저장한 a의 값인 10이 출력됩니다.
    • 상속된 메서드 호출:
      • 자식 클래스 B에서 부모 클래스의 메서드를 호출할 때 **super**를 사용하면, 부모 클래스에서 정의된 동작을 그대로 실행할 수 있습니다. 이 경우, B 클래스는 A 클래스의 동작을 확장하면서도, A 클래스에서 정의된 기능을 그대로 재사용합니다.

728x90

📌 class good

public class good {
    public static void main(String[] args) {
        B obj = new B(10);
    }
}

good 클래스는 자바 프로그램의 **진입점(entry point)**인 main() 메서드를 포함한 부분입니다. 자바 애플리케이션은 항상 main() 메서드로부터 실행이 시작되기 때문에, 이 부분이 프로그램의 실행 흐름을 결정하는 중요한 역할을 합니다.

1. public class good {

  • 클래스 good은 실행할 수 있는 메인 클래스입니다. public 접근 제어자는 어디서든 이 클래스를 사용할 수 있다는 의미입니다. 자바 프로그램에서 main 메서드를 포함한 클래스는 프로그램의 시작점을 나타냅니다.

2. public static void main(String[] args) {

  • 이 줄은 자바 애플리케이션의 실행이 시작되는 지점main() 메서드를 정의한 부분입니다. 자바 프로그램은 항상 main() 메서드를 찾아서 실행하며, main()이 없으면 프로그램은 실행되지 않습니다.
  • public: 이 메서드는 어디서든 접근할 수 있도록 공개 범위를 설정합니다.
  • static: 이 메서드는 프로그램 실행 시 클래스의 인스턴스를 생성하지 않고도 호출될 수 있음을 의미합니다. 즉, good 클래스의 객체를 만들지 않아도 main() 메서드를 바로 실행할 수 있습니다.
  • void: 이 메서드는 반환값이 없음을 나타냅니다. main() 메서드는 프로그램의 진입점이므로, 반환값이 필요 없습니다.

3. B obj = new B(10);

  • 객체 생성 (new 키워드):
    • 이 코드는 클래스 B의 새로운 객체를 생성하는 과정입니다.
    • new B(10)은 B 클래스의 생성자를 호출하여 객체를 생성하고, 이 객체는 obj라는 이름으로 사용됩니다.
    • 즉, **B obj**는 "B 클래스에서 생성된 객체를 가리키는 변수"입니다.
  • 생성자 호출:
    • **new B(10)**은 **B 클래스의 생성자 B(int a)**를 호출합니다. 이때 정수 값 10이 인수로 전달됩니다.
  • super(10) 호출:
    • B 클래스의 생성자가 실행되면서, **super(10)**을 호출하여 부모 클래스 A의 생성자가 실행됩니다.
    • 이때, **A 클래스의 인스턴스 변수 a**는 10으로 초기화됩니다.
  • 출력:
    • **super.display()**가 호출되어 부모 클래스 A의 display() 메서드가 실행됩니다.
    • 이 메서드는 인스턴스 변수 a의 값인 **a = 10**을 출력합니다.

이 코드의 결과로 **a = 10**이 출력됩니다.


정리

  1. 클래스 A 생성자 호출:
    • new B(10)이 실행되면서 먼저 클래스 B의 생성자가 호출됩니다.
    • 클래스 B의 생성자 안에서 super(a)가 호출되어 클래스 A의 생성자가 실행됩니다.
    • 이때 부모 클래스 A의 생성자는 전달받은 값 10을 this.a에 저장하게 됩니다. 즉, 부모 클래스 A의 인스턴스 변수 a가 10으로 초기화됩니다.
  2. 클래스 A의 display() 메서드 호출:
    • 부모 클래스의 생성자가 완료된 후, super.display()가 호출됩니다.
    • 이 메서드는 클래스 A의 display() 메서드를 호출하여 a의 값을 출력합니다.
    • 결과적으로 **a = 10**이 콘솔에 출력됩니다.

더 간단하게 정리하자면

  • 클래스 A는 a라는 인스턴스 변수를 가지고 있으며, 이를 출력하는 display() 메서드를 가지고 있습니다.
  • 클래스 B는 클래스 A를 상속받아, 객체 생성 시 부모 클래스 A의 생성자와 display() 메서드를 호출하여 a 값을 출력합니다.
  • B obj = new B(10);에서 객체가 생성될 때, 부모 클래스 A의 생성자가 먼저 실행되고, 그 후 a = 10이 출력됩니다.

이 코드의 전체적인 동작은 상속을 활용하여 부모 클래스의 생성자와 메서드를 호출해 값을 출력하는 과정입니다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형