IT/개발(자바, 서블릿, 스프링 등)

[Java] 상속 개념과 사용법 그리고 super() 문으로 부모 인스턴스 초기화하는 방법

히유우 2019. 12. 9. 22:19

클래스에서 필드와 메서드의 중복을 제거하는 방법? 상속을 이용한다.

 

중복 제거 조건 1. 클래스 간의 공통 멤버를 가지는가?

중복 제거 조건 2. is a 관계가 성립하는가?

 

위 두가지 조건에 만족하면, 각 클래스의 중복을 제거할 수 있다.

 

(예시)

제거 조건 1. 사람이라는 공통점 존재.

제거 조건 2. is a 관계 성립. Employee is a Person, Professor is a Person, Student is a Person.

위 두가지 조건 만족하기 때문에 아래의 상속관계가 가능하다.

Employee extends Person

Professor extends Person

Student extends Person

 

Employee, Professor, Student 인스턴스가 생성될 때 부모 클래스의 생성자도 함께 호출된다. 어떤 클래스를 상속받은 클래스는 컴파일러가 소스 파일을 컴파일할 때 super() 문을 자동으로 생성한다. super()문은 상속받은 클래스의 모든 생성자 첫 번째 줄에 자동으로 추가된다. 생성자 내에 super()문을 사용하지 않았을 때만 자동으로 추가된다. this()는 자신의 다른 생성자를 호출할 때 사용한다. super()문은 부모 생성자를 호출할 때 사용한다.

 

생성자에 대해서 정리하자면 이렇다.

  1. 모든 클래스는 생성자가 반드시 존재한다. 개발자가 명시하지 않으면 컴파일러가 디폴트 생성자를 생성한다.
  2. 자식 클래스의 모든 생성자에는 첫 번째 줄에 super() 문이 자동으로 추가된다. 단, 생성자에 super()문을 사용하지 않았을 때만 자동으로 추가된다.
  3. 따라서 자식 클래스의 인스턴스를 생성할 때 부모 클래스의 생성자도 함께 호출된다.

super() 문을 이용한 부모 생성자의 활용 예제

Person.java

public class Person {
	private String name;
    private int age;
    
    public Person(){
    	System.out.println("Person 생성자");
	}
    
    public Person(String name, int age) {
    	this.name = name;
        this. age = age;
	}
}

 

Employee.java

public class Employee extends Person {
	private String dept;
    
    public Employee(){
    	super();
        System.out.println("Employee 생성자");
	}
    
    public Employee(String name, int age, String dept) {
    	super(name, age);
        this.dept = dept;
	}
}