본문 바로가기

TIL

[TIL]2024-2-23 / 43일차 - 디자인 패턴

 

1. 오늘의 알고리즘 코드카타 - 푸드 파이트 대회

 

답안 : 

//문제 설명 길이가 슬슬 과하다
//결국 양 선수 같은 양의 음식과 종류를 주는 것
//물 = 0은 항상 중간에 1회
//즉 2로 나눈 뒤 물까지 가는 수를 구하고 이를 뒤집어서 0 이후 더하면 같은 결과
//그렇기에 첫 for문에서 food의 갯수만큼 i를 돌려주고 나온 수를 2로 나누어주면 절반 완성

using System;
using System.Linq;

public class Solution {
    public string solution(int[] food) {
       string answer = "";
        string str = "";
        
        for(int i = 1; i < food.Length; i++)
        {
            for(int j = 0; j < food[i] / 2; j++)
            {
                answer += i.ToString();
            }
        }
        //Concat = string 연결 / reverse로 뒤집기
        str = String.Concat(answer.Reverse());
        return answer + "0" + str;
    }
}

 


 

2. 오늘의 공부

 

디자인 패턴이란?

디자인 패턴은 모듈의 세분화된 역할이나 모듈들 간의 인터페이스 구현 방식을 설계 할 때 참조할 수 있는 전형적인 해결 방식을 말한다.

 

 

Observer Pattern (옵저버 패턴)

설명:

옵저버 패턴은 객체 간의 일대다 종속성을 정의하는 디자인 패턴입니다. 주체(subject) 객체의 상태가 변경되면, 이를 관찰자(observer) 객체들에게 알리고 자동으로 상태를 업데이트할 수 있습니다.

 

예시:

유니티에서는 게임 내 이벤트를 관리하고 다루는 데 옵저버 패턴을 활용할 수 있습니다. 예를 들어, 플레이어가 점수를 획득할 때마다 다양한 시스템들이 이를 감지하고 반응할 수 있습니다.

 

주체(Subject)가 관찰자(Observer)에 대한 리스트를 관리하고, 상태 변경 시에 모든 관찰자들에게 알립니다. 관찰자는 주체에 연결되어 있으며, 주체의 상태가 변경될 때마다 업데이트를 받습니다.

이런 방식으로, 유니티에서는 플레이어의 상태 변화, 게임 이벤트 등을 감지하고 이에 따른 다양한 시스템들을 자동으로 업데이트할 수 있습니다.

 

 

Singleton Pattern (싱글톤 패턴)

설명:

싱글톤 패턴은 어떤 클래스가 오직 하나의 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근 지점을 제공하는 디자인 패턴입니다.

 

예시:

유니티에서는 게임 전반에 걸쳐 전역적으로 접근해야 하는 매니저 클래스 등을 싱글톤으로 구현할 수 있습니다. 예를 들어, 사운드 매니저 또는 게임 매니저 등이 있습니다.

 

 

Factory Method Pattern (팩토리 메서드 패턴)

설명:

팩토리 메서드 패턴은 객체 생성을 서브 클래스에 위임하여 객체의 유형을 결정하는 디자인 패턴입니다.

 

예시:

유니티에서는 적 캐릭터, 아이템, 파티클 시스템 등과 같은 게임 객체를 생성할 때 팩토리 메서드 패턴을 활용할 수 있습니다.

 

EnemyFactory 클래스를 통해 적 캐릭터를 생성하고, OrcFactory 및 GoblinFactory 클래스에서 각각 오크와 고블린 적 캐릭터의 생성 방법을 구체화했습니다.

이를 통해 유니티에서는 게임 객체의 생성을 보다 유연하게 다룰 수 있으며, 새로운 적 캐릭터나 아이템을 추가할 때 코드 수정을 최소화할 수 있습니다.

 

 

Command Pattern (커맨드 패턴)

설명:

커맨드 패턴은 요청을 객체로 캡슐화하여 매개변수화하고, 메서드 호출, 연산 수행 또는 작업을 지연할 수 있는 디자인 패턴입니다.

 

