본문 바로가기

Programming/JAVA

상속(3) - 메서드 재정의(override) 2

java logo image

 

 

우리는 앞서 자식 클래스에서 오버라이드를 통해 부모 클래스에서 선언된 메서드를 재정의해 사용하는 내용을 살펴보았습니다. 결국 "자식 클래스 안에서 오버라이드 된 메서드를 선언하고 사용하면, 부모 클래스에서 선언된 메서드는 숨겨진다."라는 대원칙을 따른다는 내용도 확인했습니다. 

 

하지만, 때에 따라서는 자식 클래스에서도 부모 클래스에서 선언된 메서드를 호출하여 사용해야 할 상황도 언제든지 발생할 것입니다. 이 때는 가변적으로 자식 클래스에서 오버라이드 된 메서드가 아닌, 부모 클래스의 메서드를 호출하기 위한 키워드인 super를 사용하게 됩니다.

 

아마 부모 클래스의 생성자를 명시적으로 호출하는 super( )를 기억하실 겁니다. 동일한 키워드이므로, 부모 클래스의 요소를 호출하는 키워드라고 기억하시면 되겠습니다. 다만, 부모 클래스의 메서드를 호출하는 경우에는 당연하지만 super라는 키워드를 사용하는 방식은 조금 다릅니다. 

 

부모 생성자를 호출하는 super( )는, 이 자체가 '부모 클래스의 생성자'와 동일하게 사용되었죠. 그래서 생성자에 선언된 파라미터가 있으면 super(param1, param2...) 형태로 사용했습니다. 

 

 

 

상속(2) - 부모 생성자의 호출(super)

자식 객체는 반드시 부모 객체가 있어야 생겨날 수 있는 존재입니다. 이 점은 이해가 가시죠? 너무나도 당연한 이야기이지만, 다시 이러한 내용을 상기하는 이유는 "부모 객체를 상속하는 자식

nozeroslope.tistory.com

 

 

하지만 부모 클래스의 메서드를 호출할 때 사용하는 super는 '해당 클래스의 부모 클래스에 바인딩' 되는 개념의 키워드입니다. 그러므로 super.methodName( ) 형태로 메서드를 호출하게 됩니다. 간단한 정의이지만, 생성자 호출과 헷갈릴 수 있는 내용입니다. 아래의 예제를 통해서 연습해 봅시다.

 

참고로 자식 클래스 메서드에서의 super 키워드는, 오버라이드를 선언한 자식 클래스의 메서드 내부에서 사용하는 것이 기본이며, 클래스 필드나 실행 메서드 내에서 임의로 사용하는 것은 불가능합니다.

 

 


 

 

public class Car {
	public void stop() {
		System.out.println("멈춥니다.");
	}
	
	public void drive() {
		System.out.println("일반 주행합니다.");
	}
	
	public void start() {
		System.out.println("시동을 겁니다.");
	}
}

 

 

public class Tesla extends Car {
	public static final int NORMAL = 1;
	public static final int AUTO_DRIVE = 2;
	
	public int driveMode = NORMAL;
	
	@Override
	public void drive() {
		if(driveMode == AUTO_DRIVE) {
			System.out.println("자동주행입니다.");
		} else {
			super.drive();
		}
	}
}

 

 

public class ExampleMain {	
	public static void main(String[] args) {
		Tesla tesla = new Tesla();
		
		tesla.start();
		tesla.drive();
		
		tesla.driveMode = Tesla.AUTO_DRIVE;
		tesla.drive();
		
		tesla.driveMode = Tesla.NORMAL;
		tesla.drive();
		
		tesla.stop();	
	}
}

/* 출력
시동을 겁니다.
일반 주행합니다.
자동주행입니다.
일반 주행합니다.
멈춥니다.
*/