자바_05 상속

aggapang·2025년 4월 30일

kb IT's Your Life

목록 보기
13/20

상속

  • 기존 클래스 재사용
  • 부모 클래스의 필드와 메소드를 자식 클래스에 물려줄 수 있음
  • 자식과 부모는 IS-A 관계여야함 (자식이 부모이다)
    • is-a & has-a
    • 구분설명예시
      IS-A 관계"A는 B이다" 관계 상속을 통해 표현고양이는 동물이다 (Cat extends Animal)
      HAS-A 관계"A는 B를 가지고 있다" 관계필드를 통해 표현자동차는 엔진을 가진다 (Car has Engine)
  • 장점
    • 클래스 재사용으로 중복 코드 줄임
    • 수정을 최소화할 수 있음

클래스 상속

상속 선언

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

  • 다중 상속 불가

부모 생성자 호출

자식클래스 변수 = new 자식클래스();

  • 자식 객체를 생성하면 부모 객체가 먼저 생성한 다음 자식 객체가 생성됨
  • 부모 생성자는 자식 생성자의 맨 첫줄에 숨겨져 있는 super()에 의해 호출

메소드 오버라이딩

  • 생성된 메소드를 자식 클래스에서 재정의
  • 부모 메소드보단 자식 메소드가 우선적으로 사용됨
  • 부모 메소드의 선언부(리턴타입, 메소드 이름, 매개변수)와 동일해야함
  • 접근 제한 더 강하게 오버라이딩 불가(public -> private X)
  • 새로운 예외 throws 불가
  • 부모 메소드 호출 super.메소드()
    • 부모 메소드 재사용함으로써 자식 메소드 중복 제거

final

final 클래스

  • 부모 클래스가 될 수 없음
  • 자식 클래스 만들 수 없음
    public final class Member {
    }

    // 다른 파일에서
    public class VeryImportantPerson extends Member { // 컴파일 에러 상속 불가
    }

final 메서드

  • 오버라이딩 불가
  • 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 불가
    public class Car {
        //필드 선언
        public int speed;
        //final 메소드
        public final void stop() {
          speed = 0;
        }
    }
    // 다른 파일에서
    // 컴파일 에러, final 메서드는 오버라이딩을 할 수 없음

형변환

  • 변수에 들어있는 주소를 다른 변수에 넣을 때 타입을 변환해서 할당
  • 크기 기준
    기본형변수의 크기큰 크기의 변수 (int, double 등)(작은 크기의 변수 byte, short 등)
    참조형상속관계만! 개념의 크기부모 클래스자식클래스

자동 타입 변환 Up Casting

  • 작 -> 큰 복사되는 경우
  • 자동으로 형변환되어 저장
  • 기본형은 크기 기준, 참조형은 상속 기준
  • 참조형일 경우: 자식 타입 → 부모 타입으로 자동 형변환 가능
    • 주의 : 부모 타입으로 변환되면 부모가 가진 멤버만 접근 가능 (자식만의 필드나 메서드 사용 불가능)

강제 타입 변환 Down Casting

  • 큰 -> 작 복사되는 경우
  • 강제로 형변환하여 저장
  • 자식 타입이여야 다운 캐스팅 가능!
    • instanceof 연산자를 활용해서 타입 체크하면 안전하게 다운 캐스팅 가능

다형성

  • 하나의 타입(부모)으로 여러 타입(자식)을 처리할 수 있음
  • 코드의 재사용성과 유지보수성을 높여줌

필드 다형성

  • 필드 타입은 동일하지만, 대입되는 객체가 달라서 실행 결과가 다양
Animal a = new Dog(); // Dog도 되고
a = new Cat();        // Cat도 됨

매개변수 다형성

  • 메소드가 클래스 타입의 매개변수를 가진 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음

부모-자식 상속 관계

  • Parent p = new Parent(); : 부모타입 -> 부모객체
    • 객체 생성: Parent 객체 1개가 Heap 영역에 생성됨
    • 참조 변수 타입: Parent 타입의 변수 p가 Stack 영역에 만들어지고, 이 변수는 Heap의 Parent 객체를 가리킴
    • 접근 가능 멤버: Parent 클래스에 정의된 필드, 메서드만 사용 가능'
      -> "Parent 타입 변수 p는 Parent 객체를 가리키고, Parent 멤버만 사용한다."
  • Child c = new Child(); : 자식타입 -> 자식 객체
    • 객체 생성 : ChildParent 부분도 함께 생성
      • ChildParent를 상속받았기 때문에, Parent 부분도 함께 만들어짐
      • Child 객체 안에는 Parent의 필드와 메서드도 포함
    • 참조 변수 타입: Child 타입의 변수 c가 이 전체 Child 객체를 가리킴
    • 접근 가능 멤버: Parent의 멤버 + Child에서 정의된 멤버 전부 가능
      -> "Child 타입 변수 c는 전체 Child 객체를 가리키며, 자식+부모의 멤버 모두 사용 가능"
  • Parent p = new Child();
    • 다형성의 대표 예시!!
    • 자식 객체가 생성되지만 부모 타입 변수로 참조
    • new Child()시 자식과 부모 객체 모두 heap에 생성되지만, 변수 p는 부모 타입이라서 부모가 가진 것(parent 클래스)만 접근 가능함
    • 객체 생성: new Child()니까 → 실제로는 Child 객체가 생성됨
      • 객체 안에는 Parent의 멤버도 있고, Child의 멤버도 있음 (상속 구조니까)
    • 참조 변수 타입: Parent 타입의 변수 p가 이 Child 객체를 가리킴
      • 변수의 타입이 Parent이기 때문에, Parent에 정의된 멤버만 접근 가능
      • 자식 객체가 실제로 존재하지만, 부모 타입으로는 자식의 것을 볼 수 없음

0개의 댓글