본문 바로가기

C#

C# 1

728x90

python, c, c++ 만 공부하다가 게임개발쪽에 관심이 생겨서 C#공부를 시작하게 되었다.

이번에 멋쟁이사자처럼 유니티 게임 스쿨 1기에 참여하여 1일차 공부한 내용을 복기하는 형식으로 블로그를 시작해보려고 한다.

 

 

<기본정리>

 

WriteLine -> 개행 포함

Write -> 개행 미포함

Console.WriteLine("Hello C#"); -> print 동일 , 괄호안 문자열 출력

Console.Write("Hello C#"); -> print 동일 , 괄호안 문자열 출력

개행은 다른 언어와 동일하게 \n을 사용해서 해도 된다.

- Console.Write("Hello C#\n"); or Console.Write("\n"); 이런식으로 사용가능

 

문자열 결합

Console.WriteLine("Hello C#," + "Good");

 

$ 표시를 활용한 문자열 보관

String name = "C#";
Console.WriteLine($"Hello {name}");

 

 

Consol.ReadKey(); -> 키하나 칠때까지 기다림

 

 

기본 문법

 

1) 예약어

- 예약어는 키워드라고 불린다.

- sbyte, byte, int, float, double ...

 

2) 식별자

- 변수명, 함수명, 클래스명

(1) 조건 : 숫자로 시작할 수 없다.

(2) 특수기호중 언더바 _ 만 사용할 수 있다.

(3) 한글도 사용 가능하다.

(4) 예약어도 가능

 

3) 리터럴

- 소스코드에 포함 된 값

 

4) 상수(const)

- 값이 바뀌는 것은 변수

- 값이 바뀌지 않는 식별자는 상수

 

5) 배열

C#에서 배열은 Zero-based Array 즉 첫번째 요소가 인덱스 0을 갖는다

- Rectangular 배열은 C#에서 [,] 와 같이 괄호안에 콤마로 분리하여 다차원을 표현한다

- C# 배열은 각 요소를 인덱스 해서 사용한다. A배열의 첫 요소는 A[0]이고, 두번째 요소는 A[1]로 표시됨

- 모든 C# 배열은 내부적으로 .NET Framework의 System.Array에서 파생된 것으로 System.Array의 메서드, 프로퍼티들을 사용할 수 있다.

- C#에서는 배열 전체를 전달하기 위해서는 보내는 쪽에서는 배열명을 사용하고, 받는 쪽에서는 동일한 배열타입의 배열을 받아들이면 된다.

-> 배열은 래퍼런스 타입이기 때문에 배열을 다른 객체나 메서드에 전달시 직접 모든 배열 데이터를 복사하지 않고, 배열 전체를 가리키는 참조 값만을 전달하게 된다. (전달하는 쪽 : 레퍼런스 배열명 사용 / 받는 쪽 : 배열 데이터 타입 및 배열 파라미터명을 사용

 

1차원 배열

int[] arr1 = new int[5] {1,2,3,4,5};

 

2차원 배열

int[,] arr2 = new int[4,5] -> 뒤에서 부터 읽으면 편하다 (1차원 요소가 5개있고, 2차원 요소는 4개다)

{

    {1,2,3,4,5}, // 1차원 요소는 5개

    {6,7,8,9,10}, // 2차원 요소는 4개

    {11,12,13,14,15},

    {16,17,18,19,20}

};

 

<제어문>

- if문

if 문은 조건식이 참, 거짓인지에 따라 서로 다른 블록의 코드를 실행하게 한다.

- if (조건식) { 블록1 } else { 블록2 } 문장의 경우, 조건식이 참이면 블럭1을 실행하고, 거짓이면 블록2를 실행한다.

using System;

class Program
{
    static void Main(string[] args)
    {
        int a = -119;
        int val; 

        if (a >= 0)
        {
            val = a;
        }
        else
        {
            val = -a;
        }

        Console.Write(val);
    }
}

- switch문

switch 문은 조건값이 여러 값들을 가질 경우 각 case 별 다른 문장들을 실행할 때 사용한다.

각각의 해당하는 값을 case 문 뒤에 지정하며, 아무것도 속하지 않는 경우는 default 문을 사용해 지정한다.

각 case문 내에서 break 문을 사용하게 되면 해당 case 블럭의 문장들을 실행하고 switch 문을 빠져 나온다.

 

 <반복문>

- for

루프 안에 있는 문장들을 반복적으로 실행

for 루프는 일반적으로 카운터 변수를 이용해 일정 범위 동안 for 루프 안의 블럭을 실행함.

 

 

- foreach

foreach는 다음 시간에 정리하기로 하였다. (수업중 나중에 배우기로함)

 

- while

while 조건식이 true인 동안 계속 while 블럭을 실행

 



- do ~ while

while문과 거의 비슷하나, 마지막 while 조건식까지 가기 전에 do ~ while 사이의 블럭을 미리 한번 실행한다

 

 

<수업중 퀴즈>

 

1)  직각 삼각형 * 이용해서 출력

 

