생성자와 상속은 객체 지향 프로그래밍의 기본 개념 중 하나입니다. 생성자는 객체의 초기화를 담당하며, 상속은 클래스 간의 관계를 형성하여 코드의 재사용성과 확장성을 증가시킵니다. 이를 자세히 이해하기 위해, `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()` 메서드를 사용하여 생성자를 명시적으로 호출함으로써 상속 관계에서 어떻게 초기화가 이루어지는지를 이해할 수 있습니다.
'Java > Java Advance' 카테고리의 다른 글
Spring Framework에서 ModelAndView 사용하기 (1) | 2023.11.22 |
---|---|
상속과 메서드 오버라이딩의 활용 (0) | 2023.10.15 |
자바에서의 클래스 상속과 일반화 관계 (0) | 2023.09.24 |
Java Constructor Overloading - 다양한 객체 초기화 방법 (0) | 2023.09.24 |
Java 생성자(Constructor)와 객체 초기화 (0) | 2023.09.24 |