ch7-7. 메서드 오버라이딩(Overriding)
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
(정확히는 override는 '덮어쓰다'란 뜻으로, 메서드를 덮어쓰는 것이다. )
Point클래스는 2차원 좌표로 getLocation 메서드는 x, y좌표만 출력한다. Point를 상속받은 Point3D는 3차원 좌표로 그냥 쓰기에는 맞지 않다. 따라서 조상의 메서드를 override해서 String getLocation( )안을 z를 포함시켜 고친다. 선언부는 바꿀 수 없고 내용(구현부{ })만 변경 가능함.
getLocation을 상속받기는 했지만 z출력이 되지 않는다. 따라서 override로 상속을 받아서 고쳐줘야 한다.
조상의 getLocation( )을 override해서 바꾼다. 출력 잘된다. MyPoint3가 갖고 있는 것이 상속이 안되는 것은 아니다. 상속이 되지만 override 된 것이 호출된다. override되었다 해서 내용이 바뀌거나 상속받지 않는 것이 아니다.
* toString( ) override 예제
p.x와 p.y를 출력하려면 위와 같이 println을 2번 사용해야한다. 하지만 toString을 override하면 아래와 같이 한 줄로 줄일 수 있다.
public String toString( )에 public이 붙은 이유는 override할 때 선언부는 동일하게 맞춰야한다. Ojbect클래스의 toString이 public String toString( )로 정의되어 있다. 두 문장의 출력은 같다. 참조변수 p만 출력해도 toString이 출력된다.
-> 정확한 설명은 toString의 default값이 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드이다. 이 기본 객체를 override해서 x, y를 출력하게 만들면 p를 출력하나 p.toString( )을 출력하나 결과는 동일하다.
초기값도 생성자를 이용하면 훨씬 간단하게 줄여서 코드를 작성할 수 있다.
ch7-8. 오버라이딩(overriding)의 조건
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
선언부(반환타입, 메서드 이름, 매개변수 목록)가 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
접근제어자 public, protected, (default), private
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
조상의 throws 개수보다 더 많이 쓸 수 없다.
ch7-9. 오버로딩 vs 오버라이딩
오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것(new) -> 이름 같은거 생성, 상속 전혀관계 없음.
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것(change, modify)
'자바 > 자바의 정석 Ch.7 객체지향 프로그래밍 II' 카테고리의 다른 글
ch7-12~14 패키지, 클래스 패스 (1) | 2023.04.16 |
---|---|
ch7-10,11 참조변수 super, 생성자 super() (0) | 2023.04.15 |
ch7-5,6 단일상속 (0) | 2023.04.13 |
ch7-3,4 클래스 간의 관계, 상속과 포함 (0) | 2023.04.13 |
ch7-1,2 상속 (0) | 2023.04.13 |