basic/java 이론

day 13 - 상속과 생성자, 메소드 오버라이딩, 다형성

못지(Motji) 2021. 5. 10. 17:37

상속과 생성자

서브와 수퍼클래스의 생성자 호출 및 실행

• 서브 클래스가 생성될때, 서브 클래스의 생성자와 수퍼클래스의 생성자 모두 실행

• 생생자의 목적은 객체의 초기화임으로, 완성된 객체를 만들기 위해서는 둘다 실행 필요

• 생성자 실행순서 : 수퍼 → 서브

서브클래스에서 수퍼클래스 생성자 선택

✔ 수퍼 클래스의 기본생성자가 자동으로 선택되는 경우

  • 서브클래스 객체 생성시 지정을 하지 않으면 자동으로 수퍼의 기본생성자를 호출
  • 특별한 수퍼 생성자 지정없이, 기본생성자가 없으면 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 연산자

• 참조하는 변수가 가르키는 인스턴스의 실제 타입을 체크하는데 사용

• 비교하는 객체가 서로 상속관계에 있는지 확인하는 연산자