[Java] 상속(Inheritance)

bien·2023년 11월 4일
0

java

목록 보기
3/11

상속에 대해 알아보자!


1. 상속의 정의와 장점

  • 상속
    • 기존의 클래스를 재사용하여 새로운 클래스를 사용하는 것.
    • 코드의 재사용성을 높이고, 코드의 중복을 제거한다.
    • 사용법: 자식 extends 부모
class Child extneds Paraent {
	// ...
}    
  • 조상 클래스
    • 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
  • 자손 클래스
    • 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
  • 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
    • 생성자, 초기화블럭 제외.
  • 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
  • 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
  • 자손 클래스의 공통적인 부분은 조상 클래스에서 관리하고 자손 클래스는 자신에 정의된 멤버들만 관리한다.
    • 각 클래스의 코드가 적어져 관리가 쉬워진다.

왜 상속을 할까? 공통로직을 다루기위해서다. 작성한 코드에서 부모와 자식의 설정에 논리적 결함이 없다면, 많은 자식들의 공통된 코드를 한 클래스에서 변경할 수 있다.

한 부모의 공통 멤버를 50명의 자식 객체가 사용하고 있고, 그 자식 객체가 500번 호출되고 있는 상황에서, 기능의 변경이 있다면 25000 부분의 코드 수정을 고려해야 한다. 그러나 그들이 상속을 받고 있다면? 부모 클래스 파일만 수정하면 된다.


2. 클래스간의 관계: 포함관계

클래스의 관계는 상속과 포함, 이렇게 2가지가 있다. 포함에 대해 알아보자.

포함(Composite)

  • 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
class Circle {
	int x; // 원점의 x좌표
    int y; // 원점의 y좌표
    int r; // 반지름(radius)
}

위의 코드를, 아래처럼 Circle이 Point를 포함하도록 변경할 수 있다.

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

class Circle {
	Point c = new Point(); //인스턴스 생성
    int r;
}

하나의 거대한 클래스를 단위별로 여러개의 클래스로 작성한 다음, 이 단위 클래스를 포함관계로 재사용하면 효과적이다.


3. 클래스간의 관계 설정하기

앞서 언급했듯이 클래스 간의 관계에는 상속포함이 있다. 하나씩 살펴보자.

  • 상속관계 (is-a)
    • ~은 ~이다.
    • 원은 도형이다. (Circle is a Shape)
class Circle extends Shpae {}
  • 포함관계 (has-a)
    • ~은 ~을 가지고 있다.
    • 원은 점을 가지고 있다. (Circle is a Point)
class Circle {
	Point c = new Point();
    int r
}    

어느 관계가 적절한지 의아할때는 어떤 표현이 더 적절한지 비교해보면 된다(가지다has인지, 이다is인지). 상속은 특이 케이스이고, 보통 포함 관계가 빈번하게 사용된다.


4. 단일 상속 (Single Inheritance)

  • Java는 단일상속만을 허용한다.
class TvDVD extends Tv, DVD {} // 에러. 조상은 하나만 허용된다.
  • 다중 상속 단점: 서로 다른 클래스로부터 상속받은 멤버들간의 이름이 같은 경우 구별할 방법이 없다는 충돌의 단점을 가지고 있다.
  • 단일 상속 장점: 클래스 간의 관계 명확 + 코드 신뢰

5.Object 클래스: 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object 클래스(최고 조상)를 상속받게 된다.
    • 컴파일러가 자동으로 extends Object를 추가해준다.
  • 모든 클래스는 Object에 정의된 11개의 메서드를 상속받는다.

Reference

profile
Good Luck!

0개의 댓글