내장형과 사용자 정의형 2가지로 구분된다

내장형
(Built In Type)은 가장 기본적인 타입이며 값의 범위나 형태가 CTS에 의해 완전히 고정되어 있다.
short는 항상 16비트 길이를 가지며 -32768~32767범위의 정수를 담는다.
사용자는 내장형의 형태를 변경하거나 수정할 수 없으며 단순히 사용하기만 해야 한다. 
내장형에는 정수형, 실수형, 문자형, 논리형 4가지가 있는데 아주 빈번하게 사용되는 원시 타입이다.

사용자 정의형인 열거형과 구조체는 열거 멤버나 필드, 메서드를 정의할 수 있다.


정수형

소수점 이하가 없는 정수를 기억하는 타입이다.
컴퓨터가 원래 정수적인 존재이기 때문에 가장 흔하게 사용된다.
크기와 부호의 유무에 따라 다음 8가지 종류가 있다.
괄호안에는 각 타입이 기억할 수 있는 정수의 범위를 표시했다.

크기

부호있음

부호없음

1

sbyte(-128~127)

byte(0~255)

2

short(-32768~32767)

ushort(0~65535)

4

int(-231~231-1)

uint(0~232-1)

8

long(-263~263-1)

ulong(0~264-1)


다양한 크기의 정수 타입이 준비되어 있으므로 용도에 꼭 맞는 타입을 선택해 사용하면 된다.
예를 들어 성적은 0~100사이의 범위를 가지므로 byte형이면 충분하고 좌표값은 short 정도면 부족하지 않다. 4바이트의 int형 정도면 일반적인 정수를 기억하기에 무난하다. 천문학처럼 아주 큰 수가 필요하다면 64비트의 long형을 사용하는데 무려 1800경이라는 무지막지하게 큰 수를 표현할 수 있다.

정수 형태의 상수(Literal)는 아라비아 숫자로 0, 1234, 629 등으로 표기하되 별다른 표기가 없으면 int 타입이다. 부호없는 상수나 긴 상수를 표기할 때는 1234U, 1234L과 같이 아라비아 숫자 뒤에 U 또는 L 접미사를 붙인다. 이때 접미사는 u, l 소문자로 쓸 수도 있지만 소문자 l이 아라비아 숫자 1과 잘 구분되지 않으므로 가급적이면 대문자를 쓰는 것이 좋다. 16진 상수를 표기할 때는 0x 또는 0X 접두어를 붙여 0x4a, 0xb0a1 식으로 쓰며 16진수 표기에 사용되는 a~f는 대소문자를 구분하지 않는다. 아쉽게도 8진수와 2진수 표기법은 지원하지 않는다.


실수형

실수형은 소수점 이하를 표현할 수 있는 수이다. 크기와 정밀도에 따라 세 가지 종류가 있으며 세 종류 모두 부호를 표현할 수 있다.

타입

크기(바이트)

범위

float

4

1.5*10-45~3.4*1038

double

8

5.0*10-324~1.7*10308

decimal

16

1.0*10-28~7.9*1028


float와 double은 실수를 표현하는 국제 표준 포맷(IEEE 754) 규격을 따르므로 C/C++, 자바 등의 언어와 크기, 범위, 정밀도가 완전히 같으며 내부적인 구조도 동일하다. float형은 소수점 이하 7자리까지 유효하며 double형은 소수점 이하 15자리까지 유효하다. 그 이하의 소수점 자리수는 약간의 오차가 발생할 수도 있다는 얘기다. double 타입의 오차는 대략 1/100조 정도에 불과하므로 실생활에서 사용되는 실수들을 기억하기에는 무난하다.

만약 좀 더 충분한 정밀도를 요구한다면 16바이트 길이의 decimal 타입을 사용한다. decimal은 소수점 이하 28자리까지 유효하기 때문에 굉장히 정확한 값을 표현한다. 예를 들어 금액을 다루는 회계 분야라든가 극소 세계를 다루는 유전 공학, 양자 역학에서는 조금의 오차도 용납되지 않으므로 이런 타입이 필요하다. 그렇다고 해서 decimal이 오차가 전혀 없다는 얘기는 아니다. 다만 무시해도 될 정도로 지극히 작을 뿐이다

실수 상수는 별다른 지정이 없으면 double 타입으로 취급된다. float 형의 상수는 뒤에 F 접미어를 붙이고 decimal 형의 상수는 뒤에 M을 붙인다. 정수 상수의 접미어와 마찬가지로 대소문자를 구분하지 않으므로 f나 m으로 써도 무방하다. 상수의 타입도 때로는 중요한 의미를 가질 수 있는데 다음 문장은 에러이다

decimal d = 1.234567890123456789;

변수 d는 decimal 타입이지만 이 변수에 대입되는 초기값인 상수는 double 타입이기 때문에 양쪽의 타입이 맞지 않다. 상수 제일 뒤에 m을 붙여야 decimal 타입으로 인정되어 에러없이 초기화된다. 이번에는 다음 코드를 보고 문제점을 파악해 보자.

float f = 3.14;

