• Method Overriding
• 슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것
• 메소드의 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일하여야 한다.
• 동적 바인딩 발생
-> 서브 클래스에서 오버라이딩된 메소드가 무조건적으로 실행되는 것
• 슈퍼 클래스에서 선언된 메소드를 서브 클래스마다 새로 구현하는 기능
• 객체 지향의 다형성을 실현
class ExNumber {
public void printNumber() {
System.put.println("ExNumber");
}
}
class NumberOne extends ExNumber {
@Override
public void printNumber() { // 오버라이딩
System.out.println("NumberOne");
}
}
class NumberTwo extends ExNumber {
@Override
public void printNumber() { // 오버라이딩
System.out.println("NumberTwo");
}
}
class NumberThree extends ExNumber {
@Override
public void printNumber() { // 오버라이딩
System.out.println("NumberThree");
}
}
public class MethodOverridingExample {
public static void main(String[] args) {
NumberTwo numberTwo = new NumberTwo();
numberTwo.printNumber();
ExNumber exNumber = new NumberTwo(); // 업캐스팅
exNumber.printNumber();
// 오버라이딩된 메소드를 호출한다.(동적 바인딩)
}
}
• 실행 결과
NumberTwo
NumberTwo
• super 키워드는 슈퍼 클래스의 멤버에 접근할 때 사용되는 레퍼런스
• 서브 클래스에서만 사용한다.
• 슈퍼 클래스의 메소드를 호출할 때 사용한다.
• 컴파일러는 super 의 접근을 정적 바인딩으로 처리한다.
class ExNumber {
protected int number;
public void showNumber() {
printNumber();
}
public void printNumber() {
System.put.println(number);
}
}
class NumberOne extends ExNumber {
protected int number;
@Override
public void printNumber() { // 오버라이딩
number = 1;
super.number = 0;
super.printNumber(); // 정적 바인딩
// ExNumber 클래스의 printNumber()를 호출
System.out.println(number);
}
}
public class OverridingAndSuperExample {
public static void main(String[] args) {
ExNumber exNumber = new NumberOne();
exNumber.showNumber();
}
}
• 실행 결과
0
1
• 같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성 하는 것
• 이름이 같은 여러 개의 메소드를 중복 작성
-> 메소드 사용의 편리성을 향상하기 위해 사용
• 메소드 이름은 반드시 동일하여야 한다.
• 매개변수의 타입 또는 개수가 달라야 한다.
• 정적 바인딩
• 선언은 되어 있으나 구현되어 있지 않은 메소드
• abstract로 선언
• 추상 메소드는 서브 클래스에서 오버라이딩하여 구현하여야 한다.
public abstract int getNumber();
public abstract void setNumber(int number);
• 추상 메소드를 하나라도 가진 클래스
-> 클래스 앞에 abstract를 선언하여야 한다.
• 추상 메소드가 없더라고 abstract로 선언된 클래스
• 슈퍼 클래스에서는 개념을 정의하고 서브 클래스마다 목적에 맞게 추상 메소드를 다르게 구현하여 계층적인 상속 관계의 클래스 구조를 만들기 위해 사용
※ 추상 클래스는 객체를 생성할 수 없다.
// 추상 메소드를 포함하는 추상 클래스
abstract class ExNumber {
abstract public printNumber();
}
// 추상 메소드는 없지만 abstract로 선언된 추상 클래스
abstract class NumberOne {
int number;
public void setNumber(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
public class AbstractClassExample {
public static void main(String[] args) {
ExNumber exNumber = ExNumber(); // 컴파일 오류!
NumberOne numberOne = new NumberOne(); // 컴파일 오류!
}
}
• 추상 클래스를 상속받아 추상 메소드를 구현하지 않으면 추상 클래스가 된다.
-> 서브 클래스도 abstract로 선언해야 한다.
• 서브 클래스에서 상속받은 추상 클래스의 추상 메소드를 구현하는 경우
-> 이 경우 서브 클래스는 추상 클래스가 아니다.
// 추상 클래스를 단순 상속하는 경우
// 추상 메소드 구현 x
abstract class ExNumer {
abstract public void printNumber();
}
abstract class NumberOne extends ExNumber {
public void showNumber() {
System.out.println("1");
}
}
// 추상 메소드를 구현하여 상속하는 경우
abstract class ExNumber {
abstract public void printNumber();
}
class NumberOne extends ExNumber {
@Override
public void printNumber() { // 오버라이딩
System.out.println("1");
}
}