본문 바로가기
프로그래밍 언어/자바의 정석 기초편

자바의 정석 기초편 ch7-7~9 오버라이딩

by life grow 2022. 8. 17.

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 오버라이딩

 

오버로딩: 기존에 없는 새로운 메서드를 정의하는 것

오버라이딩: 상속받은 메서드의 내용을 변경하는 것 

둘은 서로 관계가 없다.