실수형 변수에 실수형 상수를 대입했으므로 아무 문제가 없어 보인다. 그러나 우변의 3.14는 double이므로 float에 그냥 대입할 수 없다. 반드시 3.14f로 접미를 붙여 float형 상수임을 명시해야 한다.


논리형

논리형은 참, 거짓 또는 예, 아니오 두 가지 상태만을 가지는 진위형을 표현한다. 타입 이름은 bool이며 true 또는 false 중 하나의 값을 가진다. C언어는 별도의 진위형이 없고 BOOL 이라는 열거형을 대신 사용하며 C++은 bool 타입을 지원하기는 하지만 정수형과 호환되어 실수할 위험이 굉장히 많았다. 하지만 C#은 bool과 int, short 등의 정수형이 호환되지 않으므로 서로 대입
되지 못하며 용도가 분명히 구분된다. bool 타입은 if나 while 같은 조건문에 사용된다.

if (num == 3) { ... }

이 조건 식은 num이 3일 때 어떤 처리를 하라는 문장이다. num == 3 비교 연산문은 num이 3이면 true를 리턴하고 그렇지 않으면 false를 리턴하며 if 는 비교 연산문의 결과에 따라 다음 동작의 실행 여부를 결정한다. 조건문 자리에 bool형이 아닌 다른 타입은 올 수 없다. 예를 들어 다음 문장을 보자.

if (num = 3) { ... }

조건문 자리에 대입문이 사용되었으므로 에러로 처리된다. 그러나 C++에서는 이 코드가 적법한데 C++은 조건문의 평가 결과가 0인가 아닌가만으로 진위 여부를 판별하기 때문이다. 이 코드가 의도된 것이라면 별 문제가 없겠지만 단순한 실수였다면 골치 아픈 버그의 원인이 될 수도 있다. C++ 개발자라면 누구나 이런 실수를 한 번씩 해 본 적이 있을 것이며 이런 버그가 얼마나 골치 아픈지도 잘 알 것이다

C#은 C++보다 타입 점검이 훨씬 더 엄격해서 조건문 자리에는 반드시 bool 타입만 와야 한다. C++에서는 "value가 0이 아닐 때"라는 조건을 if (value) 로 표현할 수 있지만 C#에서는 반드시 if (value != 0)으로 비교 연산해야 한다. C++의 이런 특징은 가끔 융통성이라는 장점으로 간주되며 실제로 두리뭉실해서 편리할 때도 많지만 뜻하지 않은 실수로 치명적인 버그를 만들어 내는 허술한 문법이기도 하다.

문자형

문자형인 char는 16비트 길이의 유니코드 문자 하나를 저장한다. 유니코드는 세계의 모든 문자들을 항상 똑같은 코드로 표현할 수 있는 단일 코드 체계이며 공식적인 국제 표준 코드이다. C의 char 타입과는 철자만 같지 완전히 다른 타입이므로 주의해야 한다. C의 char는 길이가 8비트이므로 C#의 byte나 sbyte에 대응된다. C#에서는 byte와 char가 완전히 다른 타입이다.

문자 상수는 홑따옴표 안에 적는다. 'A', '&', '한' 등과 같이 따옴표안에 글자 하나가 들어간다. 유니코드이므로 한글이나 한자도 알파벳과 마찬가지로 문자 하나로 표현할 수 있다. 키보드로 직접 입력할 수 없는 문자는 확장열로 표기한다. 확장열은 \ 다음에 표기하는데 C의 확장열과 거의 비슷하다.

확장열

유니코드

설명

\'

0x0027

홑따옴표

\"

0x0022

겹따옴표

\\

0x005c

백슬레시

\0

0x0000

\a

0x0008

\b

0x0008

백스페이스

\f

0x000c

피드

\n

0x000a

바꿈

\r

0x000d

바꿈. 개행

\t

0x0009

가로

\v

0x000b

세로

\x16진값

16진값

유니코드 문자



이미 설명했다시피 닷넷의 기본 타입들은 모두 구조체로 정의되어 있기 때문에 메서드를 가질 수 있다. char 타입에는 문자의 종류를 판별하는 IsLower, IsUpper, IsDigit, IsLetter, IsNumber, IsPunctuator, IsWhiteSpace 등의 정적 메서드들이 포함되어 있다. 이 함수들은 C 뿐만 아니라 대부분의 언어에도 존재하므로 IsLower 메서드가 소문자인지 검사한다는 것을 굳이 설명하지 않아도 될 것이다. 특정 문자가 아라비아 숫자인지 판별하고 싶다면 다음 조건문을 사용한다.



C#의 문자형은 오로지 문자 하나만을 표현한다. C는 문자의 배열로 문자열을 정의하지만 C#에서는 문자열 표현을 위한 string 참조 타입이 따로 제공된다. string에 대해서는 다음 절에서 따로 연구해 볼 것이다.

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

C# 타입 - 1. 값 타입 (구조체)  (0) 2011.11.22
C# 타입 - 1. 값 타입 (열거형)  (0) 2011.11.10
C# 타입 - 1. 값 타입 (타입의 종류)  (0) 2011.11.08
C# Main 함수  (0) 2011.11.07
C# 콘솔의 여러가지 기능  (2) 2011.11.07
Posted by 코딩하는 야구쟁이
,