오버라이딩이란?
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만 자손 클래스 자신에 맞게 변경해야하는 경우가 많다. 이럴때 조상의 메서드를 오버라이딩한다.
*override의 사전적 의미는 '~위에 덮어쓰다(overwrite)'이다.
class Point{
int x;
int y;
Stirng getLocation() {
return "x: "+x+", y: "+y;
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
return "x: "+x+", y: "+y+", z:"+z;
}
}
- 조상클래스로부터 상속 받은 메서드를 변경한다.
- 자식 클래스에 오버라이딩한 메서드가 있으면 먼저 호출되고 -> 없으면 부모 클래스 -> 없으면 Object에서 찾는다.
- static메서드는 컴파일 돌릴 때 실행. 인스턴스는 실행 중에 올라간다.
오버라이딩의 조건
- 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
=> 즉, 선언부가 서로 일치해야 함. 다만, 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경 가능함.
- 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할 때
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
( 조상의 메서드가 protected면, 자식은 protected나 public만)
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
Q. 조상 클래스에 정의된 static 메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있나요?
A. 가능합니다. 하지만, 이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩이 아니다. 각 메서드는 클래스 이름으로 구별될 수 있으며, 호출할 때는 '참조변수.메서드이름()' 대신 '클래스이름.메서드이름()'으로 하는 것이 바람직하다. static 멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 된다.
오버로딩 vs 오버라이딩
오버로딩(overloading) | 기존에 없는 새로운 메서드를 정의하는 것(new) |
오버라이딩(overriding) | 상속받은 메서드의 내용을 변경하는 것(change, modify) |
*헷갈리지 않게 잘 기억하자!!
[참고]
Java의 정석(남궁성 저)
'공부 > 자바' 카테고리의 다른 글
제어자(modifier) (0) | 2024.05.31 |
---|---|
Package & import (0) | 2024.05.31 |
상속 & 클래스 간의 관계 (0) | 2024.05.30 |
변수의 초기화 (0) | 2024.05.29 |
생성자(Constructor) (0) | 2024.05.29 |