글의 순서

  1. if-else의 문제점
  2. OCP (Open Close Principle)
  3. 전략 패턴 (Strategy Pattern)

이번에 OCP와 전략패턴에 대해서 설명하려고 합니다. 자세한 이론적인 이야기 보다는 코드와 함께 가볍게 설명하면서 대충 이런거구나 느낄 수 있는 정도로만 소개하겠습니다. 자세한 이론은 참고할만한 링크를 남기겠습니다.

왜 OCP인가? 이해하기 위해서 먼저 if-else의 문제점을 파악하고 가겠습니다.
프로그래밍을 하다 보면 if 문을 많이 사용합니다. 하지만 if 문을 사용하면 몇 가지 문제점이 있습니다.

1. If-else의 문제점

  • 변경, 확장이 될 수록 코드가 복잡해져서 수정할 위치를 찾기가 어렵다.
  • 실수로 추가하지 않고 누락하는 경우가 생긴다.

즉, 유지보수가 점점 어려워집니다.

코드와 함께 하나씩 확인해 보겠습니다.
코드의 예시는 로또 번호를 자동으로 생성해주는 클래스로 예시를 들겠습니다.

2. 계속 되는 확장으로 복잡해지는 코드

2.1 최초의 코드

image.png

로또 번호를 랜덤으로 생성해주는 클래스입니다.
1~45까지 List에 담아서 Collection.shuffle()로 섞어준 뒤에 6개의 숫자 리스트를 반환해줍니다.
Collection.shuffle() 때문에 테스트가 불가능하다는 것 빼고는 현재까지는 깔끔하고 큰 문제가 없어보입니다.

2.2 기능 추가

image.png

시간이 지남에 따라 기능이 추가되었습니다. 랜덤뿐 아니라 1 ~ 6만 뽑기 위한 sort()와 45~40만 뽑기 위한 reverse()도 추가되었습니다. 기능 추가를 위해서 if-else를 사용했는데요. 처음에는 if-else 블록이 크지 않기 때문에 이 방법으로 빠르게 구현해 나갈 수 있습니다.

2.3 계속 되는 기능 추가

image.png
계속해서 기능이 추가되면서 if-else가 늘어났습니다. 현재는 하나의 if 문에 코드가 2~3줄이지만 만약에 더 길다면 어떨까요? 기하급수적으로 몇백 줄, 몇천 줄까지 늘어날 수도 있습니다.
정리하자면.

  • If-else 블록이 점점 커져서 수백 줄 이상으로 빠르게 증가
  • 코드가 복잡해진다.
  • 추가하거나 수정할 위치를 찾는데 점점 오랜 시간이 걸린다.

3. 누락하는 사고 발생

image.png
또 다른 상황을 보겠습니다. 같은 기능을 하는 로직을 A, B, C 세 곳에서 사용하고 있습니다. 이런 일이 없을 거 같지만, 빠르게 구현하기 위해서 copy&paste를 하는 경우가 있습니다.

if-else에 기능이 추가되거나 변경되면 전부 수정해줘야 합니다. 문제는 전부 적용을 하지 않고 실수로 하나를 빠뜨리는 사고가 발생할 때입니다. 컴파일 단계에서 찾는다면 다행이지만, 문제는 런타임 상황에서 발생할 수도 있다는 것입니다.

if-else의 문제점을 마지막으로 한번 더 말하면

  • 변경, 확장이 될 수록 코드가 복잡해져서 수정할 위치를 찾기가 어렵다.
  • 실수로 추가하지 않고 누락하는 경우가 생긴다.

if-else를 많이 사용하면 유지 보수가 어렵다.

다음글 : OCP (개방 폐쇄의 원칙 : Open Close Principle)