디자인 패턴
코딩을 하다보면 자연스럽게 디자인 패턴에 대해 한번쯤은 들어본 적이 있을 것이다.
몇년전에 들을때마다 이렇게 코드를 짰더니 좋더라~ 저렇게 코드를 짰더니 보기 편하더라~
음 그렇구나 하는 느낌으로 그런게 있는가 보다 하고 넘어갔었는데
점점 코드를 짤 일이 많아지고 프로젝트가 무거워지면서
자발적으로 다시 디자인 패턴에 대해 공부할 필요성을 느끼기 시작한다.
디자인 패턴에 대해 공부할 필요성을 느끼지 못하는 사람들은
엄청난 천재이거나 제대로 된 프로젝트를 해보지 않은 사람이라고 생각한다.
디자인 패턴이란, 쉽게 말해 코드를 효율적으로 짜는 방법이다.
여기서 말하는 효율적이란, 성능상의 효율적이라기 보다는
유지보수, 가독성, 협업 등의 효율이라고 생각하면 되겠다.
언어, 프레임워크에 거의 관계없는 순수 코드에 대한 방법론이다.
코드 짜는 방법? 그냥 짜면 되지 않나?
이해를 돕기 위해 코드로 살펴보자
배열의 요소들을 다 출력해야하는 작업을 코드로 짠다고 생각해보자.
List<int> list = new List<int>();
// 1번 방식
for(int i=0; i<list.Count; i++)
print(list[i]);
// 2번 방식
foreach(var item in list)
print(item);
1번 방식을 선호하는 사람도 있을것이고, 2번 방식을 선호하는 사람도 있을 것이다.
둘 다 충분히 쓰일 수 있는 코드고 섞어서 쓰는 사람들도 많을 것이다.
이때 디자인 패턴이란 예시로 든 두 가지의 코드중에 수십년간, 수 많은 사람들이 직접 프로젝트에 도입해보고
리팩토링을 해보고 다른 코드랑 연결을 시켜봤더니 더 괜찮았던 방식이다.
왜 널리 알려진 디자인 패턴을 공부하고 사용해야 할까?
첫 번째로, 수십년간 검증된 구조이고 많은 사람들이 시행착오 끝에 이런 상황일때는 이런식으로 코드를 짰더니
더 좋았던 것 같다라고 결론 지은 하나의 구조이기 때문이다.
사람마다 그 사람에게 고착된 선호하는 코딩스타일이 있을 수 있다.
디자인 패턴은 개인이 아닌 여러 사람들이 많은 시간과 노력을 들인 끝에 고착화된 패턴이다.
두 번째로, 프로젝트에서 의사소통에 필요한 비용을 줄일 수 있다.
위의 예시를 다시 가져와서, 1번 방식을 도입하기로 결정 혹은 논의할 때,
배열 인덱스를 iterate할 변수는 int 형 i로 하고 초기값은 0이 되겠고,
배열 크기 - 1 까지만 1씩 후위증가 하는 식으로 배열내의 원소를 전부 print 할게요
이렇게 말하는것과 그냥 1번방식으로 하면 어떨까요?
이렇게 말하는것의 차이는 분명하다.
물론 예시로 든 코드가 너무 간단하고 짧은 코드여서 조금 억지스러워 보일 수 있지만
실제로 클래스 및 인터페이스를 설계하고 구현하는 코드는 훨씬 길고 복잡하기 때문에
이를 한마디로 정의하는 별칭이 있다면 쉽게 설명할 수 있다.
이로써 말하는사람도, 듣는사람도 해당 디자인 패턴을 알고만 있다면 의사소통이 쉬워져
같은 목표에 손쉽게 도달할 수 있다.
물론 손쉽진 않겠지만,,,
마지막으로, 각 디자인 패턴을 공부하고 나중에 자신의 코드에 입히다 보면
왜 이런 디자인 패턴이 필요했고 이 안에 담겨진 개발자의 철학은
무엇인지를 자연스럽게 생각하게 되어 사고가 유연해지고 코딩 실력이 좀 더 늘어날 것이다.
디자인 패턴은 만능인가?
디자인 패턴에 대해 좋은점만 써놓은 것 같은데
물론 단점도 있을 수 있다. 오랜기간동안 검증을 받은 구조라고 해도
워낙에 빠르게 바뀌는 프로그래밍 세계에서 해당 패턴이 과연 아직 유효한가?라는 생각이 든다.
디자인 패턴은 프로그램을 위한 코드를 당장에 만드는것보다,
프로그램이 완성된 이후 유지보수 및 리팩토링을 위한 방법론이다.
생각해보자, 단순히 과제나 토이 프로젝트가 아닌 실무 프로젝트는
만드는시간보다 위에 말한 유지보수 하는 기간이 더 길며 더 많은 노력을 쏟을 수 밖에 없다.
누구나 다 자기 코드를 나중에 고칠일이 있을 때, 손도 대기 싫었던 경험이 있을 것이다.
디자인 패턴은 리팩토링을 쉽게 해주는 도구라고 생각하면 될것 같다!
'Programming > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 5. 싱글턴 패턴 (0) | 2022.03.22 |
---|---|
[디자인 패턴] 4. 팩토리 패턴 (0) | 2022.03.17 |
[디자인 패턴] 3. 데코레이터 패턴 (0) | 2022.03.17 |
[디자인 패턴] 2. 옵저버 패턴 (0) | 2022.03.10 |
[디자인 패턴] 1. 스트래티지 패턴 (0) | 2022.03.10 |