예시:

유니티에서는 키보드나 마우스 입력 등과 같은 사용자 입력을 커맨드로 캡슐화하여 게임 내 동작을 구현할 수 있습니다.

 

사용자의 키보드 입력을 커맨드로 캡슐화하여 실행하는 방법을 보여줍니다. InputHandler 클래스는 사용자 입력을 받아서 해당하는 커맨드를 실행하고, 커맨드는 실행될 때 Player 클래스의 Jump 메서드를 호출합니다.

 

이러한 방식으로 유니티에서는 사용자 입력에 따라 게임 동작을 유연하게 관리할 수 있습니다. 새로운 동작을 추가하거나 기존 동작을 변경할 때, 해당 커맨드만 수정하면 되므로 유지보수가 용이합니다.

 

 

Composite Pattern (컴포지트 패턴)

설명:

컴포지트 패턴은 객체들을 트리 구조로 구성하여 단일 객체와 복합 객체를 동일하게 다룰 수 있게 해주는 디자인 패턴입니다.

 

예시:

유니티에서는 게임 객체들의 계층 구조를 관리하거나 UI 요소들을 그룹화하는 데 컴포지트 패턴을 활용할 수 있습니다.

게임 객체들을 계층 구조로 효과적으로 구성하고, 단일 객체와 그룹화된 객체를 동일하게 다룰 수 있습니다. 예를 들어, 게임 오브젝트의 변환(Transform)을 부모-자식 관계를 이용하여 효율적으로 관리할 수 있습니다.

 

 

 

State Pattern (스테이트 패턴)

설명:

스테이트 패턴은 객체의 내부 상태에 따라 객체의 행동을 변경할 수 있게 해주는 디자인 패턴입니다.

 

예시:

유니티에서는 게임 캐릭터의 상태를 관리하거나 게임의 다양한 상황에 따라 다른 동작을 수행할 때 스테이트 패턴을 활용할 수 있습니다.

 

스테이트 패턴을 사용하여 게임 캐릭터의 상태를 관리합니다. Player 클래스는 현재 상태를 가지고 있고, Update 함수에서 상태에 따라 HandleInput과 UpdateState를 호출합니다. 각 상태 클래스는 해당 상태에서의 입력 처리와 동작 업데이트를 구현합니다.

 

 

Prototype Pattern (프로토타입 패턴)

설명:

프로토타입 패턴은 객체를 복제(clone)하여 새로운 객체를 생성하는 디자인 패턴입니다. 이는 객체 생성 과정이 복잡하거나 비용이 많이 들 때 유용합니다.

 

예시:

유니티에서는 게임 오브젝트나 리소스를 복제하여 동적으로 생성할 때 프로토타입 패턴을 활용할 수 있습니다.

 

EnemyPrototype 클래스를 통해 적 캐릭터의 프로토 타입을 정의하고, OrcPrototype와 GoblinPrototype 클래스가 구체적인 프로토 타입을 구현합니다. GameManager 클래스에서는 프로토 타입을 복제하여 새로운 적 캐릭터를 생성하고 위치를 설정합니다.

 

프로토 타입 패턴을 사용하면 유니티 게임에서 캐릭터나 아이템과 같은 객체를 효율적으로 복제할 수 있습니다. 이 패턴을 사용하면 런타임 중에 필요한 만큼의 복제를 생성할 수 있으며, 원본 객체와 복제된 객체 간의 독립성을 유지할 수 있습니다.

 

 

Flyweight Pattern (플라이웨이트 패턴)

설명:

플라이웨이트 패턴은 많은 수의 유사한 객체를 효율적으로 공유하여 메모리 사용을 최적화하는 디자인 패턴입니다.

 

예시:

유니티에서는 많은 수의 비슷한 객체를 관리할 때 플라이웨이트 패턴을 활용하여 메모리를 절약할 수 있습니다. 예를 들어, 많은 수의 동일한 메쉬를 가진 게임 오브젝트를 관리할 때 이를 플라이웨이트 패턴으로 구현할 수 있습니다.