🐧 들어가기 앞서

2주차 강의 정리!


🐧 오늘 배운 것

2주차

  • 조건문과 반복문
  • 배열과 컬렉션
  • 메서드와 구조체
  • 과제

🐧 기억할 것

2주차

조건문

https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EC%A0%9C%EC%96%B4%EB%AC%B8

반복문

https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EB%B0%98%EB%B3%B5

for문 vs while문

for문 - 반복횟수 직관적, 반복조건 한 눈에 확인 가능 , 가독성 좋음

while문 - 반복 조건에 따라 조건문의 실행 횟수가 유동적. 더 간결할 수 있다.

for each

https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EB%B0%B0%EC%97%B4#foreach-%EA%B5%AC%EB%AC%B8

break & continue

https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EC%A0%9C%EC%96%B4%EB%AC%B8%EC%A1%B0%EA%B1%B4-%EC%A0%9C%EC%96%B4

배열

namespace Array2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[,] _map = new int[5, 5]
            {
                {1,1,1,1,1 },
                {1,0,0,0,1 },
                {1,0,1,0,1 },
                {1,0,0,0,1 },
                {1,1,1,1,1 }
            };

            for(int i= 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (_map[i,j] == 1)
                    {
                        Console.Write("■");
                    }
                    else
                    {
                        Console.Write("□");
                    }
                }
                Console.WriteLine();
            }
        }
    }
}

컬렉션

List

  • 크기가 가변적
  • System.Collections.Generic 네임스페이스 추가
  • Length X -> Count 활용
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2);

foreach(int number in numbers)
{
	Console.WriteLine(number);
}

Stack

Stack<int> _stack1 = new Stack<int>();

            _stack1.Push(1);
            _stack1.Push(2);
            _stack1.Push(3);

            int _value = _stack1.Pop(); // _value = 1

Queue

// Queue
            Queue<int> _queue1 = new Queue<int>();
            _queue1.Enqueue(1);
            _queue1.Enqueue(2);
            _queue1.Enqueue(3);

            int _value1 = _queue1.Dequeue(); // _value1 = 1

HashSet

// HashSet
            HashSet<int> _set1 = new HashSet<int>();

            _set1.Add(1);
            _set1.Add(2);
            _set1.Add(3);

            foreach(int _element in _set1)
            {
                Console.WriteLine(_element);
            }

배열 vs 리스트

1. 리스트는 동적으로 크기 조정가능

메모리 사용량 동적 크기 조정가능, 배열보다 많은 메모리 사용.
Linked List로 구현되기 때문에, 배열보다 인덱스로 인한 데이터 접근이 느리다.
연결된 노드 모두 순회해야하기 때문임

2. 코드 복잡도 증가

데이터 추가 삭제 등의 작업이 배열보다 간편 -> 유연성은 즉 코드 복잡도 증가시킬 수 있다.

메서드 구조체

  • 메서드
    코드 블록화, 재사용성, 모듈화 -> 가독성, 유지보수성, 코드 중복제거, 추상화
[접근 제한자][리턴 타입][메서드 이름]([매개변수])
{
	// 메서드 실행 코드
}

반환값 없으면 void !

public void SayHello()
{
	Console.Write("안녕하세요!");
}

public void greetPerson(string name)
{
	Console.WriteLine("안녕하세요, " + name + "님!");
}

public int AddNumbers(int a, int b)
{
	int sum = a + b;
    return sum;

}
  • 호출
[메서드 이름] ([전달할 매개변수]);

AddNumbers(10, 20);
  • 매개변수, 반환값
void PrintFullName(string firstName, string lastName)
{
	Console.WriteLine("full name: " + firstName + "" + lastName);
}

메서드 오버로딩

매개변수의 타입, 순서가 달라야한다. 만약 동일한 자료형이면 매개변수의 갯수가 달라야한다.

-> 지겹도록 공부한 내용! 외우자!

재귀 호출

명확하게 멈추는 지점을 알지 못하면, 무한 반복이 된다.

-> Stack Overflow!

재귀 호출을 적절하게 사용하려면 꼭 멈추는 지점을 파악하자.


