2011. 5. 25. 15:15

자바(Java)의 `오버라이딩(Overriding)`과 super 지시자

상속 관계에 있는 클래스에서 상속을 받은 하위 클래스에 아무런 내용이 없어도 상속을 해준 상위 클래스, 즉 수퍼 클래스의 내용이 묵시적으로 포함되어 있다. 따라서, 상속을 받은 클래스의 인스턴스를 생성한 후 수퍼 클래스의 멤버 변수와 메서드를 호출하여 사용할 수 있게 된다.

  1: class Cpu {
  2:  public void calc() {
  3:   System.out.println("CPU 1개로 계산을 수행하는 메서드") ;
  4:  } 
  5: }
  6: 
  7: class DureCoreCpu extends Cpu {
  8: }
  9: 
 10: public class Computer {
 11:  public static void main(String[] args) {
 12:   DureCoreCpu durecore = new DureCoreCpu() ;
 13:   
 14:   durecore.calc() ;
 15:  }
 16: }

그런데, 수퍼 클래스에 있는 멤버 메서드와 동일한 이름을 가진 메서드가 상속을 받은 하위 클래스에 존재하게 된다면 어떨까. 이 경우에는 하위 클래스에 있는 메서드가 실행된다. 이렇게 되면 수퍼 클래스에서 상속받은 메서드를 서브 클래스에서 추가, 변경 또는 새롭게 정의하여 사용할 수 있다. 이것을 `오버라이딩(Overriding)`이라고 한다.

메서드를 오버라이딩 하려면 우선 이름이 같아야 하고, 메시지의 데이터 타입과 갯수에다 리턴 형식까지 동일해야 한다. 참고로 접근 제어는 범위를 좁힐 수 없으며 static, final, private 메서드는 오버라이딩 할 수 없다.

  1: class DureCoreCpu extends Cpu {
  2:  public void calc() {
  3:   System.out.println("CPU 2개로 계산을 수행하는 메서드") ;
  4:  }
  5: }

'super' 라는 것은 상위 수퍼 클래스를 가리키는 지시자로 하위 클래스에서 오버라이딩 된 메서드 대신 상위 클래스의 원형 메서드를 호출하는데 이용된다. super() 역시 마찬가지로 수퍼 클래스의 생성자를 호출하는 데 사용한다. 이 super(); 라는 구문을 상속받게 되면 코딩을 하지 않아도 묵시적으로 포함된다.

  1: class DureCoreCpu extends Cpu {
  2:  public void calc() {
  3:   super.calc() ;
  4:   System.out.println("CPU 2개로 계산을 수행하는 메서드") ;
  5:  }
  6: }