상속과 생성자
서브와 수퍼클래스의 생성자 호출 및 실행
• 서브 클래스가 생성될때, 서브 클래스의 생성자와 수퍼클래스의 생성자 모두 실행
• 생생자의 목적은 객체의 초기화임으로, 완성된 객체를 만들기 위해서는 둘다 실행 필요
• 생성자 실행순서 : 수퍼 → 서브
서브클래스에서 수퍼클래스 생성자 선택
✔ 수퍼 클래스의 기본생성자가 자동으로 선택되는 경우
- 서브클래스 객체 생성시 지정을 하지 않으면 자동으로 수퍼의 기본생성자를 호출
- 특별한 수퍼 생성자 지정없이, 기본생성자가 없으면 Error!
✔ 서브클래스에서 수퍼클래스 생성자 선택 → super() 이용
- 수퍼클래스의 생성자를 명시해주는것이 원칙
- 상속시 생성자는 물려받지 못하므로, super()메서드를 이용하여 부모의 생성자를 호출
- super() : 수퍼클래스 생성자를 호출하는 명령어, 괄호안에 인자 넣어서 호출
- 주의❗ this()와 같이 super() 또한 생성자냐애 첫줄에 와야함
메소드 오버라이딩 override
• 상속관계에서 성립
• 재작성, 덮어쓰기, 재정의 하는 것
• 부모로부터 물려받은 메소드의 내용이 마음에 안들어 내용을 변경해서 다시 정의해 놓는 것
• 메소드 선언부는 똑같이, 블럭안{} 내용(구현부)만 바꾸는것
• 오버로드와 완전히 다름
• ex) Object클래스로부터 물려받은 equals(), toString()
💡 동적바인딩 : 서브에 오버라이딩된 메소드가 있으면 수퍼클래스의 메소드를 무시하고 서브클래스에서 오버라이딩된 메소드가 무조건 실행되도록 함
→ 메소드 오버라이딩은 동적바인딩을 유발시킨다~
• super : 자바 컴파일러에 의해 지원되는 수퍼클래스에 대한 레퍼런스, 수퍼클래스 지칭
→ 서브 클래스에 메소드 오버라이딩시, 동적바인딩으로 오버라이딩된 메소드가 자동호출 되는데 수퍼클래스의 멤버를 호출하고자 할때 사용하는 키워드.
→ 이 키워드를 이용하면 정적바인딩을 통해 수퍼클래스의 멤버(변수, 메소드)에 접근가능
• @Override : 어노테이션(annotation) 이라부르며, 메소드 바로 위에 붙혀서 오버라이딩 되었다고 미리 알려주고, 컴파일러에게 오버라이딩이 정확한지 확인하도록 지시하는것
→ 코드 가독성을 높이고, 개발자가 실수로 잘못 작성하는 오타 방지 가능
• 수퍼클래스 메소드의 접근지정자보다 접근의 범위를 좁혀 오버라이딩 불가
✍🏻ex.
public > protected > default > private
부모 protected > 자식 오버라이딩 public protected
부모 default > 자식 default, protected, public
부모 public > 자식 public
📌용어 정리
💡 this : 현재 객체의 모든 멤버 접근 가능
💡 super : 현재 갹체의 수퍼(부모)클래스 멤버 접근 가능
💡 this() : 생성자에서 다른 생성자 호출할때 사용
💡 super() : 내(자식) 생성자에서 부모의 생성자 호출할때 사용
다형성 polymorphism
• 여러가지 형태를 가질 수 있는 능력
• 상속관계에서 성립가능한 문법
• 참조형의 업/다운 캐스팅
• "부모의 변수에 자식객체를 담을 수 있는 형태" > 코드를 봤을때 해석
instanceof 연산자
• 참조하는 변수가 가르키는 인스턴스의 실제 타입을 체크하는데 사용
• 비교하는 객체가 서로 상속관계에 있는지 확인하는 연산자
'basic > java 이론' 카테고리의 다른 글
day 15 - 싱글톤 Singleton, 내부 클래스, 예외처리 Exception handling (0) | 2021.05.12 |
---|---|
day 14 - 추상클래스, 인터페이스 (0) | 2021.05.11 |
day 12 - 상속 inheritance (0) | 2021.05.07 |
day11 - 생성자 constructor, 접근지정자 (0) | 2021.05.06 |
day 10 - jvm 메모리 구조, 메서드 인자 전달 방식, 메서드 오버로딩 (0) | 2021.05.04 |