[JAVA] 상속

용용학생·2024년 4월 22일

자바

목록 보기
16/32

상속

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
  • extends 키워드를 사용하여 작성

새로 작성하려는 클래스의 이름이 Child 이고
상속받고자 하는 클래스의 이름이 Parent 라고 한다면 이렇게 작성하면 된다.

class Child extends Parent { ... }

이 두 클래스를 서로 상속 관계 에 있다고 하며,
상속해주는 클래스는 부모 클래스, 상속 받는 클래스는 자식 클래스라고 한다.

  • 자식 클래스는 부모 클래스의 모든 멤버를 상속받는다.
    (단, 생성자와 초기화 블럭은 상속되지 않는다)
  • 자식 클래스의 멤버는 부모 클래스의 멤버보다 항상 같거나 많다

  • 부모 클래스로부터 자식, 자손 클래스까지 상속도 허용
  • 하나의 부모 클래스로부터 여러 개의 자식 클래스를 갖는 상속도 허용
  • 그러나 하나의 자식 클래스가 여러 부모 클래스를 갖는 다중 상속은 비허용

다중 상속을 허용하지 않는 이유

만약 여러 부모 클래스에서 상속받은 멤버 중 동일한 이름의 필드나 메소드가 있다면,

  • 어떤 부모 클래스의 필드나 메소드를 상속받아야 하는가?
  • 어떤 부모 클래스로 접근해야하는가?

와 같은 모호함이 발생하기 때문이다.

그래서 자바에서는 다중 상속을 포기하고 단일 상속만을 허용한다.
단일 상속은 클래스 간의 관계를 명확히 한다.

클래스 간의 관계 결정

클래스 간의 관계는 상속 말고도 재사용하는 또 다른 방법이 있다.
바로 포함 관계 이다.
포함 관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 말한다.

class Circle {
	int x; // 원점의 x 좌표
    int y; // 원점의 y 좌표
    int r; // 반지름
}

class Point {
	int x; // x 좌표
    int y; // y 좌표
}

원을 표현하기 위한 Circle 클래스가 있고
좌표상의 점을 다루기 위한 Point 클래스가 있다.

이 둘의 관계를 상속으로 할지 포함으로 할지 정해야 한다.

// 상속 관계로 설정한 클래스
class Circle extends Point {
	int r;
}

// 포함 관계로 설정한 클래스
class Circle {
	Point p;
    int r;
}

결과적으로 보면 Circle의 멤버로 좌표의 점과 반지름을 필드로 갖는다.

이럴 때는 is-ahas-a를 넣어 문장을 만들어보면
클래스 간의 관계를 명확히 할 수 있다.

  • Circle is a Point - 원은 점이다
  • Circle has a Point - 원은 점을 가지고 있다

has-a 의 문장이 더 옳으므로 CirclePoint 는 포함 관계임을 알 수 있다.


도형을 의미하는 Shape 클래스와 원을 의미하는 Circle 클래스,
점을 의미하는 Point 클래스의 관계는 어떻게 정의할 수 있을까?

  • Circle is a Shape
  • Circle has a Point
class Circle extends Shape {
	Point p;
}

이렇게 관계를 만들 수 있다.

모든 클래스의 조상 - Object 클래스

Object 클래스는 모든 클래스 상속 계층도의 최상위에 있는 조상클래스이다.
어떠한 클래스로부터 상속 받지 않는 모든 클래스는 컴파일 단계에서 자동적으로 Object 클래스를 상속받게 한다.

class Tv { ... }

아무 것도 상속 받지 않는 Tv 클래스가 있다고 하자.
이 코드를 컴파일하게 되면 컴파일러는 자동적으로 extends Object를 추가시킨다

class Tv extends Object { ... }

이렇게 올라다가보면 어떤 클래스든 최상위 부모 클래스는 Object 클래스가 된다.
그렇기 때문에 Object 클래스에 정의된 toString 메소드나 equals 메소드를 사용하는 것이 가능한 이유이다

profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글