슈퍼클래스(super class)에 있는 메소드를 서브클래스(sub class)에서 같은 시그니처(signature)로 재정의(overriding) 하는 것입니다. 메소드의 확장이 필요하거나 수정이 필요할 경우 사용됩니다.
오버라이딩(overriding)을 구현 할 때는 슈퍼클래스(super class)를 확장을 하는 경우와 수정을 하는 2가지의 관점이 있을 수가 있습니다.
확장을 하는 경우는 슈퍼클래스(super class)에 있는 메소드의 기능을 추가해야 하는 경우입니다.
예를 들면 현실세계에서 터치폰과 휴대폰이 있습니다. 원래 휴대폰에서 입력은 버튼입력밖에 없습니다. 하지만 그걸 확장해서 터치폰에서의 입력은 버튼입력뿐만 아니라 터치를 통한 입력을 받을 수가 있게 확장을 한 것입니다.
수정을 하는 경우는 슈퍼클래스(super class)에 있는 메소드의 기능을 수정해야 하는 경우입니다.
현실세계에서 터치폰이 있고, 스마트폰이 있습니다. 터치폰의 입력은 버튼입력, 터치가 가능합니다. 스마트폰에서는 입력은 터치만이 가능하며, 버튼입력도 터치를 통해 입력받도록 하고 있습니다. 그러면 결국 터치폰에서의 입력은 스마트폰에서 모두 수정되어야 합니다.
추가적으로 재정의(overriding)을 꼭 해야 하는 경우가 있습니다. 다형성을 위해 사용되는 경우로써 인터페이스를 구현하는 경우이거나 슈퍼클래스(super class)에 추상메소드가 있는 경우는 해당 메소드를 꼭 재정의(overriding)를 해야 합니다. 추상메소드는 해당 슈퍼클래스(super class)를 상속 받거나 해당 인터페이스를 사용하는데 있어서 꼭 구현하라는 의미가 있는 것이기 때문입니다.
재정의(overriding)는 super class의 메소드 중 재정의(overriding)하려는 메소드와 같은 return type을 가져야 하고 signature가 같아야 합니다. try catch구문도 signature에 포함됩니다.
재정의를 설명하기에 앞서 class에서 사용되는 접근지정자(access modifier)를 알아야 합니다. 우선 접근지정자(access modifier)는 public, protected, package(default, friendly), private로 4개가 있습니다.
이러한 접근지정자(access modifier)를 알야아 하는 이유는 재정의(overriding)시에는 슈퍼클래스(super class)의 메소드의 접근지정자(access modifier)의 범위와 같게 설정하거나 더 좁은 범위의 접근지정자(access modifier)를 사용해야 하기 때문입니다.
이러한 재정의(overriding)을 사용하기 위해서는 선행되어야 할 조건은 상속받은 class, 혹은 인터페이스 직간접적으로 구현하는 class입니다.
주의 할 점은 interface를 구현한 경우는 기본적으로 interface에서 모든 메소드를 public abstract으로 제공하기 때문에 접근지정자(access modifier)를 public으로 해야한다.
추상클래스에서는 추상메소드에 대해서 구현할 수도 있지만 위임 할 수도 있으며 인터페이스끼리의 확장관계에서는 추상메소드를 구현 할 수 없기에 구현하는 클래스에게 위임합니다.
재정의(overriding)한 메소드 안에서도 슈퍼클래스(super class)의 메소드를 호출 할 수 있습니다. 단 재정의(overriding)한 메소드가 있는 클래스가 추상메소드 이거나, 인터페이스일 경우는 호출이 불가능합니다.
재정의(overriding)에서는 Final이라는 modifier를 사용 할 수 있습니다. 메소드에 Final이라는 modifier를 사용하게 되면 그 메소드는 더 이상 재정의(overriding)을 하지 않겠다는 의미이며 추상클래스에서 추상메소드가 아닌 메소드에도 사용가능합니다.
'IT > 개발' 카테고리의 다른 글
Wrapper 클래스(Wrapper class) (0) | 2013.08.21 |
---|---|
enum type & static final (0) | 2013.08.18 |
객체(object) 캐스팅(casting) (0) | 2013.08.17 |
인터페이스(interface) (0) | 2013.08.16 |
추상클래스(abstract class) (0) | 2013.08.16 |