[객체 지향 프로그래밍] 상속 (Inheritance)

sy·2023년 7월 1일
0

상속 (Inheritance)

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

[장점]

  • 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이
  • 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여

[작성 방법]
extends를 적어주면 된다.

class Child extends Parent{
	
}

[용어]
조상 클래스: 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
자손 클래스: 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스

[관계]

class Parent { // 부모 클래스
	int age;
}

class Child extends Parent() { // 자식 클래스
	void play() {
    }
}

Parent 클래스의 멤버: age
Child 클래스의 멤버: age, play()

-생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
-자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

class GrandChild extends Child {
}
  • GrandChild는 Child를 상속 받았으므로 age, play()가 자동으로 추가된다.
  • 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.

💡 전체 프로그램을 구성하는 클래스들을 면밀히 설계 분석하여, 클래스간의 상속 관계를 적절하게 맺어 주는 것이 객체지향 프로그래밍에서 가장 중요한 부분

클래스간의 관계 - 포함 관계

상속 외에 클래스를 재사용하는 또 다른 방법은 클래스간에 포함(Composite)관계를 맺어주는 것이다.

포함 전

class Circle {
	int x;
    int y;
    int r;
}

class Point {
	int x;
    int y;
}

포함 후

class Circle {
	Point c = new Point();
    int r;
}

하나의 거대한 클래스를 작성하는 것 보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다.

클래스간의 관계 결정하기

클래스를 작성할 때 상속 관계를 맺어줄 것인지 포함 관계를 맺어줄 것인지 혼란스러울 수 있다.

💡 문장을 만들어보자!
'~은 ~이다.' 라는 문장이 성립한다면, 상속 관계를 맺어준다.
'~은 ~을 가지고 있다.' 라는 문장이 성립한다면 포함 관계를 맺어준다.

예) 원은 점이다. (Circle is a Point)
원은 점을 가지고 있다. (Circle has a Point) -> 성립

단일 상속 (single inheritance)

  • 자바에서는 오직 단일 상속만을 허용한다.
  • 다중 상속을 허용하면 여러 클래스로부터 상속 받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있지만, 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속 받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다.
  • 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중 상속보다 유리하다.

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

  • 모든 클래스 상속 계층도의 최상위에 있는 조상 클래스이다.
  • 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속 받는다.
class Tv {
}
// 컴파일을 하면 컴파일러는 자동으로 extends Object를 추가
class Tv extends Object {
}

toStirng()이나 equals(Object o)와 같은 메서드를 따로 정의하지 않고 사용할 수 있었던 이유는 이 메서드들이 Object 클래스에 정의된 것들이기 때문이다.

0개의 댓글