Language/JAVA

[이것이 자바다].ch6.상속

JSJH._. 2025. 12. 26. 17:44

[이것이 자바다] 06. 상속

안녕하세요. 이번에는 자바의 상속에 대해 정리한 내용입니다. 상속도 객체 지향의 중요한 요소지요. 객체지향의 장점을 정말 부각시켜주는 좋은 요소라고 생각합니다.


1. 상속의 필요성 (코드 재사용과 확장)

  • 상속(Inheritance)
    • 만들어진 클래스(부모)의 코드 상속 >> 새로운 클래스(자식)에서 코드 재사용 + 새로운 기능 추가 확장합니다.
  • 부모 클래스 (Superclass)
    • 물려주는 클래스입니다.
  • 자식 클래스 (Subclass)
    • 물려받는 클래스입니다.

2. 상속 구현

  • extends 키워드 >> 상속관계 명시합니다.
// 부모 클래스
public class SUP {
    public String str1;
    public String str1;

    public void method1() {

    }
    public void method3() {

    }
}

// 자식 클래스
public class SUB extends SUP {
    public String str3;

    public void method3(String str3) {
        this.str3 = str3;
    }
}
  • SUB 클래스
    • (private 제외) SUP의 모든 필드/메서드 상속 사용 가능 + 추가 필드/메서드

3. 자식 객체 생성 과정

자식 객체 생성할때 메모리 작동 과정입니다.

  1. 자식 객체 내부 부모 객체 먼저 생성 >> 자리 잡기
  2. 자식 클래스에 선언된 멤버들 추가 생성
    • 자식 클래스의 생성자 호출 >> 생성자 첫 줄에 반드시 부모 클래스 생성자 먼저 호출합니다.
  • super(매개변수): 자식 생성자 내부 부모 생성자 호출 코드입니다.

4. 메소드 오버라이딩

  • 상속 받은 메소드 자식의 상황에 맞게 내용을 새로 재정의하는 것입니다.
  • 조건
    • 부모 메소드와 리턴 타입, 이름, 매개변수 완전히 동일해야 합니다.
  • @Override 어노테이션
    • 메소드가 오버라이딩된 것임을 컴파일러에 알려주는 표시입니다.
    • 실수하면 컴파일러가 에러를 발생시켜 실수 막아주는 안전장치 역할을 합니다.
public class SUP {
    double method1(double d1) {
        // ...
        return ...;
    }
}

public class SUB extends SUP {
    @Override
    double method1(double d1) {
        // 다른 실행문 차이
        return ...;
    }
}

5. super 키워드 활용

  • super: 부모 가리키는 특별한 참조입니다.
  • super(): 부모 생성자 호출 (생성자의 첫 줄에서만 사용)
  • super.필드명/super.메소드명()
    • 자식 클래스에서 부모의 멤버가 가려졌을 때 숨겨진 부모의 멤버 직접 접근에 사용합니다.

6. 다형성 (Polymorphism)

  • 다양한 형태를 가질 수 있는 능력입니다.
    • 상속 관계에서 다형성 : 부모 타입의 참조 변수로 자식 객체를 다룰 수 있는 능력입니다.
    • 부모 타입 변수 = 자식 객체;
  • 하나의 타입으로 다양한 자식 객체들 통일적으로 관리 가능합니다.

자동 타입 변환 (Promotion)

자식 객체 부모 타입 변수에 대입 자동으로 부모 타입 변환됩니다.

  • 변환 후 한계
    • 변환 후 참조 변수는 부모 클래스에 선언된 멤버(필드, 메소드)에만 접근 가능합니다.
    • 자식 클래스 고유한 멤버는 사용 불가능합니다.
    • 자식 클래스에서 오버라이딩한 메소드 존재 >> 호출 시 재정의된 메소드 실행됩니다.

강제 타입 변환 (Casting)

  • 변환된 참조 변수를 다시 원래의 자식 타입으로 변환합니다.
    • 자식 클래스 고유의 멤버 사용 가능합니다.
  • instanceof 연산자
    • 강제 타입 변환은 타입과 실제 객체 불일치 >> ClassCastException 오류 발생합니다.
    • 참조변수 instanceof 타입
      • 참조변수가 타입과 일치하는지 확인 T/F

7. 추상 클래스 (Abstract Class)

  • abstract 키워드가 붙은 클래스. 미완성된 설계도입니다.
  • 특징
    • 객체 직접 생성 불가능 (new AbstractClass() 불가능)
    • 하나 이상의 추상 메소드 포함합니다.
  • 추상 메소드 (Abstract Method)
    • abstract 리턴타입 메소드이름();
      • 실행 내용({})이 없는 미완성 메소드입니다.
  • 목적
    • 여러 자식 클래스가 공통 공유하는 필드/메소드 정의합니다.
    • 일부 메소드(추상메소드)
      • 각 자식 클래스가 자신의 상황에 맞게 반드시 직접 구현 강제(오버라이딩 강제)합니다.
// 추상 개념
public abstract class ABS {
    public String str1;
    public abstract void method();
}

public class SUB extends ABS {
    @Override
    public void method() {
        //구현
    }
}

8. final/protected

  • final 클래스
    • 상속 금지
    • 다른 클래스가 extends 불가능합니다.
  • final 메소드
    • 오버라이딩 금지
    • 자식 클래스에서 재정의 불가능합니다.
  • protected 접근 제한자
    • 같은 패키지에서 default처럼 자유롭게 접근가능합니다.
    • 다른 패키지에서 자식 클래스만 부모의 protected 멤버에 접근 가능합니다.

감사합니다.