오버라이딩
•
상속관계에서 부모의 함수를 덮어쓰는 것
•
Sub 클래스에서 super 클래스에서와 같은 이름의 멤버를 다시 정의
◦
기존의 멤버를 요구사항에 맞게 수정하는 효과
◦
Super 클래스에서와 동일한 형태로 정의
•
Super 클래스에서 상속된 멤버는 은폐됨
◦
Sub 클래스 객체의 메서드에서의 은폐된 멤버에 접근하기 위해 super 참조변수 이용
방법
1.
오버라이딩할 메서드에 @Override 어노테이션을 붙여준다.
2.
메서드 이름과 파라미터가 상속클래스의 메서드와 똑같이 작성해야만 한다.
@Override 어노테이션 꼭 필요할까?
어노테이션을 안 붙인다고 에러가 발생하는 것은 아니지만, Override 어노테이션이 붙은 메서드가 상속 클래스에 존재하지 않는다면 컴파일에러가 발생한다.
@Override 어노테이션을 붙여 오버라이딩한 메서드임을 표시해줄 수 있고, 오버라이딩할 메서드가 상속 클래스에 존재하는지 확인할 수 있다.
예시
class Person {
public void greeting() {
System.out.println("안녕하세요");
}
}
class Programmer extends Person {
@Override
public void greeting() {
System.out.println("안녕하세요. 개발자입니다.");
}
@Override // 상속 클래스에 해당하는 메서드가 없어 에러가 발생한다.
public void hi() {
System.out.println("안녕하세요.");
}
}
public class Test {
public static void main(String[] args) {
Programmer programmer = new Programmer();
programmer.greeting(); // 안녕하세요. 개발자입니다.
}
}
Java
복사
오버라이딩 vs 오버로딩
오버로딩
같은 함수 이름으로 파라미터의 데이터타입 또는 개수를 달리할 수 있다.
예시
// System.out.pringln() 오버로딩 예시
public void println() {
newLine();
}
public void println(boolean x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(char x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
// ...
Java
복사
새로 알게 된 점.
수진- 오버라이딩을 사용할수 있는 조건에 대해서 알게되었다.