오버라이딩 (Overriding)
Overloading 과는 다른 개념으로, 오버라이딩은 상속 관계에서 부모 클래스에 있는 메서드를 재정의하는 것이다.
부모 클래스에 있는 메서드와 매개변수 리스트가 동일해야 한다.
또한 부모 클래스에 있는 메서드와 접근 권한 수식어가 동일할 필요는 없지만 기존 부모 클래스의 메서드 접근 권한의 범위보다 작게 설정할 수는 없다. 즉, 접근 권한은 같거나 더 넓은 수식어를 사용해야 한다.
메서드 앞에 final 키워드가 붙으면 해당 메서드는 더 이상 오버라이딩이 불가능하다.
클래스 앞에 final 키워드가 붙으면 해당 클래스를 상속할 수 없다.
예제
Main.java
public class Main {
public static void main(String[] args) {
// Person 클래스의 인스턴스 생성
Person p1 = new Person();
p1.setName("김철수");
p1.showInfo();
System.out.println();
// BusinessPerson 클래스의 인스턴스를 생성
BusinessPerson p2 = new BusinessPerson();
p2.setName("홍길동");
p2.setCompany("(주)조선");
p2.showInfo();
}
}
Person.java
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void showInfo() {
System.out.println("이름 : " + name);
}
public final void whoAreYou() {
System.out.println("이름 : ");
}
}
BusinessPerson.java
public class BusinessPerson extends Person {
private String company;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public void showInfo() {
System.out.println("이름 : 김철수\t회사 : " + company);
}
// Overloading (오버로딩)
public void showInfo(int id) {
System.out.println("id : " + id);
showInfo();
}
@Override // 오류
public void whoAreYou() {
super.whoAreYou();
}
}
BusinessPerson 클래스는 Person 클래스를 상속받았으므로 Person 클래스에 있는 showInfo() 메서드를 오버라이딩할 수 있다.
오버라이딩하는 메서드 선언 윗 줄에 @Override annotation(어노테이션)을 붙이면 해당 메서드는 오버라이딩한 메서드라는 뜻이다.
자바에서 어노테이션은 코드 사이에 주석처럼 쓰여 특별한 기능을 수행하도록 한다. 프로그램에게 추가 정보를 제공하는 메타데이터라 볼 수 있다.
Person 클래스에서는 이름만을 출력하는데, BusinessPerson 클래스에서는 회사까지 출력하도록 메서드 내용을 수정하여 오버라이딩하였다.
오버라이딩한 메서드 밑의 메서드 showInfo(int id)는 오버로딩한 메서드이다.
이는 현재 클래스에 있는 메서드와 이름은 똑같지만 매개변수의 개수가 다르다.
가장 마지막의 whoAreYou 메서드도 오버라이딩하려했으나 이는 불가능하다.
Cannot override the final method from Person이라는 오류 문구가 뜬다.
Person 클래스에서 whoAreYou() 메서드는 final 키워드가 붙어있기 때문에 오버라이딩이 불가능하다.
실행 결과