java. 상속과 생성자 호출에 관한 문법

2024. 3. 1. 23:47정보처리,전산/코딩 : 문제해결

반응형

 

Child 클래스가

Parent 클래스를 상속하고 있으며

Parent 클래스에는 x라는 인스턴스 변수가 있다.

 

 

Child 클래스에는 x라는 인스턴스 변수가 또 다른 값을 가지고 있다.

이 때 Child 클래스에서 getX() 메서드를 호출하면 Parent 클래스의 getX() 메서드가 호출된다.

왜냐하면 Child 클래스에 getX() 메서드가 없기 때문이다.

그리고 Parent 클래스의 getX() 메서드는 Parent 클래스의 인스턴스 변수 x를 반환하므로 Child 클래스의 x값이 아닌 Parent 클래스의 x값인 500이 출력된다.

 

자바에서는 메서드 호출 시 참조 변수의 타입이 아닌 객체의 타입에 따라 메서드가 호출되므로,

obj.getX()에서 getX() 메서드는 Child 객체가 아닌 Parent 객체의 것을 호출한다.

 
class Parent {
    int x = 100;
 
    Parent() {
        this(500);
    }
 
    Parent(int x) {
        this.x = x;
    }
 
    int getX() {
        return x;
    }
}
 
class Child extends Parent {
    int x = 4000;
    
    Child() {
        this(5000);
    }
 
    Child(int x) {
        this.x = x;
    }
}
 
public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

 

 

코드의 실행 순서다:

1. `Main` 클래스의 `main` 메서드가 실행
2. `Child` 클래스의 객체 `obj`가 생성
3. `Child` 클래스의 기본 생성자인 `Child()`가 호출
4. `Child()` 생성자 내부에서 `this(5000);` 코드가 실행
5. `this(5000);`는 `Child(int x)` 생성자를 호출합니다. 여기서 `x`의 값으로 `5000`이 전달

6. `Child(int x)` 생성자 내부에서 `this.x = x;` 코드가 실행되어 `Child` 클래스의 인스턴스 변수 `x`의 값이 `5000`으로 설정

 

`this.x`는 현재 객체의 인스턴스 변수를 가리킨다

자바에서 `this` 키워드는 현재 객체를 가리키는 참조이다.

`Child(int x)` 생성자에서 `this.x = x;`는 현재 `Child` 객체의 `x` 인스턴스 변수를 생성자의 매개변수로 전달받은 값 `x`로 초기화하는 것을 의미

7. `Parent` 클래스의 기본 생성자인 `Parent()`가 호출
8. `Parent()` 생성자 내부에서 `this(500);` 코드가 실행
9. `this(500);`는 `Parent(int x)` 생성자를 호출. 여기서 `x`의 값으로 `500`이 전달
10. `Parent(int x)` 생성자 내부에서 `this.x = x;` 코드가 실행되어 `Parent` 클래스의 인스턴스 변수 `x`의 값이 `500`으로 설정
11. `Parent` 클래스의 인스턴스 변수 `x`의 값인 `500`이 `getX()` 메서드를 통해 반환됨
12. `System.out.println(obj.getX());` 코드에 의해 콘솔에 `500`이 출력
따라서 이 코드의 출력 결과는 `500`이 된다

 

 

 

 

 

 

 

 

 

변수 x의 흐름

1. `Parent` 클래스 내의 변수 x:
   - 초기값: 100

2. `Child` 클래스 내의 변수 x:
   - 초기값: 4000

3. `Parent` 클래스의 생성자 호출:
   - `Child` 클래스의 인스턴스를 생성할 때, 먼저 `Parent` 클래스의 생성자가 호출됨
   - `Parent` 클래스의 기본 생성자인 `Parent()`가 호출됨
   - `Parent()` 생성자 내에서 `this(500);`를 통해 `Parent(int x)` 생성자가 호출됨
   - `Parent(int x)` 생성자 내에서 `x` 변수가 500으로 초기화

 

`Parent` 클래스가 먼저 호출되는 이유는 상속 관계에서 하위 클래스의 생성자가 호출되기 전에 상위 클래스의 생성자가 먼저 호출되기 때문이다.


따라서 출력 전까지 변수 x의 흐름은
100 (Parent 클래스의 초기값) -> 500 (Parent 클래스의 생성자 호출로 변경) -> 5000 (Child 클래스의 생성자 호출로 변경) -> 500 (getX() 메서드 호출 시 반환되는 값)

반응형