[Java의 정석]Chapter7.객체지향 프로그래밍2(07~09)

Hello_Wendy·2022년 4월 26일
0

자바의 정석

목록 보기
50/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

07. 오버라이딩(overriding)

  • 오버라이딩(overriding) : 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
  • 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많은데, 이럴 때 조상의 메서드를 오버라이딩이라 함
2차원 좌표계의 한 점을 표현하기 위한 Point클래스가 있을 때, 이를 조상으로 하는 Point3D클래스, 
3차원 좌표계의 한 점을 표현하기 위한 클래스를 아래와 같이 작성함

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 :" + y + ", z : " + z;
    }
}

* Point클래스의 getLocation()은 한 점의 x,y 좌표를 문자열로 반환하도록 작성됨
* 이 두 클래스는 서로 상속관계에 있으므로 Point3D클래스는 
Point클래스로부터 getLocation()을 상속받지만,
Point3D클래스는 3차원 좌표계의 한 점을 표현하기 위한 것이므로 조상인 Point클래스로부터 상속받은
getLocation()Point3D클래스에 맞지 않음
* 그래서 이 메서드를 Point3D클래스 자신에 맞게 z축의 좌표값도 포함하여 반환하도록 오버라이딩 함

08. 오버라이딩의 조건

  • 오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부(메서드 이름, 매개변수, 반환타입)는 조상의 것과 완전히 일치해야 함
  • 다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경 가능

조건

1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 불가
-만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected나 public이어야 함(같은 범위 혹은 더 넓은 것)
-대부분의 경우 같은 범위의 접근 제어자를 사용함
-접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public > protected > (default) > provate

2. 조상 클래스의 메서드보다 많은 수의 예외를 선언 할 수 없음
-아래코드 참고 : Child클래스의 ParentMethod()에 선언된 예외의 개수가 조상인 Parent클래스의 ParentMethod()에 선언된 예외의 개수보다 작으므로 바르게 오버라이딩 됨

class Parent {
	void ParentMethod() throws IOException, SQLException {
    	...
    }
}

class Child extends Parent {
	void parentMethod() throws IOException {
    	...
    }
    ...
}

▶조상 클래스에 메서드를 자손 클래스에서 오버라이딩할 때
1. 선언부가 조상 클래스의 메서드와 일치
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없음
3. 예외는 조상 클래스의 메서드보다 많이 선언 할 수 없음

09. 오버로딩 VS 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 메서드를 추가하는 것(new)
  • 오버라이딩 : 조상으로부터 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {} //오버라이딩
    void parentMethod(int i) {} //오버로딩
    
    void childMethod() {}
    void childMethod(int i) {} //오버로딩
    void childMethod() {} //에러. 중복정의 되었음(already defined in Child)
profile
안녕 나의 새로운 세상

0개의 댓글