본문 바로가기

디자인패턴26

[디자인패턴] 행위 패턴(3) : 인터프리터(Interpreter) 목차 인터프리터(Interpreter) 인터프리터 디자인 패턴은 주어진 언어에 대해 그 언어의 문법에 대한 표현을 정의하고, 이를 사용하여 해당 언어의 문장을 해석하는 패턴이다. 이 패턴의 어원은 프로그래밍 언어의 '인터프리터'에서 비롯되었다. 인터프리터란 코드를 직접 실행하는 프로그램이나 환경을 의미하는데, 이 패턴은 이러한 개념을 디자인 패턴에 적용한 것이다. 즉, 어떤 입력을 받아 이를 분석하고 실행하는 구조를 디자인 패턴 형태로 구현한 것이다. 컴퓨터가 입력받은 수식을 트리 형태로 만들고 후위 연산을 적용해 실행시키는 것과 마찬가지로 식을 만들어두고 저장했다가 하나씩 실행하는 상황에 사용하면 적합하다. 패턴 미적용 예시 C#을 사용한 간단한 게임 개발 상황에서 인터프리터 패턴을 적용하지 않은 경우.. 2024. 3. 25.
[디자인패턴] 행위 패턴(2) : 커맨드(Command) 목차 커맨드(Command) 커맨드 디자인 패턴은 행동 디자인 패턴의 한 종류로, 요청 자체를 캡슐화하는 방식이다. 이 패턴의 목적은 요청을 발생시키는 객체와 요청을 처리하는 객체 사이의 결합도를 줄이는 것이다. 이를 통해 요청을 큐에 저장하거나, 로그로 기록하고, 작업을 취소할 수 있는 유연성을 제공한다. "커맨드(Command)"라는 용어는 말 그대로 '명령'을 의미한다. 이 패턴에서 '명령'은 수행될 모든 동작(작업)을 객체로 캡슐화하는 것을 말한다. 객체 지향 프로그래밍에서는 이러한 명령을 객체의 형태로 표현하여, 실행할 작업과 관련된 모든 정보를 함께 묶어 관리한다. 패턴 미적용 예시 코드 게임 개발에 있어서, 커맨드 패턴을 적용하지 않고 직접 객체의 메소드를 호출하여 명령을 수행하는 방식은, .. 2024. 3. 25.
[디자인패턴] 행위 패턴(1) : 책임 연쇄(Chain of Responsibility) 목차 책임 연쇄(Chain of Responsibility) 책임 연쇄 디자인 패턴은 행동 패턴의 하나로, 요청을 처리할 수 있는 기회를 여러 객체에게 부여함으로써 객체 간의 결합도를 줄이는 데 목적이 있다. 이 패턴은 요청을 보내는 쪽과 이를 처리하는 쪽을 분리하고, 여러 객체를 연결하여 요청을 처리할 수 있는 체인을 형성한다. 어떤 객체가 요청을 처리할 수 없을 때는 다음 객체로 요청을 전달한다. 이 패턴의 이름은 실제로 책임을 연쇄적으로 전달한다는 점에서 유래했다. 패턴 미적용 예시 코드 게임 개발에서 책임 연쇄 패턴을 적용하지 않은 상황을 가정해보자. 예를 들어, 게임 내에서 캐릭터가 다양한 유형의 아이템을 사용하는 상황에서 각 아이템 유형별로 처리 로직을 갖는 경우다. public class I.. 2024. 3. 25.
[디자인패턴] 구조 패턴(7) : 브릿지(Bridge) 목차 브릿지(Bridge) 브릿지 디자인 패턴은 구조 패턴의 하나로, 추상화(abstraction)와 구현(implementation)을 분리해서 둘 사이의 결합도를 낮추는 데 목적을 둔다. 이렇게 하면 두 구성 요소를 독립적으로 확장할 수 있게 되어, 코드의 유연성과 재사용성이 증가한다. 패턴명인 "브리지"는 물리적인 다리가 두 지점을 연결하는 것처럼, 이 패턴이 추상화와 구현 사이를 연결한다는 의미에서 유래되었다. 패턴 미적용 예시 게임 개발 시나리오에서, 다양한 유형의 캐릭터가 있고 각각 다른 무기를 사용한다고 가정해보자. 다음은 패턴 없이 캐릭터와 무기 간의 관계가 직접적으로 구현된 모습이다. // 캐릭터 클래스 class Character { public string Name { get; set.. 2024. 3. 25.
[디자인패턴] 구조 패턴(6) : 데코레이터(Decorator) 목차 데코레이터(Decorator) 데코레이터 디자인 패턴은 객체의 수정 가능한 행위를 동적으로 확장할 수 있는 구조적 디자인 패턴이다. 기본적으로 이 패턴은 객체에 추가적인 책임이나 행위를 런타임에 첨가하는 것을 가능하게 한다. 이 패턴의 이름은 '장식'이라는 뜻의 '데코레이터'에서 유래했다. 소프트웨어 개발에서 이 패턴을 사용함으로써 기존 코드를 수정하지 않고도 객체의 기능을 유연하게 확장할 수 있다. 패턴 미적용 예시 게임에서 캐릭터의 무기 업그레이드를 하는 경우를 생각해 보자. 다음 예시에서는 새로운 속성을 추가할 때마다 별도의 클래스를 생성해야 하며, 다양한 속성의 조합을 지원하기 위해서는 클래스의 수가 기하급수적으로 늘어난다. // 기본 무기 클래스 class BasicWeapon { publ.. 2024. 3. 25.
[디자인패턴] 구조 패턴(5) : 파사드(Facade) 목차 파사드(Facade) 파사드(Facade) 디자인 패턴은 복잡한 시스템을 더 간단한 인터페이스로 제공하려는 목적을 가진 구조적 디자인 패턴이다. '파사드'라는 단어는 프랑스어로 '외관' 또는 '정면'을 의미하는데, 건축학에서 건물의 전면을 지칭하는 용어로 사용된다. 이 패턴의 핵심은 시스템의 복잡성을 감추고, 클라이언트가 시스템에 더 쉽게 접근할 수 있도록 단순화된 인터페이스를 제공하는 것이다. 기본 구성 요소 파사드(Facade): 클라이언트에게 간단한 인터페이스를 제공한다. 복잡한 시스템(Complex System): 여러 서브 시스템으로 구성된 복잡한 시스템이다. 파사드는 이 시스템의 기능에 쉽게 접근할 수 있는 인터페이스를 제공한다. 패턴 미적용 코드 예시 게임의 여러 설정(예: 그래픽, 사.. 2024. 3. 25.
[디자인패턴] 구조 패턴(4) : 플라이웨이트(Flyweight) 목차 플라이웨이트 (Flyweight) 플라이웨이트(Flyweight) 디자인 패턴은 객체의 효율적인 공유를 통해 대량의 작은 객체들이 사용될 때 발생하는 메모리 사용량을 최소화하는 구조적인 패턴이다. 이 패턴의 목적은 공유를 통해 대량의 객체들 사이에서 발생할 수 있는 불필요한 데이터의 중복을 줄이는 것이다. 플라이웨이트 패턴의 이름은 '가벼운' 혹은 '무게가 거의 없는'이라는 의미의 'Flyweight'에서 유래되었다. 이는 패턴이 객체의 메모리 사용량을 최소화하여 마치 객체가 '가벼워진' 것처럼 만든다는 개념을 반영한다. 패턴 미적용 예시 C#으로 작성된 코드에서 플라이웨이트 패턴을 적용하지 않았을 경우, 객체를 매번 새로 생성하게 되어, 동일한 정보를 가진 객체가 중복해서 메모리에 할당될 수 있다.. 2024. 3. 25.
[디자인패턴] 구조 패턴(3) : 프록시(Proxy) 목차 프록시(Proxy) 프록시(Proxy) 디자인 패턴은 구조적 디자인 패턴의 일종으로, 어떤 다른 객체에 대한 접근을 제어하기 위해 그 객체의 대리자 또는 자리표시자를 제공한다. 이 패턴의 목적은 접근 제어, 비용이 많이 드는 연산의 지연 실행, 네트워크 연결 등의 문제를 해결하는 것에 있다. 패턴명의 어원 "프록시"라는 용어는 대리인이나 대변인을 의미하는 'Proxy Agent'에서 유래했다. 즉, 어떤 객체 대신해서 일을 처리하는 객체를 말한다. 프록시 객체는 실제 객체와 같은 인터페이스를 구현함으로써, 클라이언트가 실제 객체를 직접 호출하는 것처럼 느끼게 하면서도 추가적인 기능(예: 접근 제어, 지연 로딩 등)을 제공한다. 패턴 미적용 예시 코드 먼저, 프록시 패턴을 적용하지 않은 간단한 예시를.. 2024. 3. 24.
[디자인패턴] 구조 패턴(2) : 컴포지트(Composite) 목차 컴포지트(Composite) 컴포지트 디자인 패턴은 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현하는 디자인 패턴이다. 이 패턴은 사용자가 개별 객체와 객체의 조합을 동일하게 다룰 수 있도록 해준다. 컴포지트 패턴의 명칭은 영어 단어 'Composite'에서 유래했으며, 이는 '여러 요소를 조합하여 전체를 만드는 것'을 의미한다. 컴포지트 패턴 미적용 예시 먼저, 컴포지트 패턴을 적용하지 않았을 때의 문제를 드러내는 예시 코드를 살펴보자. 파일과 폴더를 다루는 시스템을 만든다고 했을 때, 각각을 다루는 클래스를 별도로 구현해야 한다. // 파일 클래스 class File { public string Name { get; set; } public void Display() => Console... 2024. 3. 24.