[혼공자][week4] Day12 상속

Ida·2025년 2월 5일
0

혼공자

목록 보기
13/20

07-1 상속

이미 개발된 클래스를 재활용하여 중복 코드 줄일 수 있음
동일한 메소드를 추가작성 하지 않아도 되고 부모 클래스 수정 시 자식 클래스도 같이 수정 가능하기에 개발 시간 및 유지 보수 시간 절약 가능함

1. 클래스 상속

class 자식클래스 extends 부모클래스 {}

자식클래스 선언 시 extends로 어떤 부모클래스를 상속 받을지 결정 해야 함

자바에서의 상속

  • 다중 상속 허용 X, extends 뒤에는 단 하나의 부모 클래스만 올 수 있음
  • 부모 클래스에서 private 접근 제한인 필드, 메소드는 상속 대상에서 제외
  • 부모 클래스와 자식 클래스의 패키지가 다른 경우
    -> default 접근 제한인 필드와 메소드도 상속 대상 X

손코딩

부모 클래스인 CellPhone 선언

자식 클래스인 DmbCellPhone 선언.
선언 시 extends CellPhone으로 상속 받을 클래스 지정

자식 클래스로 객체 생성하여 프로그램 작성

2. 부모 생성자 호출

모든 객체는 클래스의 생성자를 호출해야 생성됨
부모 생성자는 자식 생성자에서 호출됨 반드시 자식 생성자 첫 줄에!

부모 클래스에서 생성자 선언이 되지 않아도 컴파일러가 기본 생성자를 생성되어 실행 됨. (명시적으로 부모 생성자 호출을 원한다면 해도 됨)
부모 클래스에 매개 변수가 있는 생성자가 있다면 자식 클래스에서 호출 해야 함

super(매개값, ...);을 자식 생성자 첫 줄에 작성하면 부모 생성자 호출 가능

손코딩

부모클래스인 People 클래스 선언

자식클래스인 Student 클래스 선언

  • 부모 클래스에 매개변수가 있는 생성자가 있으니 반드시 super()를 이용해 부모 생성자를 호출 해야함.

자식 객체 이용

3. 메소드 재정의

자식 클래스에 사용하기 적합하지 않은 부모 메소드가 상속 되었을 때 자식 클래스에서 다시 수정하는 기능. 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것.

메소드 재정의 방법

메소드 재정의 규칙

  • 부모의 메소드와 동일한 시그너처(리턴타입, 메소드이름 등)
  • 더 강한 접근 제한 X (부모가 public일 경우 default나 private로 수정 불가능)
  • 새로운 예외(Exception)를 throws X

손코딩

원면적 계산하는 코드 작성

부모 클래스인 Calculator 클래스 선언

자식 클래스인 Computer 클래스 선언

  • 더 정확한 원면적 계산을 위해 Math.PI상수로 메소드 재정의
  • @Override 어노테이션: 컴파일러가 정확히 메소드 재정의 되었는지 확인할 수 있음. (개발자 실수를 줄이기 위함)

메소드 재정의 테스트를 위한 실행 코드
부모클래스, 자식클래스 모두 객체 생성하여 메소드 재정의가 잘 되었는지 확인

부모 메소드 호출

메소드 재정의 시 부모 메소드는 숨겨지고 재정의된 자식 메소드만 사용됨. 부모 메소드가 필요한 상황에는 super키워드를 사용해 부모 메소드 호출 가능

SupersonicAirplane 클래스 (손코딩)

부모 클래스 Airplane 클래스 선언

  • Airplane은 일반 비행모드

자식 클래스인 SupersonicAirplane 클래스 선언

  • 상속받을 부모 클래스로 Airplane 지정함.
  • fly() 메소드가 재정의 되어 초음속 비행 모드와 일반 비행 모드 두 가지로 동작함. (flyMode가 SUPERSONIC 상수값이 아니면 부모 클래스인 Airplane의 fly()메소드 호출)

자식 객체 이용

4. final 클래스와 final 메소드

final 키워드는 해당 선언이 최종 상태이니 수정할 수 없음을 뜻함.

  • 필드 선언 시 사용: 초기값 설정 후 값변경 X
  • 클래스, 메소드 선언 시 사용: 상속과 관련됨을 의미

상속할 수 없는 final 클래스

클래스 선언 시 final 키워드 사용

public final class 클래스 {...}
final 클래스는 부모 클래스가 될 수 없으며, 자식 클래스를 만들 수 없다.

상속 X final 클래스 (손코딩)

final 클래스를 상속할 경우 자식 클래스를 선언할 수 없음

재정의할 수 없는 final 메소드

메소드 선언 시 final 키워드 사용
public final 리턴타입 메소드([매개변수, ...]) {...}
부모 클래스 상속해서 자식 클래스 선언할 시 final 메소드는 재정의할 수 없음.

재정의 X final 클래스 (손코딩)

speedUp() 메소드는 재정의 되었지만 stop()메소드는 final 메소드이기에 재정의 시 컴파일 에러 발생

* protected 접근 제한자

같은 패키지에서 접근 제한없고 다른 패키지에서는 자식 클래스만 접근 가능함. 또한, 필드와 생성자, 메소드 선언 시 사용 가능함.

손코딩

  • A클래스에서 protected 접근 제한으로 필드, 생성자, 메소드 선언
  • A와 같은 패키지에 존재하는 B클래스에서 A의 필드, 생성자, 메소드에 접근 가능함
  • A와 다른 패키지에 존재하는 C클래스는 A의 필드, 생성자, 메소드에 접근 불가능함
  • A와 다른 패키지에 존재하지만 상속받아 자식클래스인 D클래스는 A의 필드, 생성자, 메소드에 접근 가능함. 단, 생성자 호출시new 연산자가 아닌 super()로 A생성자 호출

profile
나는 이다이다.

0개의 댓글

관련 채용 정보