[C#]TIL (18) | 2023.08.17

kjg5370·2023년 8월 17일
0

TIL

목록 보기
18/91
post-thumbnail

들어가기 앞서

오늘은 스파르타코딩클럽 C#기초 강의의 2주차 내용을 정리하도록 하겠습니다.
특히 2주차부터는 과제의 난이도가 상승했던것으로 기억합니다.
이번 주차부터 어려워서 잘 못풀었던 과제들을 다시 풀어보려고 합니다.

오늘 배운 것

조건문과 반복문

  • 조건문 : 특정 조건의 결과에 따라 프로그램의 제어 흐름을 변경함.

    • if/else문
      if문 : 조건식의 결과에 따라 실행 여부 결정.
      else문 : if문의 조건식이 거짓일경우 실행.
      else if문 : if문의 조건식이 거짓일 때, 새로운 조건식 사용.

      if (조건식1)
      {
          // 조건식1이 참일 경우 실행할 코드
      }
      else if (조건식2)
      {
          // 조건식2가 참일 경우 실행할 코드
      }
      else
      {
          // 모든 조건식이 거짓일 경우 실행할 코드
      }
    • switch 문
      switch : 변수나 식의 결과에 따라 다른 코드블록을 실행.
      case : 변수나 식의 결과에 따라 실행할 코드를 지정.
      break : switch문을 탈출시켜주는 역할.

       switch (변수나 식)
      {
          case 값1:
              // 값1이 나온 경우 실행되는 코드
              break;
          case 값2:
              // 값2가 나온 경우 실행되는 코드
              break;
          // ...
          default:
              // 모든 case문에 해당하지 않는 경우 실행되는 코드
              break;
      }
    • 3항 연산자 : if 문의 간단한 형태로, 조건식의 결과에 따라 두 값을 선택하는 연산자.

      (조건식) ? 참일 경우 값 : 거짓일 경우 값;

  • 반복문 : 특정 조건을 만족할 때 까지 계속 반복하여 실행하는 문장.

    • for문 : 초기식, 조건식, 증감식을 사용.
      초기식 - 반복문이 시작될 때 단 한 번 실행
      조건식 - 참(true)인 경우 반복문이 계속 실행
      증감식 - 반복문이 실행될 때마다 실행되는 식

      for (초기식; 조건식; 증감식)
      {
          // 조건식이 참인 경우 실행되는 코드
      }
    • while문 : 조건식이 참(true)인 동안 코드를 반복 실행.

      while (조건식)
      {
          // 조건식이 참인 경우 실행되는 코드
      }
    • do - while문 : 코드블록을 무조건 한번은 실행하고 조건을 검사하여 반복.

      do
      {
          // 조건식이 참인 경우 실행되는 코드
      }
      while (조건식);
    • foreach문 : 배열이나 컬렉션에 대한 반복문을 작성할 때 사용.

      foreach (자료형 변수 in 배열 또는 컬렉션)
      {
          // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
      }

배열과 컬렉션

  • 배열 : 동일한 자료형의 값들을 모아놓은 데이터 집합.

    • 1차원 배열
      데이터_유형[] 배열_이름; // 배열 선언
       배열_이름 = new 데이터_유형[크기]; // 배열 초기화
       데이터_유형[] 배열_이름 = new 데이터_유형[크기]; // 배열을 한 줄로 선언 및 초기화
       배열_이름[인덱스] = 값; 
       값 = 배열_이름[인덱스];  // 배열 요소에 접근
    • 다차원 배열 : 여러 개의 배열을 하나로 묶어 놓은 배열
      • 복잡한 데이터 구조를 효율적으로 관리.
      • 2차원 배열은 행과 열로 이루어진 데이터 구조에 적합.
      • 3차원 배열은 면, 행, 열로 이루어진 데이터 구조에 적합.
  • 컬렉션 : C#에서 지원하는 자료구조 클래스, 애플리케이션의 요구가 변경됨에 따라 작업하는 개체 그룹이 동적으로 확장되거나 축소될 수 있음.

    • List : 가변적인 크기를 갖는 배열, 생성할 때는 List에 담을 자료형을 지정.
    • Dictionary : 키와 값의 쌍으로 구성된 데이터를 저장, 중복된 키를 가질 수 없음.
    • Stack : 후입선출(LIFO) 구조를 가진 자료 구조.
    • Queue : Queue는 선입선출(FIFO) 구조를 가진 자료 구조.
    • HashSet : 중복되지 않은 요소들로 이루어진 집합.

메서드와 구조체

  • 메서드(Method) : 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위.

    • 메서드 선언

      [접근 제한자] [리턴 타입] [메서드 이름]([매개변수])
      {
          // 메서드 실행 코드
      }

      접근제한자 : 메서드에 접근할 수 있는 범위 지정(public, private, protected 등)
      리턴 타입 : 반환값의 데이터 타입 지정, 반환값이 없으면 void사용
      메서드 이름: 메서드를 호출할 때 사용하는 이름
      매개변수 : 메서드에 전달되는 입력 값
      실행 코드: 중괄호({})안에서 수행하는 작업을 구현하는 코드

    • 메서드 호출 방법

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

    • 매개변수와 반환값

      • 매개변수
        매개변수는 메서드의 선언부에 정의되며, 0개 이상의 매개변수를 정의할 수 있음.
        메서드 호출 시 전달되는 값에 따라 동적으로 결정되며, 호출 시에는 해당 매개변수의 값을 전달해야 함.
      • 반환값
        수행한 작업의 결과를 호출자에게 반환하는 값.
        메서드의 리턴 타입에 지정되며, 해당 타입의 값을 반환해야 함.
        void는 메서드의 리턴 타입으로 사용되며, 해당 메서드가 값을 반환하지 않음을 나타냄.
    • 메서드 오버로딩
      동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의.
      동일한 이름으로 매개변수의 개수, 타입, 순서를 다르게 정의하여 호출 시 매개변수의 형태에 따라 선택되도록 함.

    • 재귀호출
      메서드가 자기 자신을 호출하는 것, 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나.

      public int Factorial(int num) //재귀호출로 팩토리얼 구현
      {
      	int result = 0;
         
          if(num == 1)
          {
          	result = 1;
          }
          else
          {
          	result = num * Factorial(num - 1);
          }
          return result;
      }
  • 구조체 : 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법,
    값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공.

    • 구조체 선언 - struct 키워드를 사용하여 선언
      struct Person
      {
          public string Name;
          public int Age;
      
          public void PrintInfo()
          {
              Console.WriteLine($"Name: {Name}, Age: {Age}");
          }
      }
    • 구조체 사용 : 멤버에는 접근할 때   .   연산자를 사용.
      Person person1;
       person1.Name = "gildong";
       person1.Age = 17;
       person1.PrintInfo();

기억 할 것 & 진행 사항

  • 중첩조건문 : 하나의 조건문 안에 또 다른 조건문이 들어있는 형태.

    if (조건)
    {
        if (조건식1)
        {
            // 조건에 부합하고, 조건식1이 참일 경우 실행할 코드
        }
        else if (조건식2)
        {
            // 조건에 부합하고, 조건식2가 참일 경우 실행할 코드
        }
        else
        {
            // 조건에 부합하고, 모든 조건식이 거짓일 경우 실행할 코드
        }
    } ...
  • for문과 while문
    for문 - 반복횟수가 직관적, 가독성이 좋음.
    while문 - 반복조건에 따라 실행횟수가 유동적, 코드가 간결할 수 있음.

  • 중첩 반복문 : 반복문도 중첩해서 사용할 수 있음.

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            Console.WriteLine("i: {0}, j: {1}", i, j);  
        } //총 i x j 번 실행.
    }
  • break는 반복문을 중지시키는 역할.

  • continue는 현재 반복을 중지하고 다음 반복을 진행하는 역할.

  • 배열은 선언된 크기만큼 공간을 할당받음.

  • 컬렉션은 object 형식을 사용하여 데이터를 관리하기 때문에, 박싱(Boxing)과 언방식(Unboxing)이 발생.
    컬렉션을 많이 사용하게 되면, 프로그램의 성능 저하가 옴.

    • 배열과 리스트
      리스트는 동적으로 크기를 조정할 수 있어 배열과는 다르게 유연한 데이터 구조를 구현가능.
      하지만 리스트를 무분별하게 사용하는 것은 좋지 않은 습관.

      1.메모리 사용량 증가 - 배열보다 많은 메모리 사용.
      2.데이터 접근 시간 증가 - 연결 리스트로 구현되기 때문에 데이터접근이 배열보다 느림.
      3.코드 복잡도 증가 - 리스트를 사용할 때 추가 삭제등의 작업을 처리하는 코드를 작성해야되므로 가독성과 유지보수성이 떨어짐.
  • 재귀 호출의 활용과 주의점
    종료 조건을 명확히 정의해야 함, 종료조건을 만족하지 못하면 스택 오버플로우 등의 오류가 발생할 수 있음.
    메모리 사용량이 크고 실행속도가 느릴 수 있으므로, 필요한 경우에만 사용.

  • 매서드 활용사례

    • 반복적으로 사용되는 코드를 메서드로 분리함으로써 코드의 재사용성을 높임.
    • 긴 코드를 작은 단위로 분리하여 메서드로 정의하면, 코드가 간결해지고 가독성이 향상.
    • 코드의 일부분을 의미 있는 이름으로 추상화하고, 해당 메서드를 호출함으로써 코드의 의도를 명확히 전달 가능.
    • 코드를 작은 단위로 분리하여 메서드로 관리하면, 유지보수가 용이.

