왜 Override 하지 않는가?!
(Purpose :  / Scope : )


Intro

 얼마전 프로젝트를 하다가 있었던 일입니다.
간단히 이야기하자면, 저희가 개발하는 부분은 서버이고, 접속을 해 오는 클라이언트에 대해서 List 로 관리하고 있었습니다. 그런데 문제가 생겼습니다. 이 놈의 클라이언트(동일한)가 여러번 접속을 시도해 올 수 있다는 것입니다. 그리고 우리가 관리하고 있는 클라이언트 List 에는 중복된 Element 가 들어가면 안되었죠. 그래서 수정을 해야만 했습니다.



Problem

[상황]
 - 서버에 접속을 해 오는 클라이언트 목록을 관리

 [제약조건]
 - 클라이언트 List 에는 클라이언트(Element)가 중복해서 들어가서는 안된다.
 - List 에 Add 하는 부분이 여러곳이다.



Solution

 본래 코드는 다음과 같습니다.


처음 어느 분께서 수정한 코드는 다음과 같습니다.

정말 문제가 많습니다. 지금 예를 든것처럼 Add 하는 부분이 한눈에 보인다면 문제가 없을 것입니다. 만약 Add 를 다른 파일에서도 산발적으로 한다면 어떻게 될까요?? 이런 코드는 다음처럼 수정됩니다.

좀 나아 졌나요? 코드의 중복을 피하기 위해서 별도의 함수로 빼내었습니다. 마찬가지로 문제는 남아 있습니다. 혼자 개발하는 프로젝트라면 사실 상관 없습니다. List 에 바로 Add 하지 않고, 반드시 AddClientToList() 라는 함수를 통해서 Add 해야 한다는 사실을 기억하면 됩니다. 그리고 그 사실을 잊어버리지 않기를 기도하면 됩니다.

 그렇지만 개발은 혼자 하는게 아닙니다. 모든 사람이 위와 같은 규칙을 지켜줄 것이라고 확신할 수 있나요? 그들이 엊어버리지 않을 것이라고 믿으실 건가요? 제가 제안하는 방법은 이렇습니다. 바로 Override!!!

 이런 식으로 ExclusiveList 를 만들고, 이 Class 를 사용하면 됩니다. 물론 Override 할 때, Add() 뿐 아니라 AddRange(), Insert(), InsertRange() 와 같이 List 에 추가하는 메소드는 모두 Override 해 주어야 합니다. 어떤가요? 훨씬 깔끔하고 앞서 나온 방법들처럼 개발에 '규칙'을 필요로 하지 않습니다. 사용하는 사람은 그냥 쓰면 됩니다. 또한 일일이 Add() 하는 코드를 찾아 수정할 필요도 없습니다.


Result

 현업에서 일하다보면, 정말 OOP 를 OOP 답게 쓰는 사람과 반대로 OOP 를 C 스럽게 쓰는 사람을 많이 보게 됩니다. OOP 배울 때, 그렇게 '다형성', '캡슐화', '은닉성' 뭐뭐뭐~~~ 하면서 딸딸딸 외우기만 하고, 왜 정작 활용은 안하나요? 오늘의 넋두리는 여기서 마치겠습니다.