오브젝트 10장 객체지향 프로그래밍

장현진·2022년 8월 20일
0
post-custom-banner

Ch.10 상속과 코드 재사용

DRY 원칙

  • 중복 코드 : 요구사항이 변경됐을 때 두 코드를 함께 수정해야 하는 코드
  • 중복 코드는 변경을 방해한다.
  • 새로운 코드를 추가하고 나면 언젠가는 변경될 것이라고 생각해야 한다.

앤드류 헌트, 데이비드 토마스의 Don't Repeat Yourself를 따 DRY원칙이라고 한다.

중복 코드가 늘어날수록 애플리케이션은 변경에 취약해지고 버그가 발생할 가능성이 높아진다.
중복 코드의 양이 많아질수록 버그의 수는 증가하며 그에 비례해 코드를 변경하는 속도는 점점 더 느려진다.

중복 코드를 제거할 수 있는 방법에는 무엇이 있을까?
대표적인 방법은 상속이다.
그러나! 객체지향에 대한 이해가 깊어지면서 사람들은 코드를 재사용하기 위해 맹목적으로 상속을 사용하는 것이 위험하다는 사실을 깨닫기 시작했다.

상속을 위한 경고

  • 자식 클래스의 메서드 안에서 super 참조를 이용해 부모 클래스의 메서드를 직접 호출할 경우
    두 클래스는 강하게 결합된다. super 호출을 제거할 수 있는 방법을 찾아 결합도를 제거하라.
  • 상속받은 부모 클래스의 메서드가 자식 클래스의 내부 구조에 대한 규칠을 깨트릴 수 있다. ex) Stack, Vector
    • 사용자들은 우리가 원하는데로 사용하지 않을수 있다. 설계상 사용하지 말아야 할 기능이 있다면 막아야 한다.
  • 자식 클래스가 부모 클래스의 메서드를 오버라이딩할 경우 부모 클래스가 자신의 메서드를 사용하는 방법에 자식 클래스가 결합될 수 있다.

public class InstrumentedHashSet<E> extends HashSet<E> {
    private int addCount = 0;

//    @Override
//    public boolean addAll(Collection<? extends E> c) {
//        addCount += c.size();
//        return super.addAll(c);
//    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        boolean modified = false;
        for (E e : c)
            if (add(e))
                modified = true;
        return modified;
    }
}

의도치 않게 오버라이딩된 자식의 메소드가 super 사용시 부모의 메소드 대신 실행된다.

  • 클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하지 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 둘 중 하나를 선택할 수밖에 없다.

상속은 자식 클래스를 점진적으로 추가해서 기능을 확장하는 데는 용이하지만 높은 결합도로 인해 부모 클래스를 점진적으로 개선하는 것은 어렵게 만든다.

상속의 단점을 피하면서도 코드를 재사용할 수 있는 더 좋은 방법 : 합성

post-custom-banner

0개의 댓글