C# 언어, .NET 프레임워크
C# 특징
- OOP 언어, 안전하고 형식이 분명
- 강력한 형식 시스템
변수나 객체의 자료형이 미리 정의되어 있어 안정성과 정확성을 보장한다.
자료형들을 컴파일러 관리해서 안전하게 코드 작성을 할 수 있게해준다.
- 가비지 컬렉션 기능
동적 할당된 메모리를 자동으로 회수해주는 기능.
C#은 메모리를 직접 할당하고 해제하는 대신, .NET 프레임워크에서 가비지 컬렉터가 자동으로 메모리를 해제한다.
- 다양한 플랫폼에서 사용 가능, .NET 프레임워크에서 실행된다.
- C, C++, Java 등 다른 언어들과 문법 및 구조적으로 유사하다.
.NET 프레임워크
- MS에서 개발한 프로그래밍 프레임워크
- 다양한 언어 지원하고, 개발자가 쉽게 애플레케이션을 개발할 수 있게 돕는다.
Visual Studio 설치
- OS에 맞는 버전 설치. (64 비트 or 32 비트 등등)
- 설치 시, .NET 데스크톱 개발 설치 선택
- 로그인 필수.
프로젝트 만들기
- 새 프로젝트 만들기
- 언어 C# 선택
- 콘솔 앱 템플릿 선택
- 경로 및 프로젝트 이름 설정
- (선택) 솔루션 및 프로젝트를 같은 경로에 저장 체크 해제
- (선택) 최상위 문 사용 안 함 체크 해제~~
빌드 및 실행
빌드
실행
- 디버깅 시작
- 디버그 하지 않고 시작 : (바로 실행하고싶은 경우.)
자동완성
- 클래스, 메서드, 변수 등의 일부만 입력하고 tab 키를 누르면 자동 완성됨.
- 입력하다가 놓친 경우 ctrl + space
- 익숙해지면 빠르게 작업할 수 있음.
프로그래밍 구조
코드 구조
using System;
namespace HelloWorld
{
class program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
- using ~~;
- 네임스페이스를 사용하기 위한 키워드 using
- namespace ~~
- 코드를 구성하는데 사용. 클새스 및 기타 네임스페이스의 컨테이너.
- Class ~~
- static void Main()
- C#의 진입점. entry point.
- Main 메서드는 프로그램이 시작할 떄 자동으로 호출되는 메서드.
- Main 메서드는 프로그램 실행에 필수 요소.
전역 using
- 자주 사용되는 네임스페이스에서는 자동으로 추가해 놓은 것.
- 이렇게 추가된 것들은 생략되어 있으나, 실제로는 이미 추가했기에 표시하지 않은 것.
출력
Console.WriteLine(value);
- value 값을 출력.
- 출력하고 문자열을 다음줄로 바꿔줌.
Console.Write(value);
- value 값을 출력.
- 출력하고 문자열을 다음줄로 바꿔주지 않음.
이스케이프 시퀀스
- 문자열 내에 특수 문자를 표현하기 위해 덧붙이는 과정
- 특수 문자를 넣기 위해 사용하는 과정
- 특수 문자들은 그냥 쓰면 본래 역할을 수행하기 때문에 문자열로 취급되지 않음
- 이때 (역슬래시)를 덧붙여서 넣어주면 특수 문자를 문자열로 취급할 수 있음.
\" : 큰 따옴표 삽입
\' : 작은 따옴표 삽입
\t : 탭 추가
\b : 백스페이스 삽입
\r : 현재 줄 맨 앞으로 커서 이동
\n : 개행, 줄바꿈
주석
- 한 줄 주석 : 선호
- 여러줄 주석
주의할 점
- 주석은 코드를 대체하지 않는다.
- 주석의 내용은 정확하고 명확해야한다.
- 주석은 업데이트 되어야한다.
- 주석은 필요한 경우에만 사용해야한다.
자동완성 및 보조기능
IntelliSense
- 자동완성
- 일부만 작성하고 tab
- 놓치면 Ctrl + space
- 코드 템플릿
- for 문 같은 경우, 변수만 바꿀 수 있도록 짜여진 코드를 제공
변수와 자료형
기본 자료형
자료형
자료형 | .NET 데이타 타입 | 크기 (바이트) | 범위 |
---|
sbyte | System.SByte | 1 | -128 ~ 127 |
byte | System.Byte | 1 | 0 ~ 255 |
short | System.Int16 | 2 | -32,768 ~ 32,767 |
ushort | System.UInt16 | 2 | 0 ~ 65,535 |
int | System.Int32 | 4 | -2,147,483,648 ~ 2,147,483,647 |
uint | System.UInt32 | 4 | 0 ~ 4,294,967,295 |
long | System.Int64 | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong | System.UInt64 | 8 | 0 ~ 18,446,744,073,709,551,615 |
float | System.Single | 4 | ±1.5 × 10^-45 ~ ±3.4 × 10^38 |
double | System.Double | 8 | ±5.0 × 10^-324 ~ ±1.7 × 10^308 |
decimal | System.Decimal | 16 | ±1.0 × 10^-28 ~ ±7.9 × 10^28 |
char | System.Char | 2 | 유니코드 문자 |
string | System.String | | 유니코드 문자열 |
bool | System.Boolean | 1 | true 또는 false |
...
float 정밀도 문제
- 0.1f + 0.1f == 0.2f가 다를 수 있다. (정밀도 문제)
실수형의 경우 소수점을 표현하는 과정에서 위와 같은 동치 연산 시에 미세하게 값이 달라지는 오차가 발생할 수 있다.
- 상등 비교는 하지 말기
- 사용할 일이 있다면 Mathf.Approximately 사용.
리터럴
int n = 10;
char a = 'A';
string str = "This is code."
변수명
키워드
- C#에서 미리 정해둔, 선점한 단어들로 변수 선언에 사용할 수 없다.
ex) as, abstract, using, class...
규칙
- 첫 글자는 언더스코어(_)나 알파벳
- 두번째 글자부터 알파벳, 언더스코어, 숫자가 가능
- 대소문자 구분
- 키워드와 같은 이름으로 사용할 수 없다.
코드 컨벤션 = 명명 규칙
사람마다 다른 스타일의 변수 선언이 가능하기 때문에 좀 더 통일된 규칙을 설정.
코드의 가독성과 유지보수성을 높인다.
- 식별자 표기법
- PascalCase :
- 클래스, 메서드, 프로퍼티 이름 등에 사용.
- 단어의 첫 글자는 대문자로 시작, 이후 단어의 첫 글자도 대문자로 표기
ex) ClassName
- camelCase
- 변수, 매개변수, 로컬 변수 이름 등에 사용.
- 단어 첫 글자는 소문자로 시작, 이후 단어의 첫 글자는 대문자로 표기
ex) variableName
- 대문자 약어
- 예외적으로 전체 글자가 모두 대문자인 식별자도 있음.
- 대표적으로 ID, HTTP, FTP 등
- 들여쓰기
- 탭(tab) 또는 스페이스(space) 4칸을 사용하여 코드 블록 들여씀.
- 중괄호 위치
- 빈 줄 사용
- 관련 없는 코드 사이에는 빈 줄을 사용하여 구분
- 메서드, 클래스 등의 블록 사이에는 두 줄을 띄운다.
- 주석
- MS에서 권장하는 컨벤션이 있으니 읽어보면 좋음
형변환
- C#에서 자료형을 다른 변수로 할당하거나 연산을 수행하여 변환하는 것을 의미.
- 자료형이 다른 변수 간에 값을 할당하거나 연산하려면 명시적 형변환이나 암시적 형변환을 해주어야함.
명시적 형변환 (explicit casting)
- 변환하려는 자료형 앞에 (자료형) 을 붙여줌.
int num1 = 10;
long num2 = (long)num;
- 이때 num1이 long으로 아예 바뀌는 것이 아니라, num1의 값을 long으로 일시적으로 변경하여 num2에 넣어주는 것.
암시적 형변환 (implicit casting)
-
작은 자료형에서 더 큰 자료형으로 대입하는 경우
- byte, short, char 등 작은 데이터 타입에서 int, long, float 등 더 큰 데이터 타입으로 대입할 때 암시적 형변환이 발생
byte num1 = 10;
int num2 = num1;
-
리터럴 값이 대입되는 경우
- C# 컴파일러는 리터럴 값의 자료형을 판별하여 변수에 암시적으로 형변환한다.
float result = 1;
-
정수형과 부동소서점형 간의 연산을 수행하는 경우
- 정수형과 부동소수점형의 연산 결과는 부동소수점형으로 변환된다.
int num1 = 10;
float num2 = 3.14f;
float result = num1 + num2;
- 암시적 형변환은 프로그래머가 직접 형변환 코드를 작성하지 않아도 되므로 코드를 간결하게 작성할 수 있다.
- 하지만, 암시적 형변환이 발생하는 경우 자료형을 신중하게 고려하여 코드를 작성해야 한다.
입력
1. Console.ReadLine
string str = Console.ReadLine();
- 사용자로부터 값을 입력받을 때 사용.
- return : string
2. Split
- 한 줄에 여러 값을 입력받아야할 경우가 있음.
string input = Console.ReadLine();
string[] arr = input.split(' ');
int n1 = int.parse(arr[0]);
int n2 = int.parse(arr[1]);
int sum = n1 + n2;
var 키워드
- C# 3.0부터 제공하는 var 키워드
- var 키워드로 변수를 선언하면 변수의 자료형이 컴파일러에 의해 자동으로 결정됨.
- 초기화하는 값의 자료형에 따라서 변수의 자료형이 결정됨.
ex) c++ : auto
javascript : let, var
var num = 10;
var name = "kero";
var pi = 3.141592;
- 자료형을 모를 때 선언해서 사용하면 유용한 기능이지만
코딩이 익숙하지 않을때는 권장하지 않음.
- 자신이 어떤 자료형으로 작업하는지, 자료형에 따라서 어떤 방식으로 작업하거나 형변환이 되는지 익숙해져야하기 때문.
변수명
- 명확하게 지어주는 것이 가독성을 높이는데 도움이 된다.
- 지나친 약어로 되어 있으면 읽는 사람이 파악하는데 어려움이 생긴다.
연산자
- 변수의 산술, 논리, 관계, 비트 연산 등을 수행하는 명령어들
우선순위
- 기본 전제로 괄호()에 묶인 연산을 우선 처리한다.
- 단항 연산자
- 산술 연산자
- 시프트 연산자
- 관계 연산자
- 논리 연산자
- 할당 연산자
문자열 처리 기능 및 메서드
-
문자열 생성
string str1 = "Hello, World";
string str2 = new string('h', 5);
-
연결
string str3 = str1 + " " + str2;
-
분할
string[] arr = str1.Split(',');
-
검색
int index = str1.IndexOf("World");
-
대체
string newStr = str1.Replace("World", "Universe");
-
변환
string str5 = "123";
int num = int.parse(str5);
num += 10;
-
비교
string.Compare(str1, str2);
-
포맷팅
string name = "John";
int age = 30;
string message = string.Format("My name is {0} and {1} years old", name, age);
message = $"My name is {name} and {age} years old";