직각삼각형 출력 var1

  1. 빈 문자열 s를 선언
  2. 반복문을 사용하여 4번 반복
  3. 각 반복에서 s에 별표(*)를 추가
  4. s를 출력

 

직각삼각형 출력 var2

  1. 바깥쪽 반복문(for (int i = 0; i < 5; i++))은 0부터 4까지 5번 반복
  2. 안쪽 반복문(for (int j = 0; j < i; j++))은 0부터 i-1까지 i번 반복
  3. 안쪽 반복문에서 Console.Write("*")를 사용하여 별표를 출력
  4. 안쪽 반복문이 끝날 때마다 줄바꿈(Console.WriteLine(""))을 수행하여 다음 줄로 이동

 

 

2) 역 직각삼각형 *로 출력

역 직각삼각형 출력

  1. 바깥쪽 반복문(for (int i = 4; i >= 1; i--))은 4부터 1까지 4번 반복
  2. 안쪽 반복문(for (int j = 1; j <= i; j++))은 1부터 i까지 i번 반복
  3. 안쪽 반복문에서 Console.Write("*")를 사용하여 별표를 출력
  4. 안쪽 반복문이 끝날 때마다 줄바꿈(Console.WriteLine(""))을 수행하여 다음 줄로 이동 

 

 

3) 피라미드 *로 출력

피라미드 출력 var1

  1. 바깥쪽 반복문(for (int i = 0; i < 6; i++))은 0부터 5까지 6번 반복
  2. 첫 번째 안쪽 반복문(for (int j = 0; j < 6 - i; j++))은 공백을 출력, 공백의 개수는 6 - i개
  3. 두 번째 안쪽 반복문(for (int j = 1; j <= 2 * i - 1; j++))은 별표를 출력, 별표의 개수는 2 * i - 1개
  4. 각 줄이 끝날 때마다 줄바꿈(Console.WriteLine())을 수행하여 다음 줄로 이동

 

 

피라미드 출력 var2

  1. for (int i = 0; i < 5; i++):  0부터 4까지의 값을 가지는 변수 i를 반복. 즉, 총 5번 반복
  2. for (int j = i+1; j < 5; j++):  공백을 출력,  j는 i+1부터 4까지 반복.  첫 번째 줄에는 4개의 공백이 출력
  3. for (int j = 0; j <= 2 * i; j++):  별(*)을 출력하는 반복문,  j는 0부터 2 * i까지 반복되므로 첫 번째 줄에는 1개의 별이 출력
  4. Console.WriteLine();: 이 부분은 줄 바꿈을 실행합니다.

 

피라미드 출력 var3

  1. string a = "*";: 문자열 변수 a를 선언하고 초기값으로 "*"을 할당
  2. for (int i = 5; i > 0; i--): 5부터 1까지의 값을 가지는 변수 i를 반복적으로 사용. 즉, 총 5번 반복
  3. for (int j = 1; j < i; j++):  공백을 출력. j는 1부터 i-1까지 반복. 따라서 첫 번째 줄에는 4개의 공백이 출력
  4. Console.WriteLine(a);: 문자열 a를 출력. 첫 번째 줄에는 "*"이 출력
  5. a += "**";: 문자열 a에 "**"를 추가. 따라서 a는 "*"에서 "***"로 변경

 

 

4) wasd 에 맞춰서 해당 * 피라미드 모형으로 출력하기

  • W 키: 사용자가 W 키를 누르면, 콘솔에 'w’를 출력하고, 위에서 진행한 피라미드 패턴 출력. 각 줄마다 별의 개수가 1개에서 시작하여 2개씩 증가시켜 모양을 만듬
  • A 키: 사용자가 A 키를 누르면, 콘솔에 'a’를 출력하고, 270도 돌린 패턴을 출력.  각 줄마다 별의 개수가 1개에서 시작하여 1개씩 증가하다가, 다시 1개씩 감소하게 만들어 모양 구성
  • S 키: 사용자가 S 키를 누르면, 콘솔에 's’를 출력하고, 역 피라미드 패턴(180 회전 패턴) 출력. 각 줄마다 별의 개수가 최대 개수에서 시작하여 2개씩 감소하도록 구성함
  • D 키: 사용자가 D 키를 누르면, 콘솔에 'd’를 출력하고, 90도 돌린 패턴을 출력. 각 줄마다 별의 개수가 1개에서 시작하여 1개씩 증가하다가, 다시 1개씩 감소하도록 구성함

기존에 피라미드 패턴에서 응용하여 ReadKey()를 이용한 제어를 진행해봄