🐧 Homeworks

namespace TicTacToeGame
{
    internal class Program
    {
        static char[] _arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static int _player1 = 1;
        static int _choice;
        static int _flag = 0;
        static void Main(string[] args)
        {
            do
            {
                Console.Clear();
                Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
                Console.WriteLine("\n");

                if (_player1 % 2 == 0)
                {
                    Console.WriteLine("플레이어 2의 차례");
                }
                else
                {
                    Console.WriteLine("플레이어 1의 차례");
                }

                Console.WriteLine("\n");
                Map();

                string _line = Console.ReadLine();
                bool _res = int.TryParse(_line, out _choice);

                if (_res == true)
                {
                    if (_arr[_choice] != 'X' && _arr[_choice] != '0')
                    {
                        if (_player1 % 2 == 0)
                        {
                            _arr[_choice] = 'O';
                        }
                        else
                        {
                            _arr[_choice] = 'X';
                        }

                        _player1++;
                    }
                    else
                    {
                        Console.WriteLine($"죄송합니다. {_choice} 행은 이미 {_arr[_choice]}로 표시되어 있습니다.");
                        Console.ReadLine();
                    }
                }
                else
                {
                    Console.WriteLine("숫자를 입력해주세요.");
                }
                _flag = PlayerWin();
            }
            while (_flag != -1 && _flag != 1);

            if (_flag == 1)
            {
                Console.WriteLine($"플레이어 {(_player1 % 2) + 1}이(가) 이겼습니다.");
            }
            else
            {
                Console.WriteLine("무승부");
            }
            Console.ReadLine();
        }

        static void Map()
        {
            // 맵 생성
            Console.WriteLine("     |     |     ");
            Console.WriteLine($"  {_arr[1]}  |  {_arr[2]}  |  {_arr[3]}  ");
            Console.WriteLine("_____|_____|_____");
            Console.WriteLine("     |     |     ");
            Console.WriteLine($"  {_arr[4]}  |  {_arr[5]}  |  {_arr[6]}  ");
            Console.WriteLine("_____|_____|_____");
            Console.WriteLine("     |     |     ");
            Console.WriteLine($"  {_arr[7]}  |  {_arr[8]}  |  {_arr[9]}  ");
        }

        static int PlayerWin()
        {
            if (_arr[1] == _arr[2] && _arr[2] == _arr[3])
            {
                return 1;
            }
            if (_arr[4] == _arr[5] && _arr[5] == _arr[6])
            {
                return 1;
            }
            if (_arr[7] == _arr[8] && _arr[8] == _arr[9])
            {
                return 1;
            }

            else if (_arr[1] == _arr[4] && _arr[4] == _arr[7])
            {
                return 1;
            }
            else if (_arr[2] == _arr[5] && _arr[5] == _arr[8])
            {
                return 1;
            }
            else if (_arr[3] == _arr[6] && _arr[6] == _arr[9])
            {
                return 1;
            }

            else if (_arr[1] == _arr[5] && _arr[5] == _arr[9])
            {
                return 1;
            }
            else if (_arr[3] == _arr[5] && _arr[5] == _arr[7])
            {
                return 1;
            }
            else if (_arr[1] != '1' && _arr[2] != '2' && _arr[3] != '3' && _arr[4] != '4' && _arr[5] != '5' && _arr[6] != '6' && _arr[7] != '7' && _arr[8] != '8' && _arr[9] != '9')
            {
                return -1;
            }
            else { return 0; }
        }
    }
}

🐧 수강후기

TicTacToe 게임을 제작하는게 굉장히 어려웠다.

그래서 풀이를 보고 코드를 따라치며 제작했다.

막상 따라 제작하니 유니티 게임매니저 스크립트와 비슷했다.

앞으로 개발자가 되려면 복잡한 로직의 코드를 머릿속으로 생각하고

펜, 컴퓨터 등등 내가 원하는대로 로직을 표현해야하는데

아직 많이 부족한 것 같아 아쉽다.

코드 리뷰도 꼭 진행하자.


Reference

  • 내일배움캠프

0개의 댓글