본문 바로가기

Java/Java Advance

자바 생성자와 상속 관계의 이해

728x90
반응형

생성자와 상속은 객체 지향 프로그래밍의 기본 개념 중 하나입니다. 생성자는 객체의 초기화를 담당하며, 상속은 클래스 간의 관계를 형성하여 코드의 재사용성과 확장성을 증가시킵니다. 이를 자세히 이해하기 위해, `super()`와 `this()` 메서드를 통한 생성자 호출을 예제를 통해 살펴보겠습니다.

 

1. 상속(일반화관계)과 생성자의 관계

자바에서 상속은 기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있게 해주는 개념입니다. 생성자는 객체를 초기화하고 메모리에 할당할 때 호출되는 특별한 메서드입니다. 상속 관계에서 하위 클래스는 상위 클래스의 생성자를 호출하여 상위 클래스의 멤버 변수를 초기화할 수 있습니다.


2. 생성자를 명시적으로 호출하는 `this()`, `super()` 메서드 이해

`this()`는 동일한 클래스의 다른 생성자를 호출할 때 사용되며, `super()`는 상위 클래스의 생성자를 호출할 때 사용됩니다.

public class Employee {
    String part, name;
    int age, baseSalary;

    public Employee() {
        System.out.println("Emp의 default Constructor");
    }

    public Employee(String str) {
        name = str;
        System.out.println("Emp의 name을 받는 Constructor");
    }

    public Employee(String str1, String str2) {
        this(str1); // Emp(String str) 생성자 호출
        part = str2;
        System.out.println("Emp의 name, part를 받는 Constructor");
    }

    public Employee(String str1, String str2, int i) {
        this(str1, str2); // Emp(String str1, String str2) 생성자 호출
        age = i;
        System.out.println("Emp의 name, part, age를 받는 Constructor");
    }

    public int salary() {
        System.out.println("Emp의 salary() method");
        baseSalary = 100;
        return baseSalary;
    }
}

1. `Employee e1 = new Employee();`을 호출하면 "Emp의 default Constructor"가 출력됩니다.
2. `Employee e2 = new Employee("John");`을 호출하면 "Emp의 name을 받는 Constructor"가 출력됩니다.
3. `Employee e3 = new Employee("Jane", "IT");`을 호출하면 "Emp의 name, part를 받는 Constructor"가 출력됩니다. 이때, `this(str1)`로 인해 `Emp(String str)` 생성자가 호출되어 `name`이 초기화됩니다.
4. `Employee e4 = new Employee("Doe", "HR", 30);`을 호출하면 "Emp의 name, part, age를 받는 Constructor"가 출력됩니다. 이때, `this(str1, str2)`로 인해 `Emp(String str1, String str2)` 생성자가 호출되어 `name`과 `part`가 초기화됩니다.

 

class Manager extends Employee {
    int salary;

    public Manager() {
        System.out.println("Manager의 default Constructor");
    }

    public Manager(String str) {
        super(str); // 상위 클래스의 생성자 호출
        System.out.println("Manager의 name을 받는 Constructor");
    }

    public Manager(String str1, String str2) {
        this(str1); // 동일 클래스의 다른 생성자 호출
        part = str2;
        System.out.println("Manager의 name, part를 받는 Constructor");
    }

    public Manager(String str1, String str2, int i) {
        super(str1, str2); // 상위 클래스의 생성자 호출
        age = i;
        System.out.println("Manager의 name, part, age를 받는 Constructor");
    }

    public Manager(String str1, String str2, int i, int j) {
        this(str1, str2); // 동일 클래스의 다른 생성자 호출
        salary = j;
        System.out.println("Manager의 name, part, age, salary를 받는 Constructor");
    }

    public void callSalary() {
        System.out.println("Manager의 기본급은 : " + salary());
    }

    public static void main(String args[]) {
        Manager m1 = new Manager("홍길동", "ddd");
    }
}


1. `Manager m1 = new Manager("홍길동", "ddd");`을 호출하면 다음 순서로 생성자들이 호출됩니다.
   - `Employee(String str)` 생성자 (부모 클래스의 생성자): "Emp의 name을 받는 Constructor" 출력
   - `Manager(String str1, String str2)` 생성자 (현재 클래스의 생성자): "Manager의 name, part를 

      받는 Constructor" 출력
=> `Manager(String str1, String str2)` 생성자가 호출되면서 `this(str1)`을 통해 동일 클래스의

      `Manager(String str)` 생성자가 호출됩니다. `super(str)`을 통해 부모 클래스의 `Employee(String str)`

       생성자가 호출됩니다. `part = str2;` 문장에 의해 `part` 변수가 초기화됩니다.


이를 통해 `super()`와 `this()` 메서드를 사용하여 생성자를 명시적으로 호출함으로써 상속 관계에서 어떻게 초기화가 이루어지는지를 이해할 수 있습니다.

728x90
반응형