Unity_2기 내일배움캠프 TIL

Unity_2기 2주차 (231107)

잼잼재미 2023. 11. 7. 18:50

오늘은 어제와 마찬가지로 C# 강의를 개별적으로 들었다.

하루에 1주차 분량씩 강의를 듣는 것으로 계획을 잡아서 오늘은 2주차 강의를 모두 들었다.

처음에는 if문, while문, for문 처럼 많이 익숙한 문법 위주로 나왔는데

배열과 List 부분에서 헷갈리는 부분을 정리하였다.

 

● 배열

동일한 자료형의 값들이 연속적으로 저장되는 자료 구조
선언된 크기만큼 공간을 메모리에 할당받음

최초 선언하는 시점에서 크기를 미리 정해야 함

int[] array = new int[3];
array[0] = 3;
array[1] = 5;
array[2] = 2;

int[] itemPrices = {100, 200, 300, 400, 500}; // 배열 생성, 초기화를 한줄로

 

● List

배열과 비슷한 자료 구조
배열과는 다르게 크기가 가변적

using System.Collections.Generic;

List<int> numbers = new List<int>(); // 빈 List 생성
numbers.Add(1); // 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 데이터 삭제, 2를 삭제하고 1, 3이 연결됨

foreach(int number in numbers)
{
	Console.WriteLine(number); // 1, 3 출력
}

for(int i = 0; i < list.Count; i++) // Length 대신 Count 사용
{
	Console.WriteLine(numbers[i]); // 1, 3 출력
}

 

● 배열과 List 비교

리스트만 무분별하게 사용하면 안됨
데이터의 크기와 사용 목적을 고려해서 배열과 리스트 중 적절한 것을 선택해야 함

  List 배열
길이 동적으로 변함 고정
메모리 동적이며 무작위, 메모리 배열보다 많이 차지 정적이며 연속적, 효율적인 메모리
활용 요소의 추가/삭제가 필요할 때 요소가 변경 가능성 없을 때
속도 느림 빠름
메모리 관리 메모리 낭비가 없음 메모리 낭비 발생

 

* List의 단점
1. 리스트는 동적으로 크기를 조정하기 때문에 배열보다 많은 메모리를 사용
2. 리스트에서는 특정 인덱스의 데이터를 찾기 위해 연결된 노드를 모두 순회하기 때문에 배열보다 느림
3. 데이터 추가, 삭제가 배열보다 간편하지만 코드 복잡도가 증가

 

그리고 2주차를 완강하고 숙제가 있는데 생각보다 어려웠다.

 

● 틱택토 게임 만들기

