7-7 오버라이딩
오버라이딩: 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
선언부 변경 불가.
내용만 변경 가능. 구현부{}
Point클래스를 쓰는 사람들은 getLocation(){}을 호출하면
좌표를 문자열로 얻을 수 있었다.
그래서 Point3D클래스도 getLocation(){}을 호출하면
위치를 문자열로 얻을 거라 생각한다.
의미상 같은 일을 해야 하기 때문에 오버라이딩이 적절하다.
getLocation()이 상속이 안 되는 게 아니다.
상속이 되긴 되는데 getLocation()가 두 개인데
그중에 오버라이딩 된 getLocation() {}가 호출된다.(자손의 getLocation() {})
class Point3{
int x;
int y;
String getLocation() {
return "x:"+x+", y:"+y;
}
}
class Point3D extends Point3{
int z;
// 조상의 getLocation()을 오버라이딩
String getLocation() {
return "x:"+x+", y:"+y+", z:"+z;
}
}
public class OverrideTest {
public static void main(String[] args) {
Point3D p = new Point3D();
p.x = 3;
p.y = 5;
p.z = 7;
System.out.println(p.getLocation());
}
}
p.x로 초기화하지 말고
생성자로 초기화하면 됨.
또 p를 출력하면 toString을 호출한다.
(println(참조변수)에 참조변수가 들어오면 내부적으로 toString을 호출한다.)
class Point3 extends Object{
int x;
int y;
//toString()을 오버로딩 Object클래스의 메서드
public String toString() {
return "x:"+x+", y:"+y;
}
Point3(int x, int y){
this.x = x;
this.y = y;
}
}
public class OverrideTest {
public static void main(String[] args) {
Point3 p = new Point3(3,5);
System.out.println(p); //참조변수 p만 출력하면 p.toString()호출돼서 값을 확인하기 쉬워진다.
// p.x = 3;
// p.y = 5;
// System.out.println(p.toString());
// System.out.println("x:"+p.x);
// System.out.println("y:"+p.y);
}
}
7-8 오버라이딩의 조건
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
선언부(반환타입, 메서드 이름, 매개변수 목록) < 다 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
7-9 오버로딩 vs 오버라이딩
오버로딩: 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩: 상속받은 메서드의 내용을 변경하는 것
둘은 서로 관계가 없다.
'프로그래밍 언어 > 자바의 정석 기초편' 카테고리의 다른 글
자바의 정석 기초편 ch7-12~14 패키지, 클래스 패스 (0) | 2022.08.23 |
---|---|
자바의 정석 기초편 ch7-10,11 참조변수 super, 생성자 super() (0) | 2022.08.19 |
자바의 정석 기초편 ch7-5,6 단일 상속, Object클래스 (0) | 2022.08.17 |
자바의 정석 기초편 ch7-3,4 클래스 간의 관계, 상속과 포함 (0) | 2022.08.17 |
자바의 정석 기초편 ch7-1,2 상속 (0) | 2022.08.16 |