자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성)

개발학생 2025. 6. 12. 18:50
반응형

1. 상속 

1) 상속의 정의

  • 이미 잘 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에, 중복되는 코드를 줄여줌
    -> 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오므로, 유지 보수 시간을 줄일 수 있음
  • 예시: 부모 클래스 A.java, 자식 클래스 B.java
// 클래스 A
public class A {
  int field1;
  void method1() { ... }
}

// 클래스 A를 상속한 클래스 B
public class B extends A {
  String field2;
  void method2() { ... }
}

2) 클래스 상속의 특징 

  • 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스를 extends 뒤에 기술
  • 자바에서는 여러 개의 부모 클래스를 상속할 수 없기 때문에, extends 뒤에는 단 하나의 부모 클래스만 와야 함
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메서드는 상속 대상에서 제외
  • 부모 클래스와 자식 클래스가 다른 패키지에 존재할 경우, default 접근 제한을 갖는 필드와 메서드도 상속 대상에서 제외
class 자식클래스 extends 부모클래스 {
  // 필드
  // 생성자
  // 메서드
}

3) 부모 생성자 호출

  • 부모 객체가 먼저 생성된 후에 자식 객체가 생성됨 
    -> 예시: CellPhone cellPhone = new CellPhone(); 코드일 경우,
                 부모인 Phone 객체가 먼저 생성되고 자식인 CellPhone 객체가 생성되는 모습

부모 객체가 먼저 생성된 후에 자식 객체가 생성되는 것을 메모리로 표현

  • 자식 생성자를 선언하고 명시적으로 부모 생성자 호출 가능
자식클래스(매개변수선언, ...) {
  // 이 super 부분이 생략될 경우, 컴파일러에 의해 자동적으로 추가되므로 부모의 기본 생성자가 존재해야 함
  super(매개값, ...);  
  ...
}

4) 메서드 재정의(오버라이딩/Overriding)

(1) 메서드 재정의 방법

  • 어떤 부모 메서드가 자식 클래스에서 사용하기 적합하지 않을 경우, 상속된 일부 메서드를 자식 클래스에서 다시 수정하여 사용
    -> 부모 객체의 메서드는 숨겨지므로, 자식 객체에서 메서드를 호출하면 재정의된 자식 메서드가 호출됨

메서드 오버라이딩 예시-자바 컴파일러 사이트

  • 필수 조건 
    • 부모의 메서드와 동일한 시그니처(리턴 타입, 메서드 이름, 매개 변수 목록)를 가짐
    • 접근 제한을 더 강하게 재정의할 수 없음
      -> 부모 메서드가 public 접근 제한을 가지고 있을 경우, 자식 메서드에서 default나 private로 수정할 수 없음
      => 반대로 부모 메서드가 default 접근 제한을 가지면, 자식 메서드는 default 또는 public을 가질 수 있음 
    • 새로운 예외(Exception)를 처리할 수 없음 

(2) 부모 메서드 호출

  • 자식 클래스 내부에서 재정의된 부모 클래스의 메서드를 호출해야 하는 상황이 발생할 경우,
    super 키워드를 붙여 부모 메서드 호출

메서드 오버라이딩 시 부모 메서드 호출 예시-자바 컴파일러 사이트

5) final 클래스와 final 메서드

  • final 키워드를 클래스 앞에 붙이면 상속할 수 없는 클래스가 됨
    -> 부모 클래스가 될 수 없으므로 자식 클래스를 만들지 못함
  • final 키워드를 메서드 앞에 붙이면 오버라이딩 할 수 없는 메서드가 됨
    -> 부모 클래스를 상속하여 자식 클래스를 선언하더라도, 자식 클래스에서 오버라이딩 할 수 없는 메서드

2. 클래스의 타입 변환과 다형성

1) 다형성의 정의

  • 사용 방법이 동일한 다양한 객체를 이용하여 다양한 실행결과가 나오도록 하는 성질
    -> 구현하려면 메서드 오버라이딩과 타입 변환이 필요

2) 클래스의 자동 타입 변환(promotion)

클래스의 자동 타입 변환 시 메모리 표현

  • 상속 관계에 있는 클래스 사이에서도 프로그램 실행 도중에 자동으로 타입 변환이 발생
    -> 바로 위의 부모가 아니더라도, 상위 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있음
  • 자식은 부모의 특징과 기능을 상속받기 때문에, 부모와 동일하게 취급될 수 있음
  • 조건
// 자식 클래스의 객체가 부모 클래스 타입으로 변환
부모타입 변수 = 자식타입;
  • 예시

클래스의 자동 타입 변환 예시-자바 컴파일러 사이트

3) 필드의 다형성

  • 필드의 타입을 부모 타입으로 선언하면, 다양한 자식 객체들이 저장되어 필드 사용 결과가 달라지는 성질

필드의 다형성 예시-자바 컴파일러 사이트

4) 매개 변수의 다형성

  • 메서드 호출 시, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정하는 것 

매개 변수의 다형성 예시-자바 컴파일러 사이트

5) 클래스의 강제 타입 변환(casting)

  • 부모 타입을 자식 타입으로 변환
    -> 자식 타입이 부모 타입으로 자동 타입 변환한 후, 다시 자식 타입으로 변환할 때 사용
// 부모타입을 자식타입으로 변환
자식타입 변수 = (자식타입) 부모타입;
  • 업캐스팅(Upcasting): 자식 클래스 객체를 부모 클래스 타입으로 변환

강제 타입 변환 업캐스팅 예시-자바 컴파일러 사이트

  • 다운캐스팅(Downcasting): 부모 클래스 타입을 자식 클래스 타입으로 변환

강제 타입 변환 다운캐스팅 예시-자바 컴파일러 사이트

 

반응형