본문 바로가기

자바 기초

자바 상속에서 클래스 생성, super - Do it! 자바프로그래밍기초

상속을 받은 하위클래스는 상위클래스의 변수와 메서드를 사용할 수 있는데,

변수를 사용할 수 있다는 것은 그 변수를 저장하고 있는 메모리가 존재한다는 뜻이다.

public class Customer {
	...
	public Customer() {
    	...
        System.out.println("Customer() 생성자 호출");
    }
    ...
}
public class VIPCustomer extends Customer {
	...
    
    public VIPCustomer() {
    	...
        System.out.println("VIPCustomer() 생성자 호출");
    }
	...
}
public class CustomerTest {
	public static void main(String[ ] args) {
    	
        VIPCustomer a = new VIPCustomer(); // 하위클래스 생성
    	
        ...
    }
}

CustomerTest 클래스를 실행시키면,

Customer() 생성자 호출

VIPCustomer() 생성자 호출

이 출력된다.

정리하자면 상위클래스를 상속받은 하위클래스가 생성될 때에는 반드시 상위 클래스의 생성자가 먼저 호출된다.

그리고 상위클래스 생성자가 호출될 때 상위클래스의 멤버변수가 메모리에 생성되는 것이다.

이렇게 하위클래스 생성자만 호출했는데 상위클래스 생성자가 호출되는 이유는 하위클래스 생성자에서 super()를 자동으로 호출하기 때문이다.

 

super 예약어는 하위클래스에서 상위클래스로 접근할 때 사용한다. 

하위클래스는 상위클래스의 주소(참조값)을 알고 있고, 이 참조값을 가지고 있는 예약어가 super이다.

 

public class Customer {
	
    ...
    
    public Customer(int customerID, String customerName) {
    	
        ...
    
    }
    // 디폴트 생성자 없음.
}
public class VIPCustomer extends Customer {
	
    ...
    
    public VIPCustomer(int customerID, String customerName, int agentID) {
    	super(customerID, customerName);   // 상위 클래스 생성자 호출
        
        ...
        
    }
    
    ...
    
}

상위클래스에 디폴트 생성자가 있다면 하위클래스의 생성자를 호출할 때 컴파일러가 super()를 자동으로 호출하지만,

위 예시처럼 상위클래스(Customer)에 디폴트 생성자가 없다면 

하위클래스 생성자에 super()에 매개변수를 추가하여, 매개변수가 있는 상위클래스의 생성자를 직접 호출해야한다.