본문 바로가기
Development/멋쟁이사자처럼 게임개발 부트캠프

[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 6일차 - 네임스페이스 & 열거형 & 구조체

by jjeondeuk1008 2025. 3. 7.

 

[ 목차 ]

     


     

    오늘은 네임스페이스와 구조체에 대해서 알아보는 시간~!

     

     

    매일 블로그를 쓰면서

    이 내용 저 내용 다룰 때마다

     

    파이팅 하자는 마음다짐의 글을 적고 시작하는데..

     

    사실 이제 뭘 적어야 할지 모르겠어요😢

     

    그러니까!

     

     

    그냥 파이팅^^!

     

     

     

     

     


     

     

    1. 네임스페이스 (namespace)

     

    네임스페이스란?

    클래스, 함수, 변수 이름이 충돌하는 것을 방지하기 위해 사용된다.

     

    그렇다고 다른 네임스페이스에 있는 것은 못 쓰냐?

     

    그건 아니다. 쓸 수 있다.

     

     

    함수를 구분하는 것처럼 구분하는 느낌이라고 생각하면 될 것 같다.

    namespace dev1
    {
        class MyClass
        {
            public static void SayHello()
            {
                //Console.WriteLine("안녕하세요 !MyNamespace의 MyClass입니다.");
            }
        }
    }
    
    namespace _2025_02_27
    {
        class Program
        {
    		public static void SayHello()
    		{
    			Console.WriteLine("HelloSay");
    		}
    		static void Main(stirng[] args)
    	    {
                _2025_02_27_1.MyClass.SayHello();    // 결과 값 : SayHello
    			SayHello();                          // 결과 값 : HelloSay
    	    }
    		    
    	}
    }

     

     

     

     

     

     

    람다식

     

    여기서 번외로 람다식이란 게 있다.

     

    람다 식이란?

    람다 선언 연산자(=>)를 사용하는 익명 함수이다.

     

    사용할 때의 장점은 메서드를 보다 짧고 직관적으로 정의할 수 있다.

    아래의 코드를 보면 중괄호를 생략할 수 있다는 점이다.

     

    중괄호 외에도 return 키워드 생략이 가능하고 후에 배울 LINQ 쿼리에도 나오게 된다.

    static int AddArrow(int a, int b) => a + b;
    //중괄호 {} return 생략 가능
    
    //일반적인 함수
    
    static void PrintMessage()
    {
    Console.WriteLine("안녕하세요");
    }
    
    static void PrintMessageArrow() => Console.WriteLine("안녕하세요");
    
    static void Main(stirng[] args)
    {
    //C# 화살표 함수
    //C#에서 화살표 함수 => 람다 표현식 이라고도 함
    // 간결한 방식으로 함수를 정의 할 수 있다.
    Console.WriteLine(Add(3, 5));                   // 결과 값 : 8
    Console.WriteLine(AddArrow(3, 5));              // 결과 값 : 8
    
    PrintMessage();                                 // 결과 값 : 안녕하세요
    PrintMessageArrow();                            // 결과 값 : 안녕하세요
    }
    

     

     

     

     

     

     


     

    Math 클래스

     

     

    Math 클래스가 무엇이냐?

    영어 그대로 수학적 계산이라는 것이다.

     

    파이나 루트 제곱 반올림 등등 수학 관련된 메서드 종류이다.

     

    이것 외에도 더 많은 Math 클래스가 있으니

    현재는 간단한 메서드에 대한 예제로 실습하였다.

    static void Main(string[] args)
      {
      //Math클래스 사용
      //수학적 계산
      Console.WriteLine("Pi : " + Math.PI);           //파이
      Console.WriteLine("Square root of 25 : " + Math.Sqrt(25));      //루트
      Console.WriteLine("Power (2^3) : " + Math.Pow(2, 3));       //제곱
      Console.WriteLine("Round (3.75 : " + Math.Round(3.75));     //반올림
      }
    

     

     

     

     


     

     

    열거형 (Enumeration)

     

     

    열거형은 무엇이냐?

    간단히 말하면 상수 값의 집합이다.

     

    숫자 값에 이름을 부여하는 자료형이며, 가독성을 높이고 의미 있는 값으로 표현 가능하다.

    기본적으로 첫 번째 값은 0부터 시작하며 1씩 증가한다.

     

    보통 enum 키워드를 사용하여 정의한다.

     

    숫자를 일일이 지정해주지 않아도 알아서 값을 순서대로 지정해 준다.

    enum DayOfWeek
    {
       Sunday ,            // 0
       Monday,             // 1
       Tuesday,            // 2
       Wednesday,          // 3
       Thursday,           // 4
       Friday,             // 6
       Saturday            // 7
    }
    
    static void Main(string[] args)
    {
    		DayOfWeek today = DayOfWeek.Wednesday;
    		Console.WriteLine(today);               // 결과 값 : Wednesday
    		Console.WriteLine((int)today);          // 결과 값 : 3
    }

     

     

    혹여나

    0부터 시작하는 순서가 마음에 들지 않을 수도 있다.

     

    그럴 때는 enum에 있는 변수에 값을 지정해 주는 것이다.

     

    값을 지정하고 위에 코드처럼 호출할 때 (int)변수명 을 넣어주면 된다.

    //2. enum 값 변경 (0부터 시작하고 싶지 않을때)
    enum StatusCode
    {
        Success = 200,
        BadRequest = 400,
        Unaauthorized = 401,
        NotFound = 404
    }
    
    static void Main(string[] args)
    {
    	StatusCode code = StatusCode.Success;
    	Console.WriteLine(code + " : " + (int)code);  // 결과 값 : Success : 200
    }
    

     

     


     

    열거형 + 함수

     

     

    열거형과 함수를 통한 실습을 진행하였다.

    열거형으로 무기를 늘어놓고 조건문을 통해 선택한 것을 호출한다.

    enum Weapontype
    {
        Sword,
        bow,
        Staff
    }
    
    static void ChooseWeapon(WeaponTypeCode weapon)
    {
       if(weapon == WeaponTypeCode.Sword)
       {
           Console.WriteLine("검을 선택했습니다.");
       }
       else if(weapon == WeaponTypeCode.Bow)
       {
           Console.WriteLine("활을 선택했습니다.");
       }
       else if(weapon == WeaponTypeCode.Staff)
       {
           Console.WriteLine("스태프를 선택했습니다.");
       }
    }
    
    static void Main(string[] args)
    {
    	 ChooseWeapon(Weapontype.Sword);
    }
    

     

     

     

     


     

    2. 구조체

     

    클래스와 비슷하지만 값 타입(Value Type)이며, 가볍고 빠르다.

    주로 간단한 데이터 묶음을 만들 때 사용한다.

     

    보통 구조체를 정의할 때 struck 문을 사용한다.

    struck 문은 두 개 이상의 변수가 있는 새로운 데이터 형식을 정의한다.

     

    변수를 정의할 때

    public 은 외부에서도 사용 가능하게 하는 권한이다.

    private은 나만 사용하려고 만든 키워드이며, 코드를 숨긴다는 느낌이다.

     

    그렇게 만든 구조체는 Main 호출에서

    Point (변수명);

    구조체 선언을 한다.

     

    구조체는 클래스와 다르게 new 없이 사용 가능하다.

    모든 필드를 반드시 초기화해야 한다.

    //C# 구조체
    //클래스와 비슷하지만, 값 타입(Value Type)이며 가볍고 빠름
    //주로 간단한 데이터 묶음을 만들때 사용
    
    struct Point
    {
        //public : 어디서든 사용가능하게 권한
        //private : 나만 사용하려고 하는 키워드
        public int X;
        public int Y;
    
        //생성자 정의 -> 처음에 생성할 때 동작하는 함수
        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
        public void Print()
        {
            Console.WriteLine($"좌표: {X}, {Y}");
        }
    }
    
    static void Main(string[] args)
    {
    Point p;    //구조체 선언 (초기화 필요)
    
    p.x = 10;
    p.y = 10;
    
    p.Print();
    }
    
    //struct Point는 X,Y 좌표 값을 저장하는 구조체
    //구조체는 클래스와 다르게 new 없이 사용 가능
    
    //struct에도 생성자 사용 가능(매개변수를 통한 초기화 함수)
    //모든 필드를 반드시 초기화해야 함
    

     

     

     

    열거형과 람다식을 활용한 실습이다.

    struct Rectangle
    {
        public int width;
        public int height;
    
        public int GetArea() => width * height;
    }
    
    static void Main(string[] args)
    {
    var rect = new Rectangle { width = 5, Height = 10 };
    
    Console.WriteLine(rect.GetArea());          // 결과 값 : 50
    
    Rectangle R;
    R.width = 10;
    R.Height = 20;
    Console.WriteLine(R.GetArea());             // 결과 값 : 200
    }
    

     

     

     

     

    구조체 배열

     

    구조체 배열이다.

     

    배열을 선언하고, foreach 반복문을 통해 호출한 실습이다.

     struct Points
     {
         public int X;
         public int Y;
     }
    
     static void Main(string[] args)
     {
         Point[] points = new Point[2];
    
         points[0].x = 10;
         points[0].y = 10;
    
         points[1].x = 20;
         points[1].y = 20;
    
         foreach (var point in points)
         {
             Console.WriteLine($"Point: ({point.x},{point.y})");    //결과 값 : Point: (10,10)
                                                                    //결과 값 : Point: (20,20)
         }
    

     

     

     

     

     


    구조체 실습

     

     

    구조체를 사용해 3명의 학생 국어, 영어, 수학 점수를 받고 출력하는 실습을 하였다.

    /* 3명의 학생 국어, 영어, 수학 점수 받고 출력 */
    //이름     국어    영어    수학
    //홍길동    100     80      70
    //홍길동    100     80      70
    //홍길동    100     80      70
    
    struct Student
    {
        public string name;
        public int iKor;
        public int iEng;
        public int iMath;
    
        //학생 정보를 출력하는 함수
        public void Print()
        {
            //-10은 왼쪽에서부터 10칸을 밀어주겠다 (한글은 2칸으로 간주)
            Console.WriteLine($"{name,-5} {iKor,5} {iEng,5} {iMath,5}");
        }
    }
    
    static void Main(string[] args)
    { 
    
    	  //학생 배열 선언
    		Student[] students = new Student[3];
    		
    		for(int i=0; i<students.Length; i++)
    		{
    		
    		    Console.WriteLine("학생성적을 입력하세요.");
    		    Console.Write("학생이름: ");
    		    students[i].name = Console.ReadLine();
    		    Console.Write("국어: ");
    		    students[i].iKor = int.Parse(Console.ReadLine());
    		    Console.Write("영어: ");
    		    students[i].iEng = int.Parse(Console.ReadLine());
    		    Console.Write("수학: ");
    		    students[i].iMath = int.Parse(Console.ReadLine());
    		}
    	
    		Console.WriteLine("이름       국어   영어  수학");
    	
    		foreach(Student std in students)
    		{
    		    std.Print();
    		}
    }
    

     

     

     

     

     

    두 번째 실습으로 인벤토리를 만드는 실습을 진행하였다.

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace lionstudy30_inventory
    {
        class Program
        {
            static void start()
            {
                Console.WriteLine("[인벤토리]");
                Console.WriteLine("[Y: 열기]");
                Console.WriteLine("[N: 나가기]");
    
                ConsoleKeyInfo key1 = Console.ReadKey(true);
    
                if(key1.Key == ConsoleKey.Y) // Y키를 체크
                {
                    SnowInventory();
                }
    
            }
            
            struct Item
            {
                public string itemname;
                public int itemCount;
                
                public Item(string name, int count)
                {
                    itemname = name;
                    itemCount = count;
                }
            }
            
            //최대 아이템 개수 (배열 크기)
            const int MAX_ITEMS = 10;
    
            //아이템 배열 (이름 저장)
            //static string[] itemNames = new string[MAX_ITEMS];
            //static int[] itemCounts = new int[MAX_ITEMS];
    
            static Item[] items = new Item[MAX_ITEMS];
            
            //아이템 추가 함수
            static void AddItem(string name, int count)
            {
                for(int i =0; i<MAX_ITEMS; i++)
                {
                    if (items[i].itemname == name) //이미 있는 아이템이면 개수 증가
                    {
                        items[i].itemCount += count;
                        return;
                    }
                }
    
                //빈 슬롯에 새로운 아이템 추가
                for (int i = 0; i < MAX_ITEMS; i++)
                {
                    if (items[i].itemname == null)
                    {
                        items[i].itemname = name;
                        items[i].itemCount = count;
                        return;
                    }
                }
    
                Console.WriteLine("인벤토리가 가득 찼습니다.");
            }
    
            static void RemoveItem(string name, int count)
            {
                for(int i=0; i<MAX_ITEMS; i++)
                {
                    if (items[i].itemname == name) //이름하고 같은지
                    {
                        if (items[i].itemCount >= count) //개수가 충분하면 차감
                        {
                            items[i].itemCount -= count;
                            if (items[i].itemCount == 0) //개수가 0이면 삭제
                            {
                                items[i].itemname = null;
                            }
                            return;
                        }
                        else
                        {
                            Console.WriteLine("아이템 개수가 부족합니다!");
                            return;
                        }
                    }
                }
    
                Console.WriteLine("아이템을 찾을 수 없습니다!");
            }
    
            //인벤토리 출력 함수
            static void SnowInventory()
            {
                Console.WriteLine("[현재 인벤토리]");
                bool isEmpty = true;
    
                for(int i = 0; i<MAX_ITEMS; i++)
                {
                    if (items[i].itemname !=null)
                    {
                        Console.WriteLine($"{items[i].itemname} (x{items[i].itemCount})");
                        isEmpty = false;
                    }
                }
    
                if(isEmpty)
                {
                    Console.WriteLine("인벤토리가 비어 있습니다.");
                }
            }
    
           
    
            static void Main(string[] args)
            {
                start();
    
                Console.Clear();
    
                //테스트: 아이템 추가
                AddItem("포션", 5);
                AddItem("칼", 1);
                AddItem("포션", 3); //포션 개수 추가
               
                SnowInventory();
    
                //아이템 사용
                Console.WriteLine("포션 2개 사용");
                RemoveItem("포션", 2);
    
                SnowInventory();
    
                //테스트: 없는 아이템 제거
                Console.WriteLine("방패 1개 제거 시도");
                RemoveItem("방패", 1);
    
                SnowInventory();
    
                //테스트: 모든 포션 제거
                Console.WriteLine("포션 6개 사용");
                RemoveItem("포션", 6);
                SnowInventory();
    
            }
        }
    }
    
    

     

     

     

     


     

    지금까지 네임스페이스, 열거형, 구조체를 알아보았다.

     

    아직도 공부하면서 헷갈리는 점은 많지만,,

    요즘 코딩테스트 Lv.0 시작해 봤는데

     

    가장 기초 중에 기초도 헷갈리는 나에겐..

     

    아직 갈 길이 멀었나 보다.. ^,^..

     

     

    나 개자이너 할 수 있나요 . . . 😫

     


    목차