Unity & C#

[c#] Indexer [인덱서] 활용해보기

왼손잡이개발자 2022. 5. 8. 14:03

 

최근에 c#의 문법 중 Indexer (인덱서) 라고 하는 친구의 존재를 알게 되었습니다. 그래서 Indexer는 어떤식으로 사용할 수 있을지 생각해보다가 특정 클래스 안에 딕셔너리가 있고 그 딕셔너리를 public으로 직접 접근하지않고 Indexer로 딕셔너리의 Value값을 접근하는 것을 생각해보았습니다.

 

간략하게 인덱서의 문법을 설명해드리자면,

public T this[int i] => arr[i];

이런식으로 쓰이게 됩니다. 다른 클래스에서 접근할 때에는 해당 클래스 이름 뒤에 [파라미터 값] 을 넣어서 접근을하게됩니다.

 

예제로  Monster와 MonsterCollection이라는 클래스가 존재하고, MonsterCollection 클래스 안에는 Monster의 이름(string)을 Key값으로 가지고 Monster 타입을 Value 타입으로 가지는 monsterCollection 딕셔너리가 있습니다.

 

using System;
using System.Collections.Generic;

namespace ForBlog
{
	namespace Indexer 
	{
		class MonsterCollection
		{
			private Dictionary<string, Monster> monsterCollection = new Dictionary<string, Monster>();

			public Monster this[string name] => monsterCollection[name];

			public void Add(Monster newMonster)
			{
				if(monsterCollection.ContainsKey(newMonster.name))
				{
					Console.WriteLine("monster with name [{0}] already exists in the collection", newMonster.name);
					return; 
				}

				monsterCollection.Add(newMonster.name, newMonster);
			}

			public void MonsterInfo(Monster reqMonster)
			{
				if(monsterCollection.ContainsKey(reqMonster.name))
				{
					Monster monster = this[reqMonster.name];
					Console.WriteLine("Monster Name : [{0}] / Type : [{1}]", monster.name, monster.type.ToString());
				}
				else
				{
					Console.WriteLine("No such monster exists");
				}

			}

			public void ListOutMonsters()
			{
				Console.WriteLine("List of Monsters : ");
				foreach(var monster in monsterCollection)
				{
					Console.Write(monster.Key + " ");
				}
			}
		}

		class Monster
		{
			public string name { get; private set; }
			public MonsterType type { get; private set; }
			public Monster(string name, MonsterType type)
			{
				this.name = name;
				this.type = type;
			}
		}

		public enum MonsterType { Good, Bad}
	}

	
}

 

 

MonsterCollection 클래스에서 

public Monster this[string name] => monsterCollection[name];

이 부분이 인덱서를 사용해서 string 값을 파라미터로 받아서 딕셔너리의 Value 값을 가지고 오는 부분입니다.

 

콘솔 프로그램에서 한번 실행하는 코드를 아래와 같이 작성했습니다. 

using System;

namespace ForBlog
{
	namespace Indexer
	{
		class Program
		{
			static void Main(string[] args)
			{
				MonsterCollection monsterCollection = new MonsterCollection();
				monsterCollection.Add(new Monster("loki", MonsterType.Bad));
				monsterCollection.Add(new Monster("pikachu", MonsterType.Good));
				monsterCollection.Add(new Monster("Spiderman", MonsterType.Good));


				monsterCollection.ListOutMonsters();

				AddLineBreak(2);

				Console.WriteLine("Select Monster :");
				string selected = Console.ReadLine();

				Monster selectedMonster = monsterCollection[selected];

				monsterCollection.MonsterInfo(selectedMonster);
			}


			private static void AddLineBreak(int numOfLines = 1)
			{
				for(int i=0; i< numOfLines;i++)
				{
					Console.WriteLine("");
				}
			}
		}
	}

}

 

 

콘솔 프래그림을 실행시키고 "loki"라는 몬스터를 입력했을 때 인덱서를 사용해서 Monster 를 가지고 올 수 있었습니다

 

 

이번 예제에선 string을 파라미터로 활용하는 인덱서였는데 "인덱서"라는 이름대로 int값을 받는 인덱서로 배열이나 리스트에서 값들을 가지고 올 수 있게 자주 활용 할 수 있을 것 같네요