ch7-7~9 오버라이딩
- 오버라이딩(overriding)
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
정확하게는 메서드 오버라이딩
override 덮어쓰다
ex)
-- 오버라이딩을 하려면 선언부가 동일해야 한다
------------------------------------
<오버라이딩의 조건>
1. 선언부가 조상 클래스의 메서드와 일치해야 한다 (반환타입, 메서드이름, 매개변수목록)
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다
------------------------
<오버로딩vs오버라이딩>
사실 둘은 전혀 관계가 없다
- 오버로딩: 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩: 상속받은 메서드의 내용을 변경하는 것(change, modify)
------------------------------------
ch7-10,11
참조변수 super
생성자 super
<참조변수 super> --> this와 거의 비슷하다(this는 lv와 iv구별에 사용)
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재. static메서드 내에선 사용불가
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
------------------------------------
ch7-11 super() - 조상의 생성자 --> 참조변수 super와 전혀 다른 기능이다. 관련이 없다 !
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
-->틀렸다. 자손의 멤버는 자기가 선언한 것만 초기화 해야 한다
- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
--> 이 조건 완전 중요!!!
--> 첫 줄에 생성자가 없기 때문에 컴파일러가 자동으로 super();를 넣어서 Point()를 호출한다.
근데 에러가 뜬다.
왜?
기본 생성자인 Point(){ }가 없기 때문이다.
그래서 항상 클래스를 만들 때는 첫줄에 기본생성자 작성은 필수다
규칙을 무조건 외우자 !!
에러를 잡기 위해서 Point() {} 기본 생성자를 만들어주거나
혹은 조상 생성자를 호출하면 된다.
암튼 그래도 기본 생성자는 추가해주는 게 좋다