Adapter 패턴은 서로 호환되지 않는 인터페이스를 가진 클래스들을 연결하는 데 유용한 디자인 패턴입니다. 즉, 기존 클래스와 새로운 클래스 간의 호환성을 확보하는 역할을 하며, 코드 수정 없이도 기존 코드를 새로운 방식으로 사용할 수 있도록 도와줍니다.
Adapter 패턴의 개념
Adapter 패턴은 두 가지 주요 컴포넌트로 구성됩니다.
- Target: 클라이언트가 기대하는 인터페이스
- Adaptee: 기존에 존재하며 새로 요구되는 인터페이스와 호환되지 않는 클래스
- 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}");
}
}