본문 바로가기
반응형

전체 글81

[디자인패턴] 행위 패턴(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.
[디자인패턴] 구조 패턴(1) : 어댑터(Adapter) 목차 어댑터(Adapter) 어댑터 디자인 패턴(Adapter Design Pattern)은 두 개의 호환되지 않는 인터페이스 사이에 다리를 놓는 디자인 패턴이다. 이 패턴은 한 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환한다. 클라이언트에서는 변환된 인터페이스를 사용하여 기존 클래스를 사용할 수 있게 된다. 이러한 방식으로 어댑터는 기존 코드를 변경하지 않고도 새로운 인터페이스와 기존 인터페이스 간의 호환성 문제를 해결한다. 패턴명인 '어댑터'는 일상 생활에서 사용하는 전기 어댑터에서 유래했다. 전기 어댑터는 한 국가의 전기 플러그가 다른 국가의 콘센트와 맞지 않을 때, 두 전기 시스템 간의 호환성을 제공한다. 마찬가지로, 어댑터 디자인 패턴도 서로 호환되지 않는 인터페이스 간의 .. 2024. 3. 24.
[디자인패턴] 생성 패턴(6) : 싱글톤(Singleton) 목차 싱글톤(Singleton) 싱글톤 디자인 패턴은 클래스의 인스턴스가 프로그램 전체에서 단 하나만 생성되어 사용되도록 하는 디자인 패턴이다. 이 패턴의 주된 목적은 한 클래스에 대한 단일 인스턴스만을 생성하고, 그 인스턴스에 대한 전역 접근점을 제공하는 것이다. 패턴명인 "싱글톤(Singleton)"은 '하나의 구성 요소' 또는 '단일체'라는 의미의 영어 단어에서 유래했다. 이는 클래스의 인스턴스가 단 하나만 존재해야 한다는 패턴의 특징을 직관적으로 설명해 준다. 싱글톤 패턴 미적용 예시 싱글톤 패턴을 적용하지 않았을 때의 문제점을 보여주는 C# 코드는 다음과 같다. csharpCopy code class DatabaseConnector { public DatabaseConnector() { // 데.. 2024. 3. 24.
반응형