비주얼스튜디오 단축키
자동 완성 풀렸을 때 : Ctrl + spacebar
주석 달기/풀기 : Ctrl + K C
/ Ctrl + K U
C# 언어의 특징
- 마이크로소프트에서 만든 객체 지향 프로그래밍 언어이며, 안전하고 형식이 분명하다.
- `강력한 형식 시스템`과 `가비지 컬렉션 기능`을 제공한다.
강력한 형식 시스템
은 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입에 대한 안전성과 정확성을 보장하는 시스템이다. 쉽게 이해하자면 자료형들을 컴파일러가 관리해서 조금 더 안전하게 코드를 작성할 수 있게 해준다.가비지 컬렉션 기능
은 동적 할당된 메모리를 자동으로 회수해주는 기능이다. C#에서는 개발자가 메모리를 직접 할당하고 해제하는 대신, .NET 프레임워크에서 가비지 수집기가 자동으로 메모리를 해제해준다. C나 C++ 코드를 작성해보신 분이라면 메모리해제를 굉장히 신경써야한다는 것을 알고 있을 것이다. 그런면에서 C#은 굉장히 친절한 언어이다.
- `강력한 형식 시스템`과 `가비지 컬렉션 기능`을 제공한다.
- “다양한 플랫폼”에서 사용 가능하며, .NET 프레임워크에서 실행된다.
- C, C++, Java 등 다른 언어들과 문법 및 구조적으로 유사하다.
.NET 프레임워크
.NET 프레임워크는 Microsoft에서 개발한 프로그래밍 플랫폼으로, 다양한 프로그래밍 언어를 지원하며, 개발자가 손쉽게 애플리케이션을 개발할 수 있도록 도와준다.
C# 기본 코드 구조
// Hello World.cs
using System;
namespace HelloWorld
{
class program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
using System;
는 C#에서 기본적으로 제공하는 네임스페이스(System 네임스페이스)를 사용하기 위한 코드입니다. Console 클래스를 사용하기 위해 필요합니다.namespace
는 코드를 구성하는 데 사용되며 클래스 및 기타 네임스페이스의 컨테이너입니다.class
는 C# 클래스를 정의하는 키워드입니다. 클래스 이름은 Program로 지정합니다.static void Main()
은 C#의 진입점(entry point)입니다. Main 메서드는 프로그램이 시작할 때 자동으로 호출되는 메서드입니다. Main 메서드는 프로그램 실행에 필수적입니다.Console.WriteLine("Hello World");
는 콘솔에 출력할 내용을 지정하는 코드입니다.WriteLine
메서드는 새 줄을 시작하고 출력할 문자열을 인자로 받습니다.{}
는 코드 블록의 시작과 끝을 나타내는 중괄호입니다.- 모든 C# 문은 세미콜론
;
으로 끝납니다.
전역 using
상단에 using System;
이 보이지 않습니다. 그런데 작동이 잘됩니다.
프로젝트 → 속성 → 전역 using에 들어가봅시다.
위와 같이 자주 사용이 되는 것들은 비주얼스튜디오에서 이미 포함시켜놓았습니다.
그래서 코드에서는 using문
이 보이지 않는 것이고, 실제로는 포함이 되어있는 상태입니다.
리터럴 (literal)
리터럴의 개념과 역할
프로그램에서 직접 사용되는 상수 값으로, 소스 코드에 직접 기록되어 있는 값
C#에서 리터럴
은 컴파일러에 의해 상수 값으로 처리되며, 변수나 상수에 할당되거나 연산에 사용
리터럴의 종류와 예시
C#에서는 다양한 종류의 리터럴을 지원
각각의 리터럴은 다른 형식으로 표현되며, 다양한 값의 범위를 가지고 있습니다.
정수형 리터럴
10 (int)
0x10 (16진수 int)
0b10 (2진수 int)
10L (long)
10UL (unsigned long)
부동소수점형 리터럴
3.14 (double)
3.14f (float)
3.14m (decimal)
문자형 리터럴
'A' (char)
'\\n' (개행 문자)
'\\u0022' (유니코드 문자)
문자열 리터럴
"Hello, World!" (string)
"문자열 내 "따옴표" 사용하기"
@"문자열 내 개행 문자 사용하기"
int num = 10;
float f = 3.14f;
char c = 'A';
string str = "Hello, World!";
int num1 = 0x10;
int num2 = 0b1010;
long num3 = 100000000000000L;
변수 초기화
int num1, num2, num3 = 10; (X)
num1 = num2 = num3 = 10;
한번에 여러개의 변수를 초기화 할 수도 있습니다.
다만 주의할 점은 첫 번째줄처럼 초기화하면 num3
만 10
으로 초기화하기 때문에
두 번째줄처럼 순차적으로 초기화 해주어야 합니다.
변수명
키워드 (Keywords)
C#에서는 이미 예약된 단어들이 있기 때문에 변수, 메소드, 클래스
등의 이름으로 사용할 수 없다. 예시) int int;
(X)
이러한 단어를 키워드(Keywords)
라고 한다.
다음과 같은 키워드들이 있습니다.
abstract as base bool break byte case catch char checked class
const continue decimal default delegate do double else enum event
explicit extern false finally fixed float for foreach goto if
implicit in int interface internal is lock long namespace new
null object operator out override params private protected public
readonly ref return sbyte sealed short sizeof stackalloc static
string struct switch this throw true try typeof uint ulong unchecked
unsafe ushort using virtual void volatile while
식별자 (Identifiers)
식별자
란 변수, 메서드, 클래스, 인터페이스
등에 사용되는 이름을 말합니다. 이 이름은 키워드와 동일하게 사용할 수 없습니다.
식별자를 사용할 때에는 다음과 같은 규칙을 따라야 합니다.
- 첫 문자는 알파벳, 언더스코어(\_)가 올 수 있습니다.
- 두번째 문자부터는 알파벳, 언더스코어, 숫자가 올 수 있습니다.
- 대소문자를 구분합니다.
- 키워드와 같은 이름으로 사용할 수 없습니다.
// 좋은 예시
int playerScore;
string playerName;
float itemPrice;
// 나쁜 예시 (중요 의미 있는 변수명 짓기)
int x1; // 변수명이 의미를 알기 어려움
string a; // 변수명이 명확하지 않음
// 오류 예시
int 1stNumber; // 변수명은 숫자로 시작할 수 없음
string my-name; // 변수명에 하이픈(-)을 사용할 수 없음
float total$; // 변수명에 특수문자($)를 사용할 수 없음
코드 컨벤션(Code convention)
코드 컨벤션(Code convention)
은 개발자들 사이에서 약속된 코드 작성 규칙으로, 코드의 가독성을 높이고 유지 보수를 쉽게 하기 위해 사용됩니다. 코드 컨벤션은 프로그래밍 언어마다 다를 수 있으며, 우리는 다음의 규칙을 따를 예정입니다.
식별자 표기법
PascalCase
: 클래스, 메서드, 프로퍼티 이름
등에 사용됩니다. 단어의 첫 글자는 대문자로 시작하며, 이후 단어의 첫 글자도 대문자로 표기합니다. 예를 들어, ClassName, MethodName, PropertyName과 같은 형태입니다.
camelCase
: 변수, 매개변수, 로컬 변수 이름
등에 사용됩니다. 단어의 첫 글자는 소문자로 시작하며, 이후 단어의 첫 글자는 대문자로 표기합니다. 예를 들어, variableName, parameterName, localVariableName과 같은 형태입니다.
대문자 약어
: 예외적으로 전체 글자가 모두 대문자인 식별자도 있습니다. 대표적으로 ID, HTTP, FTP 등이 있습니다.
들여쓰기
탭(tab)
또는 스페이스(space)
4칸을 사용하여 코드 블록을 들여씁니다.
중괄호 위치
중괄호({})
는 항상 새로운 줄에서 시작합니다.
빈 줄 사용
관련 없는 코드 사이에는 빈 줄을 사용하여 구분합니다.
메서드, 클래스 등의 블록 사이에는 두 줄을 띄어씁니다.
주석
//
한 줄 주석을 사용합니다.
/*
여러 줄 주석을 사용할 때 첫 시작, 끝에는 */
예를 들어, 다음과 같이 C# 코드를 작성하는 것이 일반적인 코드 컨벤션입니다.
class MyClass
{
// 필드는 camelCase 표기법을 사용합니다.
private int myField;
// 프로퍼티는 PascalCase 표기법을 사용합니다.
public int MyProperty { get; set; }
// 메서드는 PascalCase 표기법을 사용합니다.
public void MyMethod()
{
if (true)
{
// 중괄호는 새로운 줄에서 시작합니다.
}
// 코드 블록은 탭(tab) 또는 스페이스(space) 4칸으로 들여씁니다.
// 관련 없는 코드 사이에는 빈 줄을 사용하여 구분합니다.
// 블록 사이에는 두 줄을 띄어씁니다.
/*
여러 줄 주석을 사용할 때는
/ * 를 새로운 줄에서 시작하고,
* / 를 새로운 줄에서 끝내도록 합니다.
*/
// 한 줄 주석은 이렇게 사용합니다.
int a = 10; // 코드 끝에도 한 줄 주석을 사용할 수 있습니다.
}
}
코드 컨벤션을 지키면 코드의 가독성이 좋아지고 유지보수가 용이해집니다. 따라서 C# 개발을 할 때는 코드 컨벤션을 준수하는 것이 좋습니다.
Microsoft C# 코딩 규칙▼
https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/coding-style/coding-conventions
명시적 및 암시적 형변환
명시적 형변환
명시적 형변환
은 다음과 같이 (자료형) 형식으로 수행할 수 있습니다.
int num1 = 10;
long num2 = (long)num1; // int를 long으로 명시적 형변환
주의 사항 : num1
이 long
형식으로 바뀌는게 아님. num2
에는 (long)10
이라는 값이 들어간다고 보면 됨.
암시적 형변환
작은 데이터 타입에서 더 큰 데이터 타입으로 대입하는 경우
byte
, short
, char
등 작은 데이터 타입에서 int
, long
, float
등 더 큰 데이터 타입으로 대입할 때 암시적 형변환이 발생합니다.
byte num1 = 10;
int num2 = num1; // byte형에서 int형으로 암시적 형변환
int num2 = (int)num1;
과 동일하다
리터럴 값이 대입되는 경우
C# 컴파일러는 리터럴 값의 데이터 타입을 판별하여 변수에 암시적으로 형변환합니다.
float result = 1; // 1은 int형 리터럴 값이지만 float형으로 암시적 형변환
float > int
라서 더 큰 형태를 따라감.
정수형과 부동소수점형 간의 연산을 수행하는 경우
정수형과 부동소수점형의 연산 결과는 부동소수점형으로 변환됩니다.
int num1 = 10;
float num2 = 3.14f;
float result = num1 + num2; // int형과 float형의 덧셈에서 float형으로 암시적 형변환
float > int
라서 더 큰 형태를 따라가니까 결과는 float형
암시적 형변환은 프로그래머가 직접 형변환 코드를 작성하지 않아도 되므로 코드를 간결하게 작성할 수 있습니다.
하지만, 암시적 형변환이 발생하는 경우 데이터 타입을 신중하게 고려하여 코드를 작성해야 합니다.
Split / 한줄에 여러 값 입력받기
사용자로부터 여러 개의 값을 한 줄에 입력받고 싶을 때에는 Console.ReadLine 메소드를 사용하여 입력받은 값을 문자열로 받은 후, string.Split 메소드를 사용하여 문자열을 나누어서 처리할 수 있습니다.
예를 들어, 사용자로부터 공백으로 구분된 두 개의 정수를 입력받아 더하는 코드를 작성해보겠습니다.
Console.Write("Enter two numbers: ");
string input = Console.ReadLine(); // "10 20"과 같은 문자열을 입력받음
string[] numbers = input.Split(' '); // 문자열을 공백으로 구분하여 배열로 만듦
int num1 = int.Parse(numbers[0]); // 첫 번째 값을 정수로 변환하여 저장
int num2 = int.Parse(numbers[1]); // 두 번째 값을 정수로 변환하여 저장
int sum = num1 + num2; // 두 수를 더하여 결과를 계산
Console.WriteLine("The sum of {0} and {1} is {2}.", num1, num2, sum);
[출력]
Enter two numbers: 10 20
The sum of 10 and 20 is 30.
int.Parse
가 궁금하다면?▼
2024.03.25 - [C#/데이터 다루기] - [C#] 형변환
var 키워드
var
은 우리가 '특정한 자료형이다' 라고 선언해주는 것이 아니라 컴파일러가 들어오는 값에 맞춰서 자동으로 자료형을 만들어줍니다.
var num = 10; // int 자료형으로 결정됨
var name = "kero"; // string 자료형으로 결정됨
var pi = 3.141592; // double 자료형으로 결정됨
var 키워드를 사용하여 변수를 선언할 때에는 초기화하는 값의 자료형에 따라 변수의 자료형이 결정되므로, 변수를 선언하는 시점에서 변수의 자료형을 정확히 알 수 없는 경우에 유용하게 사용할 수 있습니다.
C#의 주요 연산자 우선순위
괄호 ()
: 괄호로 감싸진 부분은 가장 높은 우선순위로 먼저 계산됩니다.단항 연산자
: 단항 연산자들(++, --, +, -, !
등)은 괄호 다음으로 높은 우선순위를 가집니다.산술 연산자
: 산술 연산자들(\*, /, %, +, -
)은 단항 연산자보다 우선순위가 낮습니다.시프트 연산자
: 시프트 연산자(<<, >>
)는 산술 연산자보다 우선순위가 낮습니다.관계 연산자
: 관계 연산자들(<, >, <=, >=, ==, !=
)는 시프트 연산자보다 우선순위가 낮습니다.논리 연산자
: 논리 연산자들(&&, ||
)는 관계 연산자보다 우선순위가 낮습니다.할당 연산자
: 할당 연산자들(=, +=, -=, \*=, /=
등)는 논리 연산자보다 우선순위가 낮습니다.
문자열 처리 기능 및 메서드
문자열 생성
string str1 = "Hello, World!"; // 리터럴 문자열 사용
string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성
연결
string str1 = "Hello";
string str2 = "World";
string str3 = str1 + " " + str2;
str1 + " "
로 문자열을 먼저 만들고, 만든 문자열 + str2
로 한 번 더 문자열을 만들기 때문에 무겁다. 그래서 이 방법은 비추천
분할
string str = "Hello, World!";
string[] words = str.Split(',');
검색
string str = "Hello, World!";
int index = str.IndexOf("World");
이 코드는 str
문자열에서 "World"
문자열의 첫 번째 인덱스를 찾아 index 변수에 저장합니다.
대체
string str = "Hello, World!";
string newStr = str.Replace("World", "Universe");
이 코드는 str
문자열에서 "World"
문자열을 "Universe"
문자열로 대체한 새로운 문자열 newStr
을 생성합니다. ( 기존의 str은 변경되지 않음 )
변환
문자열을 숫자로 변환 : int.Parse(str);
숫자를 문자열로 변환 : .ToString();
비교
문자열 값 비교
string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2;
문자열 대소 비교
string str1 = "Apple";
string str2 = "Banana";
int compare = string.Compare(str1, str2);
compare 변수는 0보다 작으면 str1이 str2보다 작고, 0이면 str1과 str2가 같으며, 0보다 크면 str1이 str2보다 큽니다.
쉽게 비교하려면 앞 - 뒤
가 크냐 작냐로 생각!
[아무 옵션도 설정하지 않고 비교하는 경우 문자열을 사전식으로 비교하며, 대소문자를 구분합니다. 즉, ‘A’는 ‘a’보다 작습니다.]
포멧팅
문자열 형식화
string name = "John";
int age = 30;
string message = string.Format("My name is {0} and I'm {1} years old.", name, age);
문자열 보간
string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";
기타
섭씨 화씨 온도 변환 공식 : (섭씨 × 9/5) + 화씨
BMI 지수 계산 공식 : 체중kg / (신장m * 신장m)
'스파르타 게임개발종합반(Unity) > TIL - 본캠프 매일 공부 기록' 카테고리의 다른 글
2024.04.23 TIL2 - 캡슐화, 상속, 다형성, 추상화, 객체, 오버로딩, 오버라이딩, 프로퍼티, Virtual, Abstract, 제너릭, out, ref (0) | 2024.04.23 |
---|---|
2024.04.23 TIL1 - VisualStudio 디버깅, 삼항 연산자, List, Dictionary, Stack, Queue, HashSet, struct (0) | 2024.04.23 |
2024.04.19 TIL - 마무리 회고록 (0) | 2024.04.19 |
2024.04.18 TIL - 코루틴(Coroutine) (2) | 2024.04.19 |
2024.04.17 TIL - 깃허브 특강, Canvas(Render Mode, UI 순서, 게임종료) (0) | 2024.04.17 |
댓글