[C#] 제네릭<T> 함수로 다양한 열거형 자료 매개변수로 사용_TtoInt

·2024년 7월 10일
0

Unity

목록 보기
8/11

분류에 맞게 다양한 enum을 사용하는데, 함수의 매개변수를 그에 맞게 다 나누기보다 제네릭 함수를 활용하여 다양한 열거형 자료에 맞는 유연한 하나의 함수로 개발하면 더 컴팩트한 코드가 될 생각으로 진행하게 되었다.

문제 상황

다양한 주제의 효과음을 열거형으로 구분하여 효과음 배열 인덱스에 맞춰 저장하지만, 그에 대한 효과음 관리 및 재생은 switch문으로 분류 제어하고 있었다 -> 열거형의 존재는 단순 매개변수에 대한 편의밖에 제공하고 있질 않음을 불편하게 여김.

💬 CODE

위 처럼 SoundType이라는 대분류 열거형이 있고 소분류 열거형은 대분류에 따른 효과음의 종류들을 정의한다. 이에 맞춰 효과음을 저장하는 클래스에 AudioClip 데이터를 배치해준다.

[System.Serializable]
public class ClipType {
	public SoundType myType;
	public AudioClip[] effectClips;
}

public List<ClipType> effects;	// 최종 인스펙터에서 보이는 변수

효과음을 저장하는 클래스의 구조는 인스펙터에서 쉽게 컨트롤하기 위해 직렬화 클래스로 만들어줬다.

다양한 분류에 대응하는 함수는 제네릭을 사용하였는데, T clip 이라는 매개변수에 원하는 소분류 열거형을 넣으면, 그에 맞는 값을 Parse해주는 Enum 클래스의 기능으로 손 쉽게 사용할 수 있었다.

▶️ Object Enum.Parse(열거형의 타입, 해당 타입의 열거형 문자열)
⛔️ 만약 문자열에 오타가 있다면 ArgumentException 에러가 발생합니다.

using System;
public void SetEffectSound<T>(SoundType _type, T clip) where T : Enum
{
	int clipIdx = (int)Enum.Parse(clip.GetType(), clip.ToString());
	PlayEffectSound(effects[(int)_type].effectClips[clipIdx]);
    // 효과음 저장 클래스 형식대로 원하는 효과음 플레이
}

이렇게 하면 어떤 형식의 열거형이 와도 원하는 결과를 뱉어준다. 그럼 반환값이 Object이기 때문에 int으로의 casting이 가능해지고 원하는 형태로 활용이 될 수 있다.

🎮 실제 활용

SoundManager.instance.SetEffectSound(SoundType.Player, PlayerSfx.Breath);
SoundManager.instance.SetEffectSound(SoundType.Monster, MonsterSfx.Damage);
SoundManager.instance.SetEffectSound(SoundType.UI, UISfx.Snap);

즉 원하는 파일에 맞춰 enum을 등록해주고 위의 코드처럼 분류에 맞춰 원하는 시점에 호출해주면 된다.

참고로 C#의 7.3버전부터 Enum 클래스를 제네릭의 한정자로 받아줄 수 있게 되었다고 한다.

🍥 느낀점

  • switch문의 1점짜리 효과음 분리 코드보다 훨씬 컴팩트해지고 공부가 된 리팩토링의 경험이 됐다.
  • 사용해보지 못했던 Enum 클래스와 Generic을 잘 알아보고 실전에 조금이라도 도움이 되는 형식으로 사용해본 경험은 추후 유용한 함수들을 잘 만들어 낼 밑거름이 된거 같다.
  • 참고 링크에서 형변환의 성능 이슈를 언급한 부분을 인상깊게 봤다. 이런게 현실 최적화 이슈인가 싶어서 코드를 짜는 나를 되돌아 보게 되었다. 점점 최적화 란 것이 무엇인지 와닿는 중이다.

🔗 참고 링크

Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
[Microsoft_C#] Enum.Parse 메서드

profile
할 수 있는 최선을 다하는 클라이언트 개발자랍니다 (❁´◡`❁)

0개의 댓글

관련 채용 정보