혼공자 ch7-1 상속

Ada·2022년 10월 4일
0

항해TOL

목록 보기
16/63

객체 지향 프로그래밍에서 부모 클래스의 멤버를 자식 클래스에게 물려주는 것을 상속이라고 부릅니다.

[클래스 상속]

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고 선택된 부모 클래스는 extends 뒤에 써줌.

class 자식클래스 extends 부모클래스 {
  //필드
  //생성자
  //메소드
}

상속의 특징

  1. 여러 개의 부모 클래스를 상속할 수 없으므로 extends 뒤에는 단 하나의 부모 클래스만 와야함

  2. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외

그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외

[부모 생성자 호출]

  • 상속된 클래스를 호출할때는 부모 생성자 먼저 호출됨.
  • 모든 객체는 클래스의 생성자를 호출해야만 생성되며, 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출됨

  • 만약 Computer의 생성자가 명시적으로 선언되지 않았다면 컴파일러는 super 기본 생성자를 생성

public Computer() {
  super();
}

[super() 기본생성자]

  • 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성
자식클래스( 매개변수선언, ...) {
  super( 매개값, ...);
}
  • 위 코드는 매개값의 타입과 일치하는 부모 생성자를 호출

  • super(매개값, ...) 가 생략되려면 부모 클래스에 기본 생성자가 존재하여서 super()를 자동 추가할 수 있어야 함

  • super( 매개값,...) 은 반드시 자식 생성자 첫 줄에 위치해야함

[메소드 재정의 : 오버라이딩]

  • 부모 클래스에서 상속받은 메소드를 수정해 자식 클래스에서 재정의하는 것

  • 부모의 메소드와 동일한 리턴 타입, 메소드 이름, 매개 변수 목록을 가져야 함

  • 접근 제한을 더 좁게 수정 불가
    (public이나 default나 private로 수정 불가
    반대로 default는 public으로 수정 가능)

오버라이딩이 불가능한 경우

  • private 메소드

    • 부모 클래스 전용이므로 자식 클래스에 상속되지 않음
  • 정적 메소드

    • 클래스 소속이므로 자식 클래스에 상속되지 않음
  • final 메소드

    • final 메소드는 더 이상 수정할 수 없으므로 자식 클래스가 오버라이딩 할 수 없음
  • 메소드가 재정의 되면 자식 객체에서 메소드를 호출시에 부모 객체의 메소드는 숨겨지고 재정의된 자식 메소드가 호출

  • @Override 어노테이션을 붙여주면 메소드가 정확히 재정의된 것인지 컴파일러가 확인해줌

부모 메소드 호출

super.부모메소드();

  • 자식 클래스가 메소드를 오버라이딩하면 자식 객체는 부모 클래스의 오버라이딩 된 메소드를 숨김

  • 그 숨겨진 메소드를 호출하려면 super 키워드를 사용

  • Super는 현재 객체에서 부모 클래스를 참조한다는 것을 의미함.

[final 클래스와 final 메소드]

  • final 클래스는 상속 불가능, 즉 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음

  • final 메소드는 재정의 할 수 없는 메소드가 됨

[protected 접근제한자]

  • protected는 public 과 defaul 접근 제한의 중간쯤에 해당함

  • 같은 패키지에서는 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근 허용

profile
백엔드 프로그래머

0개의 댓글