자바의정석/Chapter 7

ch7-7~9 오버라이딩

suniverse 2022. 12. 6. 22:19

- 오버라이딩(overriding) 

상속받은 조상의 메서드를 자신에 맞게 변경하는 것 

정확하게는 메서드 오버라이딩 

override 덮어쓰다 

선언부는 변경불가,  내용만 변경가능

 

 

ex)

x랑 y만 찍혔다

 

오버라이딩

 

-- 오버라이딩을 하려면 선언부가 동일해야 한다 

 

toString을 사용하면 편리하다. toString만 호출하면 되니까

 

이렇게 더 간단하게 p만 쓸 수도 있다

 

p.x p.y 이렇게 일일히 안 적어주고 간단하게 나타낼수도 있다. 단 생성자를 만들어줘야 한다.

------------------------------------

<오버라이딩의 조건> 

 

1. 선언부가 조상 클래스의 메서드와 일치해야 한다 (반환타입, 메서드이름, 매개변수목록) 

2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다 

3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다 

조상은 2개인데 자손이 3개일 수 없다. 조상과 같거나 적어야 한다. (예외 선언)

 

------------------------

<오버로딩vs오버라이딩> 

사실 둘은 전혀 관계가 없다 

- 오버로딩: 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩: 상속받은 메서드의 내용을 변경하는 것(change, modify)

 

중복정의는 에러.

------------------------------------

ch7-10,11

참조변수 super

생성자 super

 

<참조변수 super>  --> this와 거의 비슷하다(this는 lv와 iv구별에 사용)

- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재. static메서드 내에선 사용불가 

- 조상의 멤버를 자신의 멤버와 구별할 때 사용 

 ------------------------------------

ch7-11 super() - 조상의 생성자 --> 참조변수 super와 전혀 다른 기능이다. 관련이 없다 ! 

- 조상의 생성자를 호출할 때 사용

- 조상의 멤버는 조상의 생성자를 호출해서 초기화 

-->틀렸다. 자손의 멤버는 자기가 선언한 것만 초기화 해야 한다 

이렇게 조상클래스의 생성자를 호출하는 게 맞다

 

- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입

--> 이 조건 완전 중요!!!

예제

 

Point라는 생성자가 없어서 컴파일러 에러가 난다

 

여기서 에러가 발생했다

--> 첫 줄에 생성자가 없기 때문에 컴파일러가 자동으로 super();를 넣어서 Point()를 호출한다. 

근데 에러가 뜬다. 

왜? 

기본 생성자인 Point(){ }가 없기 때문이다. 

그래서 항상 클래스를 만들 때는 첫줄에 기본생성자 작성은 필수다 

 

규칙을 무조건 외우자 !!

 

에러를 잡기 위해서 Point() {} 기본 생성자를 만들어주거나 

혹은 조상 생성자를 호출하면 된다. 

암튼 그래도 기본 생성자는 추가해주는 게 좋다