과제 틱택토(콘솔)

일단 필요한 변수를 선언합니다.

		static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static int player = 1;
        static int choice;
        static int flag = 0;

do while문으로 화면에 표시할 보드와 제목 등을 만듭니다.

  • title함수
   static void title()
        {
            Console.Clear();
            Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
            Console.WriteLine();
            if (player == 1)
            {
                Console.WriteLine("플레이어 1의 차례");
            }
            else
            {
                Console.WriteLine("플레이어 2의 차례");
            }
            Console.WriteLine();
        }
  • setboard함수
 static void setboard()
        {
            // Line 1
            Console.WriteLine("     |     |     |");
            Console.WriteLine("  {0}  |  {1}  |  {2}  |", arr[1], arr[2], arr[3]);
            Console.WriteLine("_____|_____|_____|");
            // Line 2
            Console.WriteLine("     |     |     |");
            Console.WriteLine("  {0}  |  {1}  |  {2}  |", arr[4], arr[5], arr[6]);
            Console.WriteLine("_____|_____|_____|");
            // Line 3
            Console.WriteLine("     |     |     |");
            Console.WriteLine("  {0}  |  {1}  |  {2}  |", arr[7], arr[8], arr[9]);
            Console.WriteLine("_____|_____|_____|");
        }

그다음 플레이어가 이겼는지 체크하는 checkwin함수를 만듭니다.

