사용자 정의 자료형(User Defined Type)

우창민·2023년 10월 5일
0

C# Study

목록 보기
6/7

열거형

enum MoveKey{ Up, Down, Left, Right} //열거형의 이름과 멤버들의 이름 작성
static void Main()
{
	MoveKey key = MoveKey.Up;
    switch(key){
    	case MoveKey.Up;
        	//위 행동정의
            break;
        case MoveKey.Down;
        	//아래행동 정의
            break;
        case MonveKey.Left;
        	//왼쪽 행동 정의
            break;
        case MoveKey.Right;
        	//오른쪽 행동 정의
            break;  
}

위와 같이 코드의 가독성을 올리는데 유용하다.

enum Season()
{
	Spring, 	  //0
   	Summer  = 20, //20
    Autumn,       //21
    Winter		  //22
}

열거형 변수를 (int)를 사용하여 형변환 했을 때 해당 enum값에 값을 지정해줄 수 있다.
시작은 0이며 중간에 특정값을 설정하면 그 이후는 해당 값 +1 로 저장됨.

열거형 비트플래그 활용

[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 //or 연산
}

static void Main()
{
	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
}

튜플

간단한 데이터 구조에서 여러 데이터 요소를 그룹화 하는 간결한 구문을 제공

static void Main()
{
	(double, int) t1 = (4.7, 3);  //이름을 지정하지 않을경우 Item1, Item2로 초기화
    Console.WriteLine("튜플의 첫번쨰 데이터 {0}, 두번쨰 데이터 {1}",t1.item1, t1.item2);
    
    (double A1, int B2) t2 = (4.5, 3);
	Console.WriteLine("튜플의 첫번째 데이터 {0}, 두번째 데이터 {1}",t1.A1, t1.B2);
    
    //튜플의 비교는 튜플 요소 순서에 따라 데이터 끼리 비교
    (int a, double b) left1 = (5, 10);
    (double a, int b) right1 = (5, 10);
    Console.WriteLine(left1 == right1); //output : true
    
    (int a, double b) left2 = (5,10);
    (double b, int a) right2 = (10,5);
    Console.WriteLine(left2 == right2); //output : false
}
//함수의 반환형으로 사용하여 여러 데이터를 한꺼번에 전달이 가능함
(int min, int max) FindMinMax(int[] input)
{
	return (input.Min(), input.Max());
}

구조체

사용 방법 : struct 구조체 이름 {구조체 내용}
구조체 내용으로는 변수와 함수가 포함이 가능함

struct Student
{
	public string name;
    public int mathGrade;
    public int englishGrade;
    public int height;
    
    public float GetAverage()
    {
    	return (mathGrade + englishGrade) / 2f;
    }
}
static void Main()
{
	Student kim;
    kim.name = "Kim";
    kim.mathGrade = 20;
    kim.englishGrade = 70;
    kim.height = 175;
    
    Console.Write("{0}의 평균 점수는",kim.name);
    Console.WriteLine(kim.GetAverage());  //구조체내의 함수에 접근하기위해 . 사용
}

구조체 초기화 및 기본값

  • 반환형이 없는 구조체이름의 함수를 초기화라 하며 구조체 변수들의 초기화를 진행함
  • 구조체의 초기화는 new키워드를 통해서 사용
  • 초기화 기능을 포함하지 않아도 기본 초기화는 자동생성
  • 기본 초기화는 구조체 변수들의 기본 초기화를 진행
struct Player
{
	public string name;
    public int hp;
    public int mp;
    
    public Player(string name, int hp)
    {
    	//초기화에서 모든 구조체 변수를 초기화하지않으면 error발생
	    this.name = name;
        this.hp = hp;
        this.mp = 0;
    }
    public Player(string name, int hp, int mp) : this(name, hp) //이전 초기화를 사용하여 간단히
    {
    	this.mp = mp;
    }
}
static void Main()
{
	Player player1;
    player1.name = "마법사";
    player1.hp = 5;
    
    Player player2 = new Player();
    Console.WriteLine("{0}, {1}, {2}", player2.name, player2.hp, player2.mp);  //output : "", 0 , 0
    
    Player player2 = new Player(name = "전사" , hp = 30);
    Console.WriteLine("{0}, {1}, {2}", player2.name, player2.hp, player2.mp);  //output : "전사", 30. 0
    Player player2 = new Player("궁수", 20, 10);
    Console.WriteLine("{0}, {1}, {2}", player2.name, player2.hp, player2.mp);  //output : "궁수", 20, 10
}
profile
더 편하게 더 간단하게

0개의 댓글