while (true)
{
    ConsoleKeyInfo keyInfo = Console.ReadKey(true);

    if (keyInfo.Key == ConsoleKey.W)
    {
        Console.WriteLine("w");
        int n = 5;
        for (int i = 1; i <= n; i++)
        {
            Console.Write(new string(' ', n - i));
            Console.WriteLine(new string('*', 2 * i - 1));
        }
    }
    else if (keyInfo.Key == ConsoleKey.D)
    {
        Console.WriteLine("d");
        int n = 5;
        for (int i = 1; i <= n; i++)
        {
            Console.WriteLine(new string('*', i));
        }
        for (int i = n - 1; i >= 1; i--)
        {
            Console.WriteLine(new string('*', i));
        }
    }
    else if (keyInfo.Key == ConsoleKey.A)
    {
        Console.WriteLine("a");
        int n = 5;
        for (int i = 1; i <= n; i++)
        {
            Console.Write(new string(' ', n - i));
            Console.WriteLine(new string('*', i));
        }
        for (int i = n - 1; i >= 1; i--)
        {
            Console.Write(new string(' ', n - i));
            Console.WriteLine(new string('*', i));
        }
    }
    else if (keyInfo.Key == ConsoleKey.S)
    {
        Console.WriteLine("s");
        int n = 5;
        for (int i = n; i >= 1; i--)
        {
            Console.Write(new string(' ', n - i));
            Console.WriteLine(new string('*', 2 * i - 1));
        }
    }
}

 

 

5) 사칙연산 계산기

  1. while (true) : 무한 루프로 사용자가 프로그램을 종료하기 전까지 계속해서 새로운 연산을 수행
  2. string operation = Console.ReadLine(); : 사용자로부터 사칙연산자를 입력받음
  3. double.TryParse(Console.ReadLine(), out num1) : 사용자로부터 숫자를 입력받기, TryParse 메소드는 입력 문자열을 double 형식으로 변환할 수 있는지 확인하고, 변환된 값을 num1에 저장. 만약 변환에 실패하면, 사용자에게 유효한 숫자를 다시 입력하라는 메시지를 출력
  4. switch (operation) : 입력받은 연산자에 따라 해당 연산을 수행. 만약 사용자가 0으로 나누려고 하거나 잘못된 연산자를 입력하면, 오류 메시지를 출력
  5. Console.WriteLine($"결과: {result}"); : 연산의 결과를 출력
while (true)
{
    Console.WriteLine("사칙연산을 선택하세요 (+, -, *, /):");
    string operation = Console.ReadLine();

    Console.WriteLine("첫 번째 숫자를 입력하세요:");
    double num1;
    while (!double.TryParse(Console.ReadLine(), out num1))
    {
        Console.WriteLine("유효한 숫자를 입력하세요:");
    }

    Console.WriteLine("두 번째 숫자를 입력하세요:");
    double num2;
    while (!double.TryParse(Console.ReadLine(), out num2))
    {
        Console.WriteLine("유효한 숫자를 입력하세요:");
    }

    double result = 0;
    bool re= true;

    switch (operation)
    {
        case "+":
            result = num1 + num2;
            break;
        case "-":
            result = num1 - num2;
            break;
        case "*":
            result = num1 * num2;
            break;
        case "/":
            if (num2 != 0)
            {
                result = num1 / num2;
            }
            else
            {
                Console.WriteLine("0으로 나눌 수 없습니다.");
                re= false;
            }
            break;
        default:
            Console.WriteLine("잘못된 연산자입니다.");
            re= false;
            break;
    }

    if (re)
    {
        Console.WriteLine($"결과: {result}");
    }
}

 

 

6) 해당 숫자 피보나치 값 출력

  1. while (true) : 무한 루프로 사용자가 프로그램을 종료하기 전까지 계속해서 새로운 연산을 수행
  2. if (int.TryParse(input, out int n) && n >= 0) : 사용자로부터 숫자를 입력받고,  TryParse 메소드를 통해 입력 문자열을 int 형식으로 변환할 수 있는지 확인한 후, 변환된 값을 n에 저장. 만약 변환에 실패하면, 또는 입력받은 숫자가 음수라면, 해당 루프는 다시 시작되게 함
  3. 피보나치 수열의 계산: 피보나치 수열은 첫 번째 항과 두 번째 항이 0과 1이며, 그 이후의 항은 바로 앞의 두 항의 합으로 주어지는 수열이다.  n이 0이나 1일 경우에는 n을 그대로 결과로 사용하고, n이 2 이상일 경우에는 루프를 사용하여 피보나치 수열의 n번째 항을 계산
  4. Console.WriteLine(result); : 계산된 피보나치 수를 출력
while (true)
{
    string input = Console.ReadLine();

    if (int.TryParse(input, out int n) && n >= 0)
    {
        long result = 0;
        if (n == 0) result = 0;
        else if (n == 1) result = 1;
        else
        {
            long a = 0;
            long b = 1;
            for (int i = 2; i <= n; i++)
            {
                long temp = a + b;
                a = b;
                b = temp;
            }
            result = b;
        }

        Console.WriteLine(result);
    }
}

 

c#을 처음해봤더니 너무나도 어려워서 퀴즈 코드를 작성하는데 많은 어려움이 있었지만 복습 열심히해서 계속해서 학습해보겠습니다!

728x90

'C#' 카테고리의 다른 글

C# 2  (1) 2024.05.30