[Java] 상속

션션·2026년 1월 28일

Java

목록 보기
5/10
post-thumbnail

1. 상속의 정의와 목적

상속이란 상위 클래스의 속성(필드)과 메서드를 하위 클래스가 물려받아 기능을 확장하는 것을 말합니다.

  • 부모 클래스 (Parent/Super Class): 자원을 물려주는 클래스
  • 자식 클래스 (Child/Sub Class): 자원을 물려받는 클래스

상속을 사용하는 이유

  1. 재사용성 향상: 공통된 기능을 부모 클래스에 한 번만 정의하여 코드 중복을 제거합니다.
  2. 유지보수성 증대: 부모 클래스의 수정만으로 모든 자식 클래스에 변경 사항을 적용할 수 있습니다.

2. 상속의 특징과 관계 설정

'Is-a' 관계 vs 'Has-a' 관계

상속을 결정할 때 가장 중요한 것은 두 클래스 사이의 논리적 관계입니다.

  • Is-a (상속): "자식은 부모이다." (예: 학생은 사람이다.)
  • Has-a (포함): "클래스 A가 클래스 B를 가지고 있다." (예: 자동차는 엔진을 가지고 있다.)

주의: 자바는 클래스의 다중 상속을 허용하지 않습니다. (다이아몬드 상속 문제 방지). 하나의 클래스는 오직 하나의 부모만 가질 수 있습니다.

예제로 보는 상속 (Extends)

기존의 Campus라는 부모 클래스가 있고, 지역별 캠퍼스가 이를 상속받는 구조로 재구성해 보겠습니다.

class Campus {
    String location = "전국";

    void info() {
        System.out.println("위치: " + location);
    }
}

class SeoulCampus extends Campus {
    // 부모의 필드를 자식에 맞게 수정
    SeoulCampus() {
        this.location = "서울캠퍼스";
    }
}

3. 메서드 재정의 (Overriding)와 super

부모에게 물려받은 메서드가 자식 클래스에 맞지 않을 때, 이를 다시 정의하는 것을 오버라이딩이라고 합니다.

오버라이딩의 조건

  • 메서드 이름, 매개변수 타입 및 개수, 반환 타입이 모두 동일해야 합니다.
  • 접근 제한자: 부모보다 더 좁은 범위로 변경할 수 없습니다. (예: 부모가 public이면 자식도 public)
  • 예외 처리: 부모 클래스의 메서드보다 더 큰 예외를 던질 수 없습니다.

super 키워드 활용

  • super: 부모 객체의 참조값에 접근할 때 사용합니다.
  • super(): 부모의 생성자를 호출합니다. 반드시 자식 생성자의 첫 줄에 위치해야 하며, this()와 동시에 사용할 수 없습니다.

4. 모든 클래스의 조상, Object

자바에서 extends를 명시하지 않은 모든 클래스는 자동으로 java.lang.Object를 상속받습니다.

주요 메서드 이해하기

  1. toString(): 객체를 문자열로 표현합니다. 기본은 '클래스명@해시코드'를 반환하므로, 객체의 상태를 보기 위해 오버라이딩이 권장됩니다.
  2. equals(Object obj): 두 객체의 참조값(주소)을 비교합니다. 실제 데이터 값을 비교하고 싶다면 오버라이딩이 필요합니다. (String 클래스는 이미 값이 같으면 true를 반환하도록 오버라이딩되어 있습니다.)
  3. hashCode(): 객체를 식별하는 정수값으로, 기본적으로 메모리 주소를 기반으로 생성됩니다.

5. 변경을 제한하는 final 키워드

final은 "마지막"이라는 의미대로, 더 이상의 수정을 막는 제약 사항을 부여합니다.

대상효과
변수상수가 되어 초기화 후 값 변경 불가
메서드자식 클래스에서 오버라이딩(재정의) 불가
클래스상속 불가 (예: String 클래스)

꿀팁! final 참조 변수(예: 배열)의 경우, 변수 자체에 새로운 객체를 할당하는 것은 안 되지만, 객체 내부의 값(배열의 요소)은 변경이 가능합니다.


6. 점검해보자

Q. 부모 클래스의 모든 것이 상속되나요?
A. 아니요. 생성자초기화 블록(static { })은 상속되지 않습니다.

Q. 다중 상속은 왜 안 되나요?
A. 여러 부모로부터 동일한 이름의 메서드를 상속받을 경우 어떤 것을 실행해야 할지 모르는 다이아몬드 문제가 발생하기 때문입니다.

Q. super()와 this()를 한 생성자에서 같이 못 쓰는 이유는?
A. 두 키워드 모두 생성자의 첫 번째 줄에 위치해야 한다는 문법적 규칙 때문입니다.

0개의 댓글