●오버라이딩
오버라이드(override)의 사전적 의미는 '~위에 덮어쓰다'다. 오버라이드의 사전의미를 참조하여 조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 '오버라이딩'이라 한다.
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y :"+ y;
}
}
class Point3D extends Point {
int z;
String getLocation() { // 오버라이딩
return "x :" + x + ", y :"+ z :" + z;
}
}
위의 코드는 2차원 좌표계의 한 점을 표현하기 위한 Point클래스가 있을 때, 이를 조상으로 하는 Point3D클래스, 3차원 좌표계의 한 점을 표현한 클래스다. Point클래스의 getLocation()은 한 점의 x, y 좌표를 문자열로 반환하도록 작성되었다. 위의 두 클래스는 서로 상속관계에 있으므로 Point3D클래스는 Point클래스로부터 getLocation()을 상속받지만, 3차원 좌표계(x, y, z)를 작성하는 Point3D좌표를 표현하기에는 변수가 하나 모자르다. 3차원 좌표계를 표현하기 위해선 Point클래스에서 상속받은 getLocation()에서 z변수를 추가해야한다. 여기서 우리는 조상클래스로 부터 상속받은 메서드를 변경하는 오버라이딩을 확인할 수 있다.
●오버라이딩의 조건
오버라이딩을 할 때 지켜야 할 세 가지 조건이 있다.
- 선언부가 조상 클래스의 메서드와 일치해야한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부(메서드 이름, 매개변수, 반환타입)는 조상의 것과 완전히 일치해야 한다. 자손의 접근제어자는 조상 클래스보다 좁은 범위로 작성 할 수 없다. 대부분의 경우 조상과 자손클래스의 접근제어자는 같은 범위를 사용한다. 접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public, protected, (defalut), private이다.
●오버로딩 vs 오바라이딩
오버로딩과 오버라이딩의 이름이 서로 비슷하여 헷갈리지만 그 둘의 의미는 명백히 다르다.
오버로딩(overloading): 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding): 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} //오버라이딩
void parentMethod(int i) {} //오버로딩
void childMethod() {}
void childMethod(int i) {} //오버로딩
출처: 자바의 정석 기초편(저자: 남궁성, 출판사: 도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] 제어자 (0) | 2021.07.14 |
---|---|
[객체지향] super와 super() (0) | 2021.07.14 |
[객체지향] 상속 (0) | 2021.07.13 |
[객체지향] 변수, 멤버변수의 초기화 (0) | 2021.07.12 |
[객체지향] this()와 this (0) | 2021.07.12 |