본문 바로가기
독서 기록

[오브젝트] 10장 - 상속과 코드 재사용

by 워냥 2024. 6. 16.


1. 개요

중복된 코드를 제거하고 코드를 재사용하고 싶다는 욕망을 가져본 적이 있을 것이다.
이번 장에서는 코드 재사용에 대해 살펴보고 그 기법 중 하나인 상속에 대해 자세히 알아본다.


2. 중복 코드

중복 코드가 안 좋은 이유

중복된 코드는 변경을 방해한다.
요구사항이 변경 됐을 때 중복된 코드가 많다면 그 코드를 모두 수정해야 한다.
각 코드를 수정해도 되는지 일일이 테스트하며 요구사항 변경을 해야 한다.

 

이 때문에 중복 코드가 있으면 코드를 수정하는데 필요한 노력이 몇 배로 증가된다.
어디서 오류가 생길지 모르는 중복된 코드를 변경해야 하기 때문이다.
저자는 중복 코드는 마치 시한폭탄과 같다고 비유할 정도이다.

중복 코드를 판단하는 기준

중복 코드를 판단하는 기준은 의외로 변경이다.
요구사항에 의해 로직을 변경할 때, 두 코드가 한 번에 수정된다면 이는 중복 코드이다.

 

코드의 모양이 유사하다고 해서 모두 중복 코드는 아니다.
다만 중복의 징후일 수는 있다.

중복 코드를 해결하는 방법

가장 기본인 해결 방법은 중복된 코드를 제거하는 것이다.
이를 DRY 원칙이라고 한다.
Don't Repeat Yourself의 첫 글자를 모아서 만든 용어로 '동일한 지식 중복은 하지 않는다'는 의미이다.

 

중복된 코드 제거를 위해 가장 대표적인 기법은 상속이다.
상속을 이용해 중복 코드 제거하는 방법을 알아보자.


3. 상속을 이용한 중복 제거

중복 제거 방법

중복된 코드를 제거하기 위해 반복되는 코드를 하나의 메서드로 만들 수 있다.
그다음 반복되는 코드에서 로직이 달라지는 곳은 타입 코드를 사용해 분기한다.

 

객체지향에서 타입 코드 대신 중복을 관리하기 좋은 방법은 상속이다.

상속을 활용해 반복되는 코드를 줄일 수 있을 것 같다.
하지만 상속에는 여러 단점들이 존재한다.

단점 1. 상속은 결합도를 높인다

상속을 사용하면 부모 - 자식 클래스 사이의 결합도가 높아지게 된다.
부모 클래스의 코드를 그대로 사용하기 때문에 자연스럽게 서로에게 영향을 받게 된다.

 

결합도가 높기 때문에 부모 클래스의 개선이 어렵다.
부모 클래스의 코드를 수정하면 자식 클래스에게 그대로 영향이 가기 때문이다.

 

부모 클래스의 변경이 자식에게 영향을 주는 현상을 취약한 기반 클래스 문제(Fragil Base Class Problem)라고 부른다.
이는 상속을 사용하면 피할 수 없는 문제이다.
객체지향의 근본적인 취약성이라고 볼 수 있다.

 

상속을 사용하면 부모 - 자식 클래스 둘 다 바뀌지 않거나, 둘 다 바뀌어야 한다.

단점 2. 상속은 캡슐화를 낮춘다

자식 클래스에서 부모 클래스의 메서드를 오버라이딩하다가 예상치 못한 동작이 발생할 수 있다.
이런 일을 방지하기 위해 부모 클래스의 코드와 동작 방식을 알고 코드를 작성해야 한다.

 

따라서 부모 클래스의 메서드가 어떻게 동작하는지 문서화가 중요하다.
각 메서드가 어떤 영향을 미치고, 어떤 메서드는 함부로 사용하면 안 되는지 문서로 잘 정리해두어야 한다.

 

하지만 이 문서화 자체가 부모 클래스의 내부 구현을 설명하게 된다.
상속은 내부 구현은 신경 쓰지 않는다는 캡슐화를 저해시킨다.


4. 상속 도입과 한계

상속을 도입할 때 준수할 두 가지 원칙

1. 두 메서드가 유사하면 차이점을 메서드로 추출하라
2. 부모 클래스의 코드를 하위로 내리지 말고, 자식 클래스의 코드를 상위로 보내라

 

두 번째 원칙은 추상화에 의존하는 것을 의미한다.
수정할 클래스가 있을 때, 그 클래스를 추상 클래스로 만들고 하위에 새 클래스를 추가하는 것을 지양해야 한다.
그 클래스의 중복 코드를 새로운 추상 클래스로 만드는 것이 좋다.

상속의 한계

상속은 부모 - 자식 클래스의 결합도가 높다는 단점을 가지고 있다.
이를 해결하기 위해 메서드의 구현 결합을 추상 메서드를 추가하는 방식으로 해결할 수 있다.

 

하지만 인스턴스 변수에 결합되는 것은 해결할 방법이 존재하지 않는다.
때문에 코드 재사용을 위해서는 상속 대신 합성을 선택하는 것이 좋다.


5. 느낀 점

중복 코드 제거와 코드 재사용은 동일한 행동이라는 내용이 인상 깊었다.

중복을 제거하기 위해 코드를 재사용 가능한 단위로 분해하고 재구성
코드 재사용을 위해 중복 코드를 제거하여 하나의 모듈로 모으기

 

기존에는 중복 코드 제거와 코드 재사용이 가독성만을 위한 작업이라고 생각했다.
하지만 가독성 향상 외에도 유연한 설계를 위해 중복 코드 제거는 중요한 작업이었다.

 

책 내용에 나왔던 '변경을 위해 여기저기에서 반복된 코드를 수정하는 것'은 이미 충분히 경험해 보았다.
영향을 받는 부분을 찾고, 변경으로 인한 부수 효과를 잡는 것은 정말 고된 과정이다.

 

코드 작성에서 중복 코드 제거에 신경 쓰는 것이 이런 고된 과정을 줄일 수 있다는 것을 알게 되었다.

댓글