기본 문법
기본 자료형
개발자가 별도로 코드를 만들지 않아도 C# 언어에서 자체적으로 제공하는 데이터 형식.
정수형 기본 타입
이름 | 범위 | .NET Framework 형식 | 의미 |
---|---|---|---|
sbyte | -128~127 | System.SByte | 부호 있는 8비트 정수 |
long | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | System.Int64 | 부호 있는 64비트 정수 |
ulong | 0 ~ 18,446,744,073,709,551,615 | System.UInt64 | 부호 없는 64비트 정수 |
실수형 기본 타입
이름 | 크기 | .NET Framework 형식 |
---|---|---|
float | 4바이트 | System.Single |
double | 8바이트 | System.Double |
decimal | 16바이트 | System.Decimal |
실수형 타입 선택 기준
소수점이 있는 연산을 할 때는 일반적으로 double을 사용한다. 하지만 빠른 처리 속도가 필요한 곳에서 연산하려는 값이 4바이트 실수로 충분하다면 float을 사용 할 수 있다.
decimal의 경우 반올림 오차가 허용되지 않는 회계 계산에 적합하다.
실수형 타입의 접미사
float f = 5.2f; //float의 경우에는 숫자 값 다음에 f.
double d = 10.5;
decimal money = 200.099m //decimal의 경우에는 숫자 값 다음에 m.
문자형 기본 타입
이름 | 범위 | .NET Framework 형식 | 의미 |
---|---|---|---|
char | U+0000 ~ U+FFFF | System.Char | 유니코드 16비트 문자 |
string | 문자열 | System.String | 유니코드 문자열 |
문자는 작은 따옴표를 사용해 표현한다.
char ch = 'A';
Console.WriteLine(ch); //A 문자 출력
char single quote = '\'' //작은 따옴표는 역슬래시 입력해야 표현가능.
char slash = '\\' //역슬래시는 두번입력해야 역슬래시로 표현.
기본 문법 요소
식별자
임의로 선택해서 이름지을 수 있는 단어.
변수
닷넷에서 변수의 종류는 값 형식, 참조 형식 이렇게 2가지 변수가 있다.
값 형식 & 참조 형식 변수
- 값 형식 : 값 자체가 스택 영역에 저장된다. 정수형, 실수형, 불린형 기본 타입 변수가 값 형식이다.
- 참조 형식 : 값은 힙 영역에 저장되고 그 값의 주소값이 스택 영역에 저장된다. 초기화되지 않은 모든 참조형 변수는 null 값을 가진다. string, 배열, 클래스, object
- 대입 : 값 형식끼리 대입했을 때는 스택 내부에서 각각 다른 위치에 동일한 값이 복사된다. 참조 형식의 경우에는 힙 메모리에 하나의 값만 위치한 상황에서 스택의 변수들이 같은 힙 위치를 가리킨다.
기본값
- bool : false
- 숫자 : 0
- 참조 형식 : null
상수
상수는 const 예약어를 쓰는데, 컴파일 할 때 값이 결정되어야 한다.
int n = Math.Max(0, 5); //프로그램을 실행할 때 n값이 결정
const int maxN = Math.Max(0, 5); //maxN은 상수이므로 컴파일할 때 값이 결정되어야 하는데
//Max 메소드는 런타임에 실행되므로 컴파일러가 어떤 값을 넣을지 몰라서 오류 발생
const int n = 5 * 100 / 2 //이런 단순 수식은 컴파일러가 계산해서 대입 가능 (상수식 이라고 함)
배열
배열도 참조 형식이기 때문에 배열의 값을 힙에 할당한다.
int [] products = new int[5]; //이런 식으로 선언.
int [] products = new int[5] {1,2,3,4,5}; //배열 개수 지정 초기화.
int [] products = new int[] {1,2,3,4,5}; //배열 개수 미지정.(컴파일러가 알아서 계산해서 크기 5로 지정)
string도 char의 배열이다.
관계 연산자, 논리 연산자
- 배타적 논리합(XOR) 연산자 : ^
- 단락 계산, 단축 평가 : 한 조건에 의해서 다른 조건의 결과값에 상관 없이 무조건 참, 거짓이 나오기 때문에 다른 조건은 실행도 되지 않는 것. (|| 일 때 한 쪽이 참, &&일 때 한 쪽이 거짓)
int n = 50;
int x = 100;
if (x > 10 || n++ > 10) // 단락 계산이 발생하기 때문에 n++부분이 실행되지 않아서 n값은 그대로 50에서 머무른다.
{
//생략
}
//증감 연산자는 논리 연산자의 피연산자에 해당하는 식에 쓰는 것 보다 따로 분리해서 쓰는 것이 바람직하다.
조건문
- switch 문에서 C/C++와 달리 case문에 break를 포함시키는게 강제사항이라서 break가 없으면 오류가 발생한다. case 문에 실행코드 없으면 생략 가능
반복문
- foreach 문 : foreach (표현식요소_자료형 변수명 in 표현식) 구문;
int [] arr = new int[] {1,2,3,4,5};
foreach (int elem in arr)
{
Console.WriteLine(elem); //1,2,3,4,5가 다섯줄에 걸쳐 출력된다.
}
//다음과 같이 var를 사용하면 다양한 타입에 대해서 foreach를 사용 가능하다.
foreach (var elem in arr)
{
//생략
}
문제풀이
for문을 이용한 별찍기
class StarTest
{
static void Main(string[] args)
{
int num;
Console.WriteLine("반복 횟수를 입력하세요.");
for (;;)
{
try
{
num = Convert.ToInt32(Console.ReadLine());
if (num <= 0)
{
Console.WriteLine("0보다 작거나 같은 수는 입력할 수 없습니다.");
}
else
{
for (int i = 0; i < num; i++)
{
for (int j = 0; j < i + 1; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
break;
}
}
catch (FormatException)
{
Console.WriteLine("정수값을 입력해주세요.");
}
catch (OverflowException)
{
Console.WriteLine("int 범위의 값을 입력해주세요.");
}
Console.WriteLine("다시 입력해주세요.");
}
}
}
}
질문사항
유니코드와 인코딩 방식
유니코드란?
유니코드는 기존의 여러 문자 표현 방식들의 문제점을 해결하기 위해서 전 세계의 모든 문자를 컴퓨터로 표현할 수 있게 문자마다 고유의 Character code를 부여하는 방식이다. 그래서 기존에 발생하던 각 언어와 문자 체계에 따른 충돌 문제를 해결하였다. 유니코드를 사용하는 환경에서는 세계 각국의 언어를 깨뜨리지 않고 사용할 수 있다.
코드 포인트
코드 포인트는 유니코드에서 문자에 매겨진 번호를 의미한다. 표기 방식은 U+0000 으로 Unicode를 의미하는 U+와 코드포인트 값을 16진수로 적는다.
알파벳 'A'는 U+0041, 한글 '가'는 U+AC00 으로 표기한다.
유니코드의 구조
UCS(Universal Character Set)는 ISO 10646으로 정의된 문자 인코딩의 국제 표준이다. 유니코드는 UCS의 하위 집합이고, UCS의 구조를 알면 유니코드의 구조를 알 수 있다. 아래 그림은 UCS의 구조와 의미를 정리한 그림이다.
여기서 유니코드는 Group 00의 Plane 00 ~ 16을 사용한다. 총 17개의 Plane을 포함하므로 65536 x 17을 계산해보면 약 111만 개의 문자를 저장 가능한 것을 알 수 있다. 그리고 Plane 00의 영역을 BMP(기본 언어판) 이라고 지칭하는데, 주로 사용되는 문자들은 BMP 내에 있다.
유니코드는 2바이트 체계다. 하지만 계산을 해보면 17개의 Plane을 표현하는데 필요한 5 비트, Cell번호를 표현하는데 필요한 16비트를 합쳐 총 21비트가 유니코드의 모든 문자를 표현하기 위해서 필요하다는 것을 알 수 있다. (Group 표현은 Group 00만을 사용하므로 생략한다.)
유니코드와 한글
유니코드는 한글의 표현 방식을 완성형, 조합형 모두 지원한다. 완성형이란 완성된 글자 하나하나를 바로 쓸 수 있도록 번호를 부여하여 저장한 것이고, 조합형은 한글의 초성, 중성, 종성으로 쓰이는 자, 모음을 저장하여 조합하여 쓸 수 있는 방식이다. 현대 한글 11,172자가 완성형 방식 처리에 쓰이고 있어서, 일상 생활의 거의 모든 단어를 표현할 수 있다. 조합형 방식은 자모음 하나 하나를 조합하기 때문에 용량이 더 크다는 문제 때문에 완성형에 없는 옛 한글을 표현하는 용도 이외에는 잘 쓰지 않는다.
유니코드의 인코딩 방식
여러 인코딩 방식이 있지만 주로 사용하는 UTF-8, UTF-16, UTF-32에 대해서 설명한다.
-
UTF-32
UTF-32는 32비트로 표현하는 방식이다. 모든 코드 포인트를 32비트에 1:1로 매칭하고, 남는 11개의 앞 비트는 모두 0으로 채운다.
인코딩한 값 자체가 코드 포인트이기 때문에 해당 유니코드 문자를 찾기 쉽다. UTF-8 이나 UTF-16에 비해서 공간을 많이 차지하기 때문에 메모리 공간에 큰 제약이 없거나 고정 길이 인코딩이 필요할 때 쓰인다. 주로 Unix 환경에서 문자열을 메모리에서 다룰 때 사용된다. -
UTF-8
UTF-8은 기본 문자 표현에 1byte를 사용한다. 그리고 ASCII랑 호환이 가능하다. 이런 이유로 웹이나 DB에서는 주로 UTF-8을 쓴다. 그리고 NULL 문자가 나오지 않기 때문에 중간에 NULL 값이 있으면 문제가 될 수 있는 자료형에도 이용 가능하다. 알파벳 표현시에는 1byte로 표현하지만 한글은 3byte로 표현한다. -
UTF-16
UTF-16은 기본 문자 표현에 2byte를 사용한다. 알파벳이나 한글이나 똑같이 2byte로 표현한다. BMP(기본 다국어 평면)상의 문자는 모두 2byte로 나타낼 수 있다. 바이트의 순서가 순차적이면 빅 엔디안, 역순이면 리틀 엔디안이라고 한다. 이것을 나타내기 위해서 리틀 엔디안에선 BOM을 넣는다. 하지만 대부분의 시스템은 빅 엔디안을 사용하기 때문에 BOM을 제대로 인식 못하고 문자로 읽어버려서 에러를 낼 가능성이 있기 때문에 웹 상에서는 UTF-8을 주로 쓴다. 닷넷 프레임워크의 기본 인코딩이 UTF-16이다.
//BOM 관련된 것은 다시 정리