디자인 패턴이란..
1.디자인 패턴의 정의
우선 디자인 패턴이 무엇인지 확실하게 정의할 필요가 있다.
디자인 패턴은 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리
음 간단하게 축약하면 프로그래밍 노하우의 축약체 라고 할 수 있을 것 같다..
2.왜 배우는거지,,?
이 부분이 굉장히 중요하다. 단순히 외우는 것이 아닌 디자인 패턴이 왜 생겨났고 왜 배우는지 알아야 알맞은, 효율적인 방향으로 공부할 수 있다.
- 많은 경우 코드의 유지 보수성, 가독성, 확장성 등을 향상
- 다른 개발자들과 더 잘 소통가능!
디자인 패턴이라는 것 자체가 이미 훌륭한 개발자 분들이 시행착오를 거쳐서 결과론적으로 최선인 것들을 모아놓은 집합이기 때문에 대부분의 상황에서 정답에(적어도 부족한 나의 생각보다는!) 가까울 확률이 높다. 따라서 많은 경우 보수성과 가독성 확장성 면에서 좋다. (그렇다고 정답이라는 것은 아니다! 적절한 상황에 사용하는 것은 개발자의 몪)
또한 소통하기도 좋다!
예를 들면
"어떤 수를 다른 수의 거듭제곱 형태로 나타낼 때, 그 거듭제곱 수의 지수값" 이라고 표현하는 것 보다는 그냥
'로그' 라고 부르는 것이 편하기도 하고, 간결하지 않은가 ? 디자인 패턴이 바로 이 역할을 한다. 대부분의 시니어 개발자 정도 되면 디자인 패턴에 능통하기 때문에.. 더 빠르고 간단한 의사소통 수단으로 사용할 수 있다..
3.그냥 외우면 되는거 아닌가 ??
근시안적인 관점에서 보면 뭐.. 틀린말은 아닐 것이다 외우기만 해도 디자인패턴을 충분히 사용할 수 있다.
그러나 디자인 패턴을 제대로 공부한다면
왜 이렇게 하면 안되고, 왜 이렇게 하는 것이 좋은지 배울 수 있다. 근본적으로 배울 수 있다는 것이다! 이것은 분명히 프로그래머로서의 역량 상승에 큰 도움을 줄 것이다. 앞으로 배울 대부분의 디자인 패턴들은 자주 쓰이는 것들을 모아놓은 것이기 때문에.. 그 효용은 이루말할 수 없을 것이다..
또한 디자인 패턴을 제대로 이해하지 못하고 단순히 사용만 하는 식으로 사용하게 된다면 분명히 특정 상황에서 우를 범하게 된다. 특히 싱글턴처럼 유명하고 편한 패턴들로 도배한다던지.. (싱글턴의 장점은 정말 많지만 그렇다고 모든 상황에서 싱글턴을 사용하면 성능면과 설계면에서 좋지않다.)
4.coupling과 decopling
객체지향의 Solid 원칙을 아는가 ?
물론 나도 전부 완벽히 이해하지는 못했지만 커플링과 디 커플링을 공부하면서 객체지향 5대 원리가 가장 먼저 떠올랐다.
Open - closed principle (개방 폐쇄의 원칙) : 확장에는 열려있고, 변경에는 닫혀있어야한다는 원칙이다.
아래는 개방폐쇄 원칙에 대한 간단한 설명
전자상거래 사이트에서 상품 결제를 처리하는 모듈을 만든다고 가정해본다면 이 모듈은 여러 결제 수단(신용카드, 계좌이체 등)에 따라 다양한 동작을 수행해야한다. 하지만 A 모듈에서는 결제 수단별로 처리하는 코드가 모두 하나의 함수에 작성되어 있다. 만약 A 모듈에 특정 수단을 추가한다고 하면 기존의 코드를 수정해야할 것이다. => 기존의 코드를 수정하게 된다면 잘 사용하고 있던 특정 유저들의 코드를 변경해야할 수도 있다!
이는 원칙을 위반한 것이다.
개방폐쇄 원칙을 적용하면, 결제 수단별로 처리하는 코드를 각각의 함수로 분리하고, 이를 인터페이스를 통해 호출할 수 있도록 구현할 것이다.. 이렇게 함으로써 새로운 결제 수단이 추가될 때마다 새로운 함수를 작성하여 추가할 수 있으며, 기존 함수의 코드를 수정하지 않아도 된다.
커플링과 디커플링의 정의는
-커플링(Coupling)은 소프트웨어 디자인에서 한 모듈이 다른 모듈에 의존하는 정도를 나타내는 지표입니다. 모듈간의 커플링 정도가 높을수록, 한 모듈을 수정할 때 다른 모듈도 함께 수정해야 할 가능성이 높아지므로 유지보수가 어려워집니다. 반대로 커플링 정도가 낮을수록, 한 모듈을 수정할 때 다른 모듈에 미치는 영향이 적어져서 유지보수가 용이해집니다.
-디커플링(Decoupling)은 모듈간의 커플링 정도를 낮추는 방법을 말합니다.
간단하게 말하면 커플링이 높으면 A,B 코드간의 연관성 높은 것이고, 낮다면 A, B코드의 연관성이 낮은 것이다.
Ex)A코드만 읽고 A코드에 대한 이해가 가능하면 디커플링이 된 것이다.
Ex)A코드를 읽기 위해서는 B코드를 이해해야 한다면 커플링의 정도가 높은 것이다.
◆디커플링의 정도가 높은 코드가 설계가 잘 된 코드라고 볼 수 있다.(단 성능도 좋다고 단정할 수는 없다. 아무래도 연관성을 줄이기 위해서 특정 인터페이스나 함수를 매개변수로 넘기는 등의 행동을 한다면,, 성능면에서는 좋지 않을 것이다.)
5. 디자인패턴 짱짱맨?
게임과 같은 프로그램은 변경할 요소가 엄청나게 많다. 게임이 출시되고 이후에 변경되지 않는 경우는 거의 없다.
미래적인 소프트웨어 설계는 확장성을 염두에 두게된다. 확장성을 고려하다보면 정말로 할게 끝도 없이 늘어난다. (확장성의 정도를 끝도없이 넓힌다면 메이플스토리1과 같은 게임이 갑자기 3D게임으로 확장할 경우도 있을 것이다.)
그러나 이와 같은 상황까지 끝도없이 고려하게 된다면 필연적으로 개발 자원의 상승을 가져온다. 시간적으로도, 비용적으로도, 성능적으로도..(인터페이스의 사용은 설계적으로는 좋지만 성능에 좋지 않다. )
결론적으로,
설계를 완벽하게 좋겠지만 현실과 적당히 타협할 필요가 있다..!
'게임공부 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Flyweight Pattern 경량패턴 (0) | 2023.05.18 |
---|---|
[디자인 패턴] 객체 지향 디자인 패턴 1 (1) | 2023.05.15 |
객체 지향 설계 5대 원칙 SOLID (1) | 2023.05.14 |
Design Patterns - 싱글톤(Singleton) (0) | 2023.04.28 |