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
- 빈 문자열 s를 선언
- 반복문을 사용하여 4번 반복
- 각 반복에서 s에 별표(*)를 추가
- s를 출력
직각삼각형 출력 var2
- 바깥쪽 반복문(for (int i = 0; i < 5; i++))은 0부터 4까지 5번 반복
- 안쪽 반복문(for (int j = 0; j < i; j++))은 0부터 i-1까지 i번 반복
- 안쪽 반복문에서 Console.Write("*")를 사용하여 별표를 출력
- 안쪽 반복문이 끝날 때마다 줄바꿈(Console.WriteLine(""))을 수행하여 다음 줄로 이동
2) 역 직각삼각형 *로 출력
역 직각삼각형 출력
- 바깥쪽 반복문(for (int i = 4; i >= 1; i--))은 4부터 1까지 4번 반복
- 안쪽 반복문(for (int j = 1; j <= i; j++))은 1부터 i까지 i번 반복
- 안쪽 반복문에서 Console.Write("*")를 사용하여 별표를 출력
- 안쪽 반복문이 끝날 때마다 줄바꿈(Console.WriteLine(""))을 수행하여 다음 줄로 이동
3) 피라미드 *로 출력
피라미드 출력 var1
- 바깥쪽 반복문(for (int i = 0; i < 6; i++))은 0부터 5까지 6번 반복
- 첫 번째 안쪽 반복문(for (int j = 0; j < 6 - i; j++))은 공백을 출력, 공백의 개수는 6 - i개
- 두 번째 안쪽 반복문(for (int j = 1; j <= 2 * i - 1; j++))은 별표를 출력, 별표의 개수는 2 * i - 1개
- 각 줄이 끝날 때마다 줄바꿈(Console.WriteLine())을 수행하여 다음 줄로 이동
피라미드 출력 var2
- for (int i = 0; i < 5; i++): 0부터 4까지의 값을 가지는 변수 i를 반복. 즉, 총 5번 반복
- for (int j = i+1; j < 5; j++): 공백을 출력, j는 i+1부터 4까지 반복. 첫 번째 줄에는 4개의 공백이 출력
- for (int j = 0; j <= 2 * i; j++): 별(*)을 출력하는 반복문, j는 0부터 2 * i까지 반복되므로 첫 번째 줄에는 1개의 별이 출력
- Console.WriteLine();: 이 부분은 줄 바꿈을 실행합니다.
피라미드 출력 var3
- string a = "*";: 문자열 변수 a를 선언하고 초기값으로 "*"을 할당
- for (int i = 5; i > 0; i--): 5부터 1까지의 값을 가지는 변수 i를 반복적으로 사용. 즉, 총 5번 반복
- for (int j = 1; j < i; j++): 공백을 출력. j는 1부터 i-1까지 반복. 따라서 첫 번째 줄에는 4개의 공백이 출력
- Console.WriteLine(a);: 문자열 a를 출력. 첫 번째 줄에는 "*"이 출력
- 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) 사칙연산 계산기
- while (true) : 무한 루프로 사용자가 프로그램을 종료하기 전까지 계속해서 새로운 연산을 수행
- string operation = Console.ReadLine(); : 사용자로부터 사칙연산자를 입력받음
- double.TryParse(Console.ReadLine(), out num1) : 사용자로부터 숫자를 입력받기, TryParse 메소드는 입력 문자열을 double 형식으로 변환할 수 있는지 확인하고, 변환된 값을 num1에 저장. 만약 변환에 실패하면, 사용자에게 유효한 숫자를 다시 입력하라는 메시지를 출력
- switch (operation) : 입력받은 연산자에 따라 해당 연산을 수행. 만약 사용자가 0으로 나누려고 하거나 잘못된 연산자를 입력하면, 오류 메시지를 출력
- 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) 해당 숫자 피보나치 값 출력
- while (true) : 무한 루프로 사용자가 프로그램을 종료하기 전까지 계속해서 새로운 연산을 수행
- if (int.TryParse(input, out int n) && n >= 0) : 사용자로부터 숫자를 입력받고, TryParse 메소드를 통해 입력 문자열을 int 형식으로 변환할 수 있는지 확인한 후, 변환된 값을 n에 저장. 만약 변환에 실패하면, 또는 입력받은 숫자가 음수라면, 해당 루프는 다시 시작되게 함
- 피보나치 수열의 계산: 피보나치 수열은 첫 번째 항과 두 번째 항이 0과 1이며, 그 이후의 항은 바로 앞의 두 항의 합으로 주어지는 수열이다. n이 0이나 1일 경우에는 n을 그대로 결과로 사용하고, n이 2 이상일 경우에는 루프를 사용하여 피보나치 수열의 n번째 항을 계산
- 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#을 처음해봤더니 너무나도 어려워서 퀴즈 코드를 작성하는데 많은 어려움이 있었지만 복습 열심히해서 계속해서 학습해보겠습니다!