Home

[OOP] 객체지향 사고 프로세스 Chapter_7. 상속과 합성에 익숙해지기

객체지향 사고 프로세스

객체지향 사고 프로세스

맷 와이스펠드 지음 / 박진수 옮김

JPUB

목차

상속과 합성에 익숙해지기

상속합성은 모두 재사용 매커니즘이다.

상속은 실제 부모/자식 관계가 있는 다른 클래스의 특성과 행위를 상속한다.

합성객체들을 사용해 또 다른 객체까지 작성하는 일까지 포함하는 개념이다.

객체 재사용

상속과 합성이 존재하는 주된 이유는 객체를 재사용하기 위함이다. 상속과 합성을 이용하면 새로운 클래스를 만들수 있는데, 이는 사실상 미리 만들어 둔 클래스를 재사용하기 위한 유일한 방법이다.

객체지향 기술이 처음으로 주류가 되었을 때, 상속은 객체지향에서 시스템 설계에 가장 많이 쓰이는 개념이었지만, 현재 상속은 많은 논쟁거리가 되었다.

부모/자식 관계가 깊어지면 시스템의 복잡성이 크게 증가하기 때문이다. (엘레강트 오브젝트에서는 상속은 클래스의 행동을 확장하지 않고 정제할때 사용하는 것이라 표현하였다.)

상속

is-a 개념으로 설명할 수 있는 것들을 상속관계로 표현 할 수 있다.

하지만 위 개념으로만 클래스를 만들다 보면 부모에 있는 메소드나 상태가 자식에서는 필요 없는 경우가 있다. 이는 상속 트리를 따라 내려가면 내려갈수록 사물들이 더 특수화 된다는 것이다.(일반화-특수화) 책에서는 새라는 클래스에서 fly를 구현할 경우 펭귄, 타조와 같은 클래스일때 fly라는 메소드의 문제점으로 설명 하였는데 이런 경우에는 부모와 자식 중간에 클래스를 하나 더 만들어서 해결 할 수 있다고 말한다. 하지만 위에서 말했다 시피 상속 트리가 깊어질수록 시스템 설계는 복잡해진다.

설계를 할때는 가능한 한 사물들을 단순하게 유지하는 것이 좋으며, 필요한 경우에만 기능을 구현하자. 필요 없는 특징으로 기능을 구현하게 되면 이는 시스템의 복잡도만 늘어난다.

상속이 캡슐화를 약화시키는 방법

캡슐화란 클래스를 공개, 비공개 뿐으로 구분하는 것을 말한다.하지만 상속으로 인해서 외부의 클래스에서는 강력하게 캡슐화가 되지만, 부모/자식 클래스 간에는 캡슐화가 약해지는 경우가 있다.

부모클래스에서 구현부를 상속한 후에 해당 구현부를 변경해 버리면 슈퍼클래스의 변경 내용이 클래스 위계구조를 통해 파급되는 것이다. 즉, 부모 클래스에서 메소드 내용이 변경되면, 자식 클래스에서 예상치 못한 문제가 발생 할 수 있는 것이다. 부모 클래스에서만 수정한 것이 자식 클래스까지 변경을 유도하는 것이다.

이런 문제가 발생 할 수 있기 때문에 상속을 사용할 때에는 엄격한 is-a 조건을 따르는 것이 중요하다.

추상클래스를 이용한 상속

추상 클래스는 상속을 가장 우아하게 사용하는 방식중 하나이다.

추상 클래스로는 구체적이지 않는 클래스를 의미하는데, abstract 키워드를 이용해 구현한다.

// Main.java
public class Main
{
  public static void main(String[] args) {
    // Test test = new Test(); 추상 클래스는 인스턴스화 할 수 없어 에러가 발생
    Child c = new Child();

    System.out.println(c.minus(20, 10));
    // System.out.println(c.add(10, 20)); 해당 메소드를 Child Class에서 구상화 하지 않아서 에러가 발생한다.
  }
}

// Test.java
public abstract class Test {
    public abstract int add(int a, int b);
    
    public int minus(int a, int b) {
        return a - b;
    }
}

// Child.java
public class Child extends Test {
    
}

추상 클래스만으로는 인스턴스화 할수 없지만이를 상속을 통해서 사용하게 된다면 추상 클래스를 상속받는 자식 클래스에서는 해당 메소드를 구현해줘야 한다(add 메소드). 즉, 자식 클래스마다 구현부를 별도로 둬야 하는데 이를 통해서 다형성이 필요한 경우 구현할 수 있다.

합성

has-a 개념으로 설명할 수 있는 것들을 합성관계라고 표현 할 수 있다.

특정 객체가 다른 객체로 합성되고, 해당 객체가 객체 필드로 포함될 때마다 새 객체를 복합체(compounds)난 응집체(aggregates) 또는 컴포지션(composites)인 객체라 한다.

합성도 상속과 마찬가지로 많이 합성하면 합성할수록 복잡해지는 것은 똑같다.

정리

존경받는 객체지향 설계자들은 될 수 있으면 기본적으로 합성을 사용하면서 필요할 때만 상속을 사용한다 말한다.

합성과 상속을 상황에 맞춰 적절하게 사용하는 것이 좋다.


위 정리글은 객체지향 사고 프로세스에서 인용한 것입니다.

[ISBN 979-11-90665-21-6]

Loading script...