본문 바로가기

Programming/JAVA

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

java logo image

 

자식 클래스는 앞서 설명했다시피 부모 클래스의 필드와 메서드를 그대로 상속받아 사용할 수 있습니다. 하지만, 항상 부모 클래스에 정의된 메서드가 자식 클래스의 역할과 상황에 맞게 선언되어 있으리라는 보장은 없습니다. 이런 경우에는 상속받은 메서드를 자식 클래스에서 다시 수정 선언하여 재정의 할 필요성이 생깁니다. 이를 위한 기능을 메서드 오버라이딩(Overriding)이라고 합니다. 

 

즉, 오버라이드(override)란 자식 클래스에서 상속받은 동일한 메서드를 재정의 하는 것을 의미하게 됩니다. 만일, 상속받은 메서드에 오버라이드가 이루어졌다면, 자식 객체에서 메서드를 호출할 때 새롭게 재정의된 메서드가 호출되고 부모 클래스에서 선언된 메서드는 호출되지 않습니다. 

 

예를 들어 부모 클래스에도 method1( )이 선언되어 있는데, 해당 클래스를 상속하는 자식 클래스에도 method1( )이 오버라이드 되어 재정의 되어 있다고 가정해 봅시다. 이때 실행 클래스에서 자식 클래스 인스턴스 객체를 생성해 method1이라는 메서드를 호출하면, 자식 클래스에서 정의된 메서드가 실행되는 것이죠.

 

 


 

단, 부모 클래스가 가진 메서드를 오버라이드 할 때는 다음 규칙을 지켜야 합니다. 일단, 전반적으로 '부모 클래스에 선언된 기본 형태를 크게 벗어날 수 없다'는 정도로 기억해 둡시다.

 

  • 부모 클래스와 동일한 시그니처 - 리턴 타입, 메서드 명, 파라미터 종류 - 를 사용해야 한다.
  • 접근 제한자를 더 강하게 변경할 수 없다.
  • 새로운 예외를 설정할 수 없다(throw).

 

조금 헷갈릴 수 있는 부분이 접근 제한자의 제약 사항 입니다. 일단, 기본 원칙은 자식 클래스가 부모 클래스에 선언된 접근 제한자보다 더 강한 접근 제한자를 가질 수 없다는 점입니다. 예를 들어, 부모 클래스의 메서드 접근 제한자가 public이라면, 자식 클래스에서 이 메서드를 오버라이드 할 때는 사실상 public 이외의 접근 제한자를 설정할 수 없습니다. 

 

하지만, 반대의 경우는 가능합니다. 만일 부모 클래스에서 메서드 접근 제한자가 default라면? 자식 클래스는 일단 default를 선언하는 것이 기본이겠죠. 하지만, 여기서는 더 상위의 접근 제한자인 public까지가 선언이 가능합니다. 

 

왠지 자식 클래스는 부모 클래스에 비해 더 좁은 활용도를 가진 접근 제한자를 써야할 것 같은 생각이 들지만, 그 반대입니다. 이 부분은 항상 주의해서 기억하시기를 바랍니다. 

 

이제 예제를 통해서 오버라이드 구현 방식을 연습해 보겠습니다.

 

 

 


 

public class Parent {

	double calculate(double value) {
		System.out.println("Parent calculate");
		return 1000 * value;
	}
}

 

public class Child extends Parent{

	@Override
	double calculate(double value) {
		System.out.println("Child calculate");
		return 95 * value;
	}
}

 

 

public class ExampleMain {	
	public static void main(String[] args) {

		double numVal = 10.1;
		
		Parent parent = new Parent();
		System.out.println(parent.calculate(numVal));
		
		Child child = new Child();
		System.out.println(child.calculate(numVal));		
	}
}

/* 출력
Parent calculate
10100.0
Child calculate
959.5
*/