static int CheckWin()
        {
            // 가로 승리 조건
            if (arr[1] == arr[2] && arr[2] == arr[3])
            {
                return 1;
            }
            else if (arr[4] == arr[5] && arr[5] == arr[6])
            {
                return 1;
            }
            else 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; }
        }

마지막으로 메인함수에서 do-while문으로 함수를 계속 불러주면서 게임을 실행합니다.

  string line = Console.ReadLine();

                if (int.TryParse(line, out choice))

위 코드로 입력을 받아서 조건문으로 다른 값이 들어왔을 때 걸러주는 작업을 하였습니다.
중첩반복문으로 조건을 추가해서

  if (choice > 0 && choice < 10)
                 if (arr[choice] != 'X' && arr[choice] != 'O')
                  arr[choice] = (player % 2 == 0) ? 'O' : 'X';
                            player++;

게임을 진행되게 하고

flag = CheckWin();

flag 변수로 게임이 끝났는지 판단합니다.
실행결과 잘 되는것을 확인했습니다.

현재 진행 사항

  • 체크리스트
    • 개발 환경 설정
    • 기본 코드 구조
    • 변수와 자료형
    • 연산자 문자열 처리
    • 조건문과 반복문
    • 배열과 컬렉션
    • 매서드와 구조체 -> 여기까지 정리중
    • 클래스와 객체
    • 상속과 다형성
    • 고급 문법 및 기능
    • 인터페이스와 열거형
    • 예외 처리 및 값형과 참조형
    • 델리게이트, 람다 및 LINQ
    • 고급 자료형 및 기능
    • 알고리즘 기초
    • 정렬 알고리즘
    • 탐색 알고리즘
    • 고급 알고리즘
    • 문제해결 전략과 실전 연습 -> 현재 여기까지 강의 수강

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 09:30 : 팀원 간 인사 및 하루 계획 작성
      • 09:30 ~ 14:00 : 지급 받은 강의 복습
      • 12:00 ~ : 프로그래밍 기초 주차 개인과제 발제
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00 : 지급 받은 강의 복습
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 지급 받은 강의 복습
      • 20:00 ~ 20:30 : 6조 회의
      • 20:30 ~ 21:00 : TIL,마무리 회고 진행
profile
학생입니다

0개의 댓글