- Today
- Total
작심삼일
1주차. 디자인 패턴이란? 본문
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
나쁜 코드란 무엇인가
좋은 코드란 직관적으로 이해할 수 있는 코드다. 그럼 나쁜 코드란 무엇일까? 나쁜 코드라는 것은 수많은 예시가 있지만 한마디로 정리하자면 한눈에 들어오지 않거나 설명이 많이 필요한 코드라고 생각한다. 구체적으로 생각해보면 여러 가지가 있을 수 있다.
첫째, 이름을 직관적으로 짓지 않는다.
흔히 코딩을 하다보면 나만 아는 이름이나 편한 이름으로 변수명을 짓는 경우가 많다. 혹은 함수명을 정해두고 코딩을 하고 있는데 어쩌다보니 점점 그 함수가 하는 일이 많아지기도 한다. 이런 경우 모두 타인이 봤을 때 그 코드를 이해하는 데 시간이 많이 걸리게 된다. 전자의 경우에 대한 예시를 들어보면 다음과 같다. 아래 두 코드를 비교해보면 첫번째 코드는 주석을 읽은 후에야 변수의 의미를 파악하지만, 두번째 코드는 변수명을 보고 그 변수의 의미를 바로 파악할 수 있다.
x = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 각 달마다 존재하는 일 수
↑ 코드 1 ↓ 코드 2
daysOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
후자에 대한 예시는 아래와 같다. 둘 다 더하는 기능을 하는 함수를 만들었다. 하지만 만들고 보니 두 수의 합을 10으로 thresholding하고 싶어져 이 기능을 add 함수에 넣은 것이 두번째 코드다. 두번째 코드는 add 함수가 본연의 기능인 '더하기' 외에 'threshold'라는 기능도 더해져 함수명과는 다른 기능을 하게 된다.
def add(a, b):
return a + b
↑ 코드 3 ↓ 코드 4
def add(a, b):
if a + b > 10:
return 10
else:
return a + b
둘째, 재사용성이 낮다. & 중복성이 높다.
자주 쓰이는 함수를 만들어두면 같은 코드를 반복해서 사용하는 일이 없다. 두 수의 합을 구하는 일이 계속 필요하다할 때, 코드 4와 같은 함수는 다시 사용하기 어렵기 때문에 결국 코드 3과 같은 함수를 다시 짜는 일이 발생한다. 이렇게 재사용성이 낮은 함수나 코드들이 많아지만, 같은 내용이 반복되므로 쓸데없이 코드가 길어진다.
셋째, 의존성이 높다.
의존성이 높은 코드는 하나를 수정하려할 때 다른 것도 많이 수정해야 한다. 이런 경험은 코딩을 하는 사람이라면 누구나 겪었을 것이다. 버그를 수정하려고 코드를 건들이기 시작했는데 예상하지 못한 곳에서 다른 버그가 일어나고, 또다른 버그가 일어나고....
디자인 패턴이란 무엇인가
디자인 패턴이라는 단어가 '디자인'이라는 단어와 '패턴'이라는 단어로 나누어 생각해보면 그 의미를 어렴풋하게 알 수 있다. '디자인'이라는 것은 원하는 목적을 실체화하는 것이다. '패턴'은 반복되는 것을 의미한다. 두 의미를 합쳐 생각해보면 디자인을 할 때 반복되는 부분들을 디자인 패턴이라 하고, 이런 패턴들을 가지고 있으면 후에 같은 패턴이 필요할 때 재사용할 수 있다고 생각했다.
GoF의 디자인 패턴에 따르면 디자인 패턴이란 '특정한 전후 관계에서 일반적 설계 문제를 해결하기 위해 상호교류하는 수정 가능한 객체와 클래스들에 대한 설명'이다. 책에서 말을 어렵게 써놨는데, 위 문단에 써놓은 내가 직관적으로 이해한 것과 같은 맥락이다.
디자인 패턴은 다음 4가지 요소로 이루어져있다. 이렇게 써놓으면 거창하지만 실제로 보면 어려운 개념이 아니다. 모두 당연한 얘기들이다.1. 이름: 설계 의도 표현2. 문제: 언제 사용하는가3. 해법: 설계 구성 요소들간의 관계4. 결과: 패턴 적용 시 얻는 결과와 장단점
왜 디자인 패턴을 사용하는가
수능을 준비하기 위해 모의고사를 풀 때 유형별로 문제를 분류할 수 있다. 각 문제가 어떤 유형인지 알면 풀기 더 쉽다. 디자인 패턴은 이런 '유형'과 같다고 본다. 어떤 패턴을 이용하면 더 쉽게, 직관적으로 코딩을 할 지 알 수 있다. 같은 유형의 문제를 해결할 때 이전에 짜놓은 패턴이 있으면 이를 재사용할 수 있다. 또한, 패턴에는 이름이 있으니 코드 리뷰를 진행할 때 어떤 패턴을 사용했는지 말하면 커뮤니케이션이 더 원활히 진행될 것이다.
My Opinion
전자과에서 딥러닝을 공부하며 나름 프로그래밍 쪽 전공을 했지만 컴퓨터 공학자들보다 이런 부분이 약한 것 같아 시작했다. 디자인 패턴을 공부하고 실제로 사용할 수 있으면 내 코드가 더 깔끔해질 것이라는 기대를 한다. 하지만 늘 그랬듯이 이론을 공부하는 것은 쉽지만 이를 실제로 사용하는 일은 어렵다. 코딩 습관도 습관이라고 하루아침에 바뀌지 않을 테니 한번에 바뀌려는 생각보다 한가지씩 바뀌려는 마음가짐으로 공부를 시작한다.
'스터디 > 디자인 패턴' 카테고리의 다른 글
4주차-2. Template Method (0) | 2021.05.13 |
---|---|
4주차-1. Prototype (0) | 2021.05.13 |
3주차-2. Singleton (0) | 2021.04.30 |
3주차-1. Factory Method (0) | 2021.04.30 |
2주차. Abstract Factory Pattern (추상 팩토리 패턴) (0) | 2021.04.22 |