[SBS게임아카데미] 1인개발 프로그래밍 (C#, 유니티)

[11] C# 구조체와 클래스, 열거문 (SBS게임아카데미 9일차_230729_토)

개발린마케터 2023. 7. 29. 23:37
반응형

[구조체와 클래스]

 - 구조체는 값 형식을 기본으로 하고, 클래스는 참조를 기본으로 한다.

 - 구조체는 heap 영역에 생성되지 않고, stack 영역에 할당이 된다.

 - 구조체가 클래스 내에 쓰인다면 heap 영역에 할당이 된다. 

 - 클래스는 stack에 만들어지지만 heap 영역에 원본 주소값을 참조해서 가져온다.

 - 구조체는 복사할 경우 값을 복사하고, 하나를 변경하면 원래의 것과 값이 다른 2개가 된다. (깊은 복사)

 - 클래스는 복사할 경우 참조한 주소를 복사하고, 하나를 변경하더라도 참조한 원본을 변경한 것이기 때문에 2개가 모두 변경이 된다. (얕은 복사)

 

[구조체의 복사]

    struct StudentStruct
    {
        //구조체. 값 형식.
        //상태. 멤버변수. 필드
        public string name;
        public int num;
        public int grade;

        public StudentStruct(string _name, int _num, int _grade)
        {
            name = _name;
            num = _num;
            grade = _grade;
        }

        //기능. 함수
        public void ShowInfo()
        {
            Console.WriteLine("이름:{0}, 번호:{1}, 성적:{2}", name, num, grade);
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
        	StudentStruct s1 = new StudentStruct("루피", 20, 100);
            StudentStruct s2 = s1;  

            s2.name = "샹크스";
            s2.num = 30;
            s2.grade = 95;

            s1.ShowInfo();
            s2.ShowInfo();

            Console.WriteLine();
       }
    }

StudentStruck 이라는 구조체를 만들어서

s1에 루피의 이름, 번호, 성적을 대입하고, 

s2를 만들어 s1의 값을 복사했다. 

이후 s2의 값을 샹크스의 이름, 번호, 성적을 대입한 후

s1과 s2의 값을 출력하면 아래와 같이 나온다. 

값을 복사하는 구조체의 특성 상 s1과 s2가 각각 다른 값으로 나온다 (깊은 복사)

구조체의 깊은 복사

[클래스의 복사]

    internal class ClassStudent
    {
        public string name;
        public int num;
        public int grade;

        public ClassStudent(string _name, int _num, int _grade)
        {
            name = _name;
            num = _num;
            grade = _grade;
        }

        public void ShowInfo()
        {
            //Console.WriteLine("이름:{0}, 번호:{1}, 성적:{2}", name, num, grade);
            Console.WriteLine($"이름:{name}, 번호:{num}, 성적:{grade}");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
        	ClassStudent cs3 = new ClassStudent("조로", 50, 98);
            ClassStudent cs4 = cs3;

            cs4.name = "우솝";
            cs4.num = 33;
            cs4.grade = 90;

            cs3.ShowInfo();
            cs4.ShowInfo();
       }
    }

ClassStudent 라는 Class를 만들어서

s3에 조로의 이름, 번호, 성적을 대입하고, 

s4를 만들어 s3의 값을 복사했다. 

이후 s4의 값을 우솝의 이름, 번호, 성적을 대입한 후

s3과 s4의 값을 출력하면 아래와 같이 나온다. 

참조 주소를 복사하는 클래스의 특성 상 s4를 변경하더라도 참조한 원본을 변경하여 s3와 s4가 같이 나온다 (얕은 복사)

클래스의 깊은 복사

 

[열거문 enum]

 

<도시 이름 예시>

  public enum CITY
    {
        SEOUL,      //0
        BUSAN,      //1
        INCHEON,    //2
        DAEGU,      //3
        NEWYORK = 10,    //10
        JEJU        //11
    }
    
    internal class Program
    {
        static void Main(string[] args)
        {
        	CITY city1 = CITY.SEOUL;
            Console.WriteLine("도시이름:{0}", city1);

            city1 = CITY.BUSAN;
            Console.WriteLine("도시이름:{0}", city1);

            city1 = (CITY)11;   //해당 인덱스가 있다면 형변환 가능
            Console.WriteLine("도시이름:{0}", city1);

            city1 = (CITY)5;        //이렇게 쓰는 것도 가능하다는 것만 알고 있으면 됨. 보통은 CITY. 형태로 많이 쓰고 자동으로 뜨는 것 중에 선택.
            Console.WriteLine("도시이름:{0}", city1);
       }
    }

대부분 열거문으로 지정한 대로 출력이 되지만 5는 없어서 5로 나온다

 

 

<Job 예시. 열거문 + 함수>

    public enum JOBS
    {
        NOVICE,
        KNIGHT,
        THIEF,
        WARRIOR,
        ARCHER,
        MAGICIAN,
        FIGHTER,
        WIZARD
    }
    
    class Player
    {
        //public string job;
        public JOBS job = JOBS.NOVICE;

        public void SetJob(JOBS _job)
        {
            Console.WriteLine("직업변경:{0}->{1}", job, _job);
            job = _job;
        }

        public void SetAge(int _age)
        {
            //age = _age;
        }

    }
    
    internal class Program
    {
        static void Main(string[] args)
        {
        	Player p1 = new Player();

            p1.SetJob(JOBS.FIGHTER);
            p1.SetJob(JOBS.WIZARD);
            p1.SetJob(JOBS.KNIGHT);
            p1.SetJob(JOBS.ARCHER);
       }
    }

열거한 Job 사이의 변경까지 잘 표현이 되었다

 

[강의 내용]

https://www.notion.so/2023-07-29-4edfee40bfa248e289f5805e2fc189e7

반응형