앤드류 헌트, 데이비드 토마스의 Don't Repeat Yourself를 따 DRY원칙이라고 한다.
중복 코드가 늘어날수록 애플리케이션은 변경에 취약해지고 버그가 발생할 가능성이 높아진다.
중복 코드의 양이 많아질수록 버그의 수는 증가하며 그에 비례해 코드를 변경하는 속도는 점점 더 느려진다.
중복 코드를 제거할 수 있는 방법에는 무엇이 있을까?
대표적인 방법은 상속이다.
그러나! 객체지향에 대한 이해가 깊어지면서 사람들은 코드를 재사용하기 위해 맹목적으로 상속을 사용하는 것이 위험하다는 사실을 깨닫기 시작했다.
상속을 위한 경고
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 사용시 부모의 메소드 대신 실행된다.
상속은 자식 클래스를 점진적으로 추가해서 기능을 확장하는 데는 용이하지만 높은 결합도로 인해 부모 클래스를 점진적으로 개선하는 것은 어렵게 만든다.
상속의 단점을 피하면서도 코드를 재사용할 수 있는 더 좋은 방법 : 합성