inflearn

[인프런] 김영한의 자바 기본 강의 섹션9. 상속 (240112)

hail2y 2024. 1. 12. 23:42

요즘 9시 기상을 목표로 하루를 알차게 보내려고 노력 중인데 금요일이라 일찍 끝난 것도 있었고 놀다보니 마음을 다잡기가 어려워서 이제야 공부를 시작한다.. 사실 지금도 당장 방으로 올라가고 싶지만 우선은 이 정리부터 끝내야지

내 마음 다잡기가 이리도 힘들다 그래도 할 건 해야지 나태해지지 말자 안주하지 말자! 아자아자!

 

1/12 섹션9 상속 필기

  • 상속 키워드 - extends ex) public class ElectricCar extends Car {} 
  • 상속을 누구에게서 받을지는 하나만 선택할 수 있다. 

부모 클래스 (슈퍼 클래스)

자식 클래스 (서브 클래스)

  • 상속 구조도에서 방향은 자식에서 부모 쪽으로
  • 자식 클래스에서 누구로부터 상속 받을 것인지를 표시한다. 이 의미는 자식 클래스가 부모 클래스를 안다는 것이다.
  • 자바에서는 클래스에서 다중 상속을 지원하지 않는다.
    - 물려받은 기능 중 겹칠 때 어디 것을 쓸 건지가 애매해 진다. -- 다이아몬드 문제
    - 클래스 계층 구조가 매우 복잡해질 수 있다. 
  • 대신, 인터페이스의 다중 구현은 허용한다.

상속과 메모리 구조

이 내용은 뇌에 새겨야 한다 무조건! 이해하고 넘어가자!

상속 관계를 사용하면 부모 클래스도 함께 포함해서 인스턴스가 생성된다.
외부에서 볼 때 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식이 모두 생성되고 공간도 구분된다.
 
호출하는 변수의 타입(클래스)을 기준으로 부모와 자식 중 하나를 선택한다. 상속 관계에서는 자식 타입에 해당하는 기능이 없으면 부모로 올라가서 찾는다. 부모에서도 해당 기능을 찾지 못하면 상위 부모에서 필요한 기능을 찾아보고 올라가면서 필드나 메서드를 발견하지 못하면 컴파일 오류가 발생한다. 
  • extends => 부모의 기능을 받아 새로운 기능을 추가해서 확장한다, 확장해서 새로운 개념을 만든다. 

상속과 메서드 오버라이딩

  • 메서드 오버라이딩: 부모에게서 상속 받은 기능을 자식이 재정의한다.
    - 하위 클래스에서 상위 클래스의 메서드를 재정의하는 과정
    - 메서드 오버라이딩, 메서드 재정의
  • @이 붙은 부분은 애노테이션(annotation; 주석), 주석과 비슷한데 프로그램이 읽을 수 있는 특별한 주석
  • @Override 상위 클래스의 메서드를 오버 라이드 했다고 표시한다.
  • 오버라이드가 정확하게 안 되면 컴파일 오류를 낸다.

** 기본적인 주의 사항

1. 메서드 이름을 같아야 한다.

2. 매개변수 타입, 개수, 순서가 같아야 한다. 

3. 반환타입이 같아야 한다. 

 

cf. 메서드 오버로딩에서도 매개변수 타입 순서가 다르면 다른 걸로 인정된다. 

- 메서드 이름은 일치하되 매개변수의 개수, 타입이 달라야 한다. 메서드의 return 타입이 달라야 한다

  • 부모의 필드명과 자식의 필드명이 같거나 메서드도 오버라이딩 되어 있으면 부모 클래스의 것이 호출되지 않는다. 
  • => 이럴 때 super 키워드를 사용한다. 
  • 자기 자신부터 찾고, 없으면 부모 클래스 가서 찾아본다. 
    cf. this는 자기 자신의 참조를 의미한다.

super - 생성자

상속 관계의 인스턴스를 생성하면 메모리에 자식, 부모 클래스 모두 만들어진다. -- 각각의 생성자를 모두 호출

상속 관계를 사용하면 자식 클래스의 생성자 첫 줄에 부모 클래스의 생성자를 반드시 호출해야 한다. super(~)

  • 기본 생성자(파라미터가 없는 생성자)면 생략 가능하다.
  • 생성자의 실행 순서는 최상위 부모부터 하나씩 아래로 내려온다. 최상위 부모부터 초기화가 이루어진다.
  • -- 부모의 기능을 상속받아 사용하니 먼저 만들어져야 한다.

자식 클래스의 생성자 첫 줄에 this() 또는 super()를 사용한다. 

this()를 백번 하더라도 마지막에 가서 super()를 사용해야 한다. 

 

꿀팁!

  • ctrl O 오버라이드 할 것을 골라 자동으로 작성해 준다. 

정리하면, 

  • 변수가 private이면 super.을 해도 접근이 제한된다. 
  • 클래스에 final이 붙으면 상속이 불가능하다.
  • 메서드에 final이 붙으면 오버라이드가 불가능하다. 

 

--끝--