유니티 Adapter 패턴에 대해 알아보자

Adapter 패턴은 서로 호환되지 않는 인터페이스를 가진 클래스들을 연결하는 데 유용한 디자인 패턴입니다. 즉, 기존 클래스와 새로운 클래스 간의 호환성을 확보하는 역할을 하며, 코드 수정 없이도 기존 코드를 새로운 방식으로 사용할 수 있도록 도와줍니다.


Adapter 패턴의 개념

Adapter 패턴은 두 가지 주요 컴포넌트로 구성됩니다.

  1. Target: 클라이언트가 기대하는 인터페이스
  2. Adaptee: 기존에 존재하며 새로 요구되는 인터페이스와 호환되지 않는 클래스
  3. Adapter: Target 인터페이스를 구현하여 Adaptee 클래스를 래핑하는 클래스

유니티에서는 외부 API 또는 기존 시스템 코드와 호환이 되지 않는 상황에서 Adapter 패턴을 사용할 수 있습니다.


외부 데이터 API와의 호환성 문제 해결

예를 들어, 외부에서 캐릭터의 속성 데이터를 JSON 형식으로 제공할 때, 유니티에서는 이러한 데이터를 CharacterStats 클래스에서 사용할 수 있어야 하는데, JSON 데이터 형식과 유니티에서 기대하는 형식이 다를 경우 Adapter 패턴을 사용하여 이 문제를 해결할 수 있습니다.

 

1. Target 인터페이스 정의

캐릭터의 속성 데이터를 사용할 수 있는 기본 인터페이스 ICharacterStats를 정의합니다.

public interface ICharacterStats
{
    int Health { get; }
    int Attack { get; }
    int Defense { get; }
}

2. Adaptee 클래스

외부에서 JSON 형식으로 제공되는 데이터를 처리할 JsonCharacterStats 클래스를 작성하고, 외부 데이터를 유니티의 ICharacterStats 인터페이스에 맞추기 위해 Adapter를 필요로 합니다.

[System.Serializable]
public class JsonCharacterStats
{
    public int hp;
    public int atk;
    public int def;
}

3. Adapter 클래스

JsonCharacterStats를 ICharacterStats와 호환되도록 만드는 Adapter 클래스를 작성합니다.

public class CharacterStatsAdapter : ICharacterStats
{
    private JsonCharacterStats _jsonStats;

    public CharacterStatsAdapter(JsonCharacterStats jsonStats)
    {
        _jsonStats = jsonStats;
    }

    public int Health => _jsonStats.hp;
    public int Attack => _jsonStats.atk;
    public int Defense => _jsonStats.def;
}

이렇게 하면 CharacterStatsAdapter가 ICharacterStats 인터페이스를 구현하며, 내부적으로는 JsonCharacterStats 데이터를 사용하여 속성을 제공합니다.


4. 사용 예시

Adapter 패턴을 사용하여 외부 JSON 데이터를 ICharacterStats 인터페이스로 처리할 수 있습니다.

using UnityEngine;

public class AdapterExample : MonoBehaviour
{
    private void Start()
    {
        // JSON 데이터를 가정합니다
        JsonCharacterStats jsonStats = new JsonCharacterStats { hp = 100, atk = 25, def = 10 };

        // Adapter를 통해 JSON 데이터를 ICharacterStats 인터페이스로 변환합니다
        ICharacterStats characterStats = new CharacterStatsAdapter(jsonStats);

        Debug.Log($"Health: {characterStats.Health}");
        Debug.Log($"Attack: {characterStats.Attack}");
        Debug.Log($"Defense: {characterStats.Defense}");
    }
}