본문 바로가기
프로그래밍/Java

[실전 자바-기본편] 상속

by Dean30 2024. 2. 15.
728x90

상속

  • 부모 클래스(슈퍼 클래스)
  • 자식 클래스(서브 클래스)
  • 상속은 부모의 기능을 자식이 물려 받는 것이다.
  • 부모 클래스는 자식 클래스에 접근할 수 없다.
  • 단일 상속 !
    • 자바는 다중 상속을 지원하지 않는다.
      • 다중 부모에 같은 이름의 메서드가 있을 경우 어떤 메서드를 사용해야할지 결정할 수 없음 (다이아몬드 문제)
      • 인터페이스를 통한 다중 구현을 이용해서 이런 문제를 피한다.

 

 

상속과 메모리 구조

  • 상속 관계의 객체를 생성하면, 그 내부에는 부모와 자식이 모두 생성된다.
  • 상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이 때 호출자의 타입을 통해 대상 타입을 차즌ㄴ다.
  • 현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 기능을 찾지 못하면 컴파일 오류가 발생한다.

 

 

 

 

 

상속과 메서드 오버라이딩

  • 부모에게서 상속 받은 기능을 자식이 재정의 하는 것을 메서드 오버라이딩(Overriding)이라 한다. 
  • 메서드 윗줄에 @Override를 붙인다. (optional이지만 꼭 씀)
    • @는 애노테이션이라 한다. 프로그램이 읽을 수 있는 특별한 주석이라 생각하면 된다.
  • 오버라이딩과 메모리 구조
    • electricar.move()를 호출하면 ElectricCar 인스턴스 내부에 메서드를 찾는다. 찾았으므로 부모 타입을 찾지 않는다.

 

 

오버로딩과 오버라이딩

  • 메서드 오버로딩
    • 메서드 이름이 같고 매개변수(파라미터)가 다른 메서드를 여러개 정의
    • 과적
  • 메서드 오버라이딩
    • 하위 클래스에서 상위 클래스의 메서드를 재정의 하는ㄱ ㅘ정
    • 무언가를 다시 재정의한다는 뜻

 

메서드 오버라이딩 조건

  • 메서드 이름: 메서드 이름이 같아야 한다.
  • 메서드 매개변수(파라미터): 매개변수 타입, 순서, 개수가 같아야 한다.
  • 반환 타입: 반환 타입이 같아야 한다. 단, 반환 타입이 하위 클래스 타입일 수 있다.
  • 접근 제어자: 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다.
    • 부모가 protected면 자식은 protected, public만 가능
  • 예외: 오버라이딩 메서드는 상위 클래스의 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다.
  • static, final, private: 키워드가 붙은 메서드는 오버라이딩 될 수 없다.
    • static은 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩이 의미가 없다.
  • 생성자 오버라이딩: 생성자는 오버라이딩 할 수 없다.

 

 

클래스와 메서드에 사용되는 final

클래스에 final

  • 상속 끝
  • final로 선언된 클래스는 확장될 수 없다. 다른 클래스가 final로 선언된 클래스를 상속받을 수 없다.
  • 예: public final class MyFinalCalss {...}

메서드에 final

  • 오버라이딩 끝
  • final로 선언된 메서드는 오버라이드 될 수 없다. 상속받은 서브 클래스에서 이 메서드를 변경할 수 없다.
  • 예: public final void myFinalMethod() {...}

 

 

상속과 접근 제어

 

JAVA 접근 제어자 - UML 표기법

  • +: public 
  • #: protected
  • ~: default
  • -: private

 

 

 

super

  • super는 부모 참조
    • 자식 클래스가 메서드 오버라이딩을 하고 있을 때  super를 이용해 부모 클래스 접근 가능
  • 클래스에서 기본 생성자(파라미터가 없는 경우)는 super() 생략 가능
    • 부모 클래스가 기본 생성자이면 자식 클래스에서 super() 생략 가능
      • 자바가 super()를 자동으로 만들어 줌
  • super는 생성자 첫 줄에 작성
    • this()를 사용하여 해당 클래스의 다른 생성자를 호출할 수 있으나 그 생성자의 첫줄에 또 super()가 있을 것임
      • this는 해당 클래스 ()는 생성자를 의미
  • ClassA <- ClassB <- ClassC 순으로 상속 받는 경우(ClassC가 손자)
    • ClassA - ClassB - ClassC 순으로 실행됨
      • 자식 생성자의 첫줄에서 부모 생성자를 호출하기 때문

 

 

 

 

728x90

댓글