학습 일자 : 2023.03.31


열거형 (Enum)

기본 정수 숫자의 형식의 명명된 상수 집합에 의해 정의되는 값 형식

열거형 멤버의 이름으로 관리되어 코드의 가독성적인 측면에 도움이 됨

<aside> 💡 열거형 기본 형식 enum [열거형 이름] { 멤버이름1, 멤버이름2, 멤버이름3 = 30, 멤버이름4, … }

</aside>

열거형의 형변환

정수에서 열거형으로 변환이 가능하다.
→ Enum data = (Enum)0; //0에 해당하는 열거형 데이터가 들어감.

만약, 열거형에 없는 정수 값을 변환한 경우에는 그냥 정수로 사용 됨. (열거형에 없는 값을 넣는다고 해서 오류가 나진 않음)

열거형 멤버이름을 확인하고 싶다면, 열거형.ToString()를 사용하기!

enum Attack
	{
		Fire = 0,
		Water = 1,
		Grass = 2,
		Electricity = 3
	}

	private void StudyEnum()
	{
		//0:불, 1:물, 2:풀 3:전기...
		int userAttack = 0;
		int monsterAttack = 1;
		if (userAttack == 0 && monsterAttack == 1)
		{
			Console.WriteLine("두배 데미지 받음");
		}
		// -> 변수로 정의해서 사용하면 나중에 어떤 공격이 몇번이었는지 기억하는데 한계가 있음 
		
		Attack user = Attack.Fire;
		Attack monster = Attack.Water;
		if (user == Attack.Fire && monster == Attack.Water) 
		{
			Console.WriteLine("두배 데미지 받음");
		}
		// 열거형으로 변화 -> 의도하는 바를 확실히 알 수 있음

		Console.WriteLine((Attack)0); //정수를 열거형으로 변환 가능
		Console.WriteLine((Attack)10); //열거형에 없는 값을 넣으면 그냥 숫자로 나옴.
	}

열거형 비트플래그

enum위에 [Flags]를 써줘야 비트플래그로 인식을 함.

비트 연산을 통해 빠르게 계산이 가능함.

비트 마스킹을 통해 요소를 2개 이상 있는 형태도 만들 수 있음.

→ enum 요소의 조합이 가능. or연산자를 이용해 추가하거나 and연산자를 이용해 제거 가능

→ 보통 0은 추가나 제거 연산에 포함되지 않음

//열거형 비트플래그 사용
	[Flags] // 열거형을 비트플래그로 사용 -> 안 써주면 합치거나 제거하는거 안돼.
	enum Day
	{
		None = 0b_0000_0000,        // 0
		Monday = 0b_0000_0001,      // 1
		Tuesday = 0b_0000_0010,     // 2 
		Wednesday = 0b_0000_0100,   // 4
		Thursday = 0b_0000_1000,    // 8
		Friday = 0b_0001_0000,      // 16
		Saturday = 0b_0010_0000,    // 32
		Sunday = 0b_0100_0000,      // 64
		Weekend = Saturday | Sunday //요소를 여러개 포함하는게 가능함
	}

	private void BitEnum()
	{
		Day meetingDays = Day.Monday | Day.Wednesday;
		Console.WriteLine(meetingDays);     // Monday, Wednesday

		meetingDays |= Day.Friday;          // 비트마스킹을 이용한 추가
		Console.WriteLine(meetingDays);     // Monday, Wednesday, Friday

		meetingDays &= ~Day.Wednesday;      // 비트마스킹을 이용한 제거
		Console.WriteLine(meetingDays);     // Monday, Friday

		bool isMeetingOnMonday = (meetingDays & Day.Monday) != Day.None; // 비트마스킹을 이용한 확인
		Console.WriteLine(isMeetingOnMonday);   // true

		//숫자로 넣어도 연산해서 나옴. 
		Console.WriteLine((Day)3); // 3 = 1 + 2 -> 11 = 01 | 10 -> mon, tue

		Console.WriteLine($"{meetingDays} -> {meetingDays |= Day.None}"); 
		//Monday, Friday -> Monday, Friday : 0인 None는 적용되지 않음
	}

튜플 (Tuple)