오브젝트 - 10. 상속과 코드 재사용

강준혁·2022년 9월 18일
0

오브젝트

목록 보기
11/14
post-thumbnail

상속과 중복코드

중복 코드의 기준

중복 코드는 변경을 방해한다.
중복 코드는 코드를 수정하는데 필요한 노력을 몇 배로 증가시킨다.

중복 여부를 판단하는 기준은 변경이다.
요구사항이 변경됐을 때 두 코드를 함께 변경해야 한다면 중복이다.
모양이 유사하다는 것 만으로 중복은 아니다.

신뢰할 수 있고 수정하기 쉬운 SW를 만드는 방법 중 하나는 중복을 제거하는 것이다.

상속을 이용한 중복코드 제거

상속의 기본 아이디어는 이미 존재하는 클래스와 유사한 클래스가 필요하다면 코드를 복사하지말고 상속을 이용해 재사용하라는 것이다.

하지만 상속을 염두에 두고 설계되지 않은 클래스를 상속을 이용해 재사용하는 경우, 부모 클래스의 개발자가 세웠던 가정이나 추론과정을 정확히 이해해야 한다.

즉, 자식 클래스가 부모 클래스의 구현에 강하게 결합될 수 있다.

취약한 기반 클래스 문제

부모 클래스의 변경에 의해 자식 클래스가 영향을 받는 현상을 취약한 기반 클래스 문제라고 한다.

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

객체를 사용하는 이유는 세부사항을 퍼블릭 인터페이스 뒤로 캡슐화할 수 있기 때문이다.

상속을 사용하면 부모 클래스의 퍼블릭 인터페이스가 아닌 구현을 변경하더라도 자식 클래스가 영향을 받기 쉬워진다.

객체지향의 기반은 캡슐화를 통한 변경의 통제이나, 상속은 코드의 재사용을 위해 캡슐화의 장점을 희석시키고 구현에 대한 결합도를 높인다.

불필요한 인터페이스 상속 문제

class A {
  method1() {}
  method2() {}
}

class B extends A {
  method3() {
    super.method1();
    ...
  }
}

위처럼 클래스 A의 method1 의 재사용을 위해서 B 클래스가 A를 상속하여 사용하는 경우, B클래스는 불필요한 method2() 까지 퍼블릭 인터페이스로 가지게 된다.

메서드 오버라이딩 오작용 문제

자식 클래스가 부모 클래스의 메서드를 오버라이딩 할 경우 부모 클래스가 자신의 메서드를 사용하는 방법에 자식 클래스가 결합될 수 있다.

부모/자식 클래스의 동시 수정 문제

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

올바른 상속의 사용

추상화에 의존하자

  • 두 메서드가 유사하게 보인다면 차이점을 메서드로 추출하라. 메서드 추출을 통해 두 메서드를 동일한 형태로 만들 수 있다.
  • 부모 클래스의 코드를 하위로 내리지 말고 자식 클래스의 추상적인 메서드를 부모클래스로 올리는 것이 재사용성과 응집도 측면에서 더 뛰어난 결과를 얻을 수 있다.

상속 계층이 코드를 진화시키는데 걸림돌이 된다면 추상화를 찾아내고 상속 계층 안의 클래스들이 그 추상화에 의존하도록 코드를 리팩터링 하라.

상속이 코드 재사용이라는 측면에서 매우 강력한 도구인 것은 사실이지만 잘못 사용할 경우에 돌아오는 피해 또한 크다는 사실을 인지하라.

상속의 오남용은 애플리케이션을 이해하고 확장하기 어렵게 만든다.
정말로 필요한 경우에만 상속을 사용하라.

profile
백엔드 개발자

0개의 댓글