internal class Program
    {
        static void Main(string[] args)
        {
            // 3x3 틱택토 게임
            // 나와 컴퓨터가 번갈아서 진행
            // 한줄이 완성되면 승리

            // 0 : 빈공간
            // 1 : O
            // 2 : X
            // 빈공간 초기화
            int[,] map = new int[3, 3]
            {
                {0, 0, 0 },
                {0, 0, 0 },
                {0, 0, 0 }
            };

            // 화면 출력
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    if (map[i, j] == 0)
                    {
                        Console.Write("  ");
                    }
                    else if (map[i, j] == 1)
                    {
                        Console.Write("O ");
                    }
                    else
                    {
                        Console.Write("X ");
                    }
                }
                Console.WriteLine();
            }

            while (true)
            {
               // 내 차례
                Console.WriteLine("1 ~ 9 위치 중 골라주세요.");
                string myNum = Console.ReadLine();
                switch (myNum)
                {
                    case "1":
                        map[0, 0] = 1;
                        break;

                    case "2":
                        map[0, 1] = 1;
                        break;

                    case "3":
                        map[0, 2] = 1;
                        break;

                    case "4":
                        map[1, 0] = 1;
                        break;

                    case "5":
                        map[1, 1] = 1;
                        break;

                    case "6":
                        map[1, 2] = 1;
                        break;

                    case "7":
                        map[2, 0] = 1;
                        break;

                    case "8":
                        map[2, 1] = 1;
                        break;

                    case "9":
                        map[2, 2] = 1;
                        break;

                    default:
                        break;
                }

                Console.Clear();

                // 화면 출력
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        if (map[i, j] == 0)
                        {
                            Console.Write("  ");
                        }
                        else if (map[i, j] == 1)
                        {
                            Console.Write("O ");
                        }
                        else
                        {
                            Console.Write("X ");
                        }
                    }
                    Console.WriteLine();
                }

                // 승리 판정
                if (map[0, 0] == 1 && map[0, 1] == 1 && map[0, 2] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[1, 0] == 1 && map[1, 1] == 1 && map[1, 2] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[2, 0] == 1 && map[2, 1] == 1 && map[2, 2] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[0, 0] == 1 && map[1, 0] == 1 && map[2, 0] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[0, 1] == 1 && map[1, 1] == 1 && map[2, 1] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[0, 2] == 1 && map[1, 2] == 1 && map[2, 2] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[0, 0] == 1 && map[1, 1] == 1 && map[2, 2] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }
                else if (map[0, 2] == 1 && map[1, 1] == 1 && map[2, 0] == 1)
                {
                    Console.WriteLine("승리하였습니다!");
                    return;
                }

                // 컴퓨터 차례
                Random rand = new Random();
                while (true)
                {
                    int xRandom = rand.Next(0, 3);
                    int yRandom = rand.Next(0, 3);

                    if (map[yRandom, xRandom] == 0)
                    {
                        map[yRandom, xRandom] = 2;
                        break;
                    }
                }

                Console.Clear();

                // 화면 출력
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        if (map[i, j] == 0)
                        {
                            Console.Write("  ");
                        }
                        else if (map[i, j] == 1)
                        {
                            Console.Write("O ");
                        }
                        else
                        {
                            Console.Write("X ");
                        }
                    }
                    Console.WriteLine();
                }

                // 패배 판정
                if (map[0, 0] == 2 && map[0, 1] == 2 && map[0, 2] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[1, 0] == 2 && map[1, 1] == 2 && map[1, 2] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[2, 0] == 2 && map[2, 1] == 2 && map[2, 2] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[0, 0] == 2 && map[1, 0] == 2 && map[2, 0] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[0, 1] == 2 && map[1, 1] == 2 && map[2, 1] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[0, 2] == 2 && map[1, 2] == 2 && map[2, 2] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[0, 0] == 2 && map[1, 1] == 2 && map[2, 2] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }
                else if (map[0, 2] == 2 && map[1, 1] == 2 && map[2, 0] == 2)
                {
                    Console.WriteLine("패배하였습니다!");
                    return;
                }

            } 
        }
    }

게임은 어찌저찌해서 만들었지만 다른 좋은 방법이 많이 떠오르지 않아서 하드코딩을 많이 했다.

나중에 최대한 하드코딩을 없애고 코드 길이를 많이 줄여봐야겠다.

 

그리고 오늘 코드컨벤션 특강이 있었다. 

코드 컨벤션이란, 읽고 관리하기 쉬운 코드를 작성하기 위한 일종의 코딩 스타일 규약(하나의 작성 표준)이다.

개발자들이 암묵적으로 약속하여, 협업 작업이 원활하게 이루어지도록 한다.

유니티와 C#에서의 이름을 짓는 규칙인, 이름 규칙(Naming Rules)는 5가지 방식이 있다.

그 중 대표적으로 두가지만 정리하였다.

 이름 규칙(Naming Rules)

※ PascalCase (파스칼 케이스)

첫글자와 이어지는 단어의 첫글자를 대문자로 표기

ex) GoodPersonMyKakaoCakeIAmDeveloper

 

※ camelCase (파스칼 케이스)

첫단어는 소문자로 표기하지만, 이어지는 단어의 첫글자는 대문자로 표기

ex) goodPerson, myKaKaoCake

 

※ 내일배움캠프에서 지켜야 할 규칙

1. 유니티에서는 전부 파스칼케이스

 ex) 게임오브젝트, 스크립트 명
2. 덩치가 크거나 public이면 파스칼케이스

 ex) class 명, struct 명, namespace 명, 함수 명, public int Num;
3. Non public이면 _카멜케이스

 ex) private int _num;
4. 함수 내부에서 쓰이는 것들은 카멜케이스

 ex) int count;
5. 이름 정할 때 누가봐도 알 수 있도록 만들기

 

오늘은 생각보다 2주차 숙제를 하는데 시간을 많이 썼다.항상 느끼는 것이지만 알고리즘 풀이나 코드를 고민할 때 시간이 정말 잘 가는 것 같다.내일도 강의를 마저 잘 듣고 완강까지 잘 정리하겠다!

 

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 2주차 (231109)  (0) 2023.11.09
Unity_2기 2주차 (231108)  (0) 2023.11.08
Unity_2기 2주차 (231106)  (0) 2023.11.06
Unity_2기 1주차 (231103)  (0) 2023.11.03
Unity_2기 1주차 (231102)  (0) 2023.11.02