본문 바로가기

프로그램&DB/C#

[C# 강좌] C# 프로그래밍 #04 - 데이터 형식과 변수

2.2 데이터 형식과 변수

C#은 데이터 형식에 대해 값 형식과 참조 형식을 지원한다. 값 형식의 데이터 형식으로 선언된 변수는 스택(Stack)에 있는 데이터를 변수가 직접 가르키는 반면, 참조 형식의 데이터 타입으로 선언된 변수는 스택(Stack)에는 데이터에 대한 참조만을 가지며 실제 데이터는 힙(Heap)에 저장된다. 여기서 데이터 형식(Data Type)은 데이터를 나타내는 형식을 표현한 키워드라고 보면 된다.

 

C# 키워드

.NET 형식

크기

초기값

범위/정밀도

형식

bool

System.Boolean

1

false

 

byte

System.Byte

1(+)

0

0~255

sbyte

System.SByte

1

0

-128~127

char

System.Char

2

'\0'

 0x0000 ~ 0xffff

decimal

System.Decimal

16

0.0M

1.0×10-28 ~ 7.9×1028,

28자릿수 정밀도

double

System.Double

8

0.0D

5.0×10-324 ~ 1.7×10308,

15자릿수정밀도

float

System.Single

4

0.0F

1.5×10-45 ~ 3.4×1038,

7자릿수 정밀도

int

System.Int32

4

0

-2,147,483,648

~2,147,483,647

uint

System.UInt32

4(+)

0

0~4,294,967,295

long

System.Int64

8

0L

-9,233,372,036,854,775,808

~9,233,372,036,854,775,807

ulong

System.UInt64

8(+)

0L

0~

18,446,744,073,709,551,614

short

System.Int16

2

0

-32,768~32,767

ushort

System.UInt16

2(+)

0

0~65,535

string

System.String

 

null

 

참조

object

System.Object

 

null

 

참조

struct

 

 

 

 

enum

 

 

 

 

interface

 

 

 

 

참조

delegate

 

 

 

 

참조

*(point)

 

 

 

 

참조

?(nullable)

System.Nullable

 

 

 

 

 

변수는 어떤 형식을 가진 값을 담기 위한 공간을 가르키는 이름이다.

 

2.2.1 정수(int, short, long, uint, ushort, ulong)

정수 형에는 int, short, long 3가지 타입과 이 3가지 타입에서 부호를 사용하지 않는 uint, ushort, ulong 타입을 포함해 총 6개의 데이터 형식이 존재한다.

 

* 부호의 표현

정수는 양의 정수, 0, 음의 정수로 나누어 진다. 보통 수학에서 음의 정수는 -기호를 이용해서 표현하는데, 이를 컴퓨터에서 표현하기 위해서는 마찬가지로 정해진 데이터 형식에 부호를 나타내는 공간이 필요하게 된다. 이를 위해 보통 최상위 비트를 음수 표시 영역으로 정의해 두고 미리 사용하곤 한다. C#정수형 int 의 경우 4바이트 즉 32 비트를 이용해 숫자를 표현하는데 이 중 최상위 1 비트가 음수 부호를 표시하기 위해 예약되어 있어 사용하지 못하므로 값의 표현 범위는 2 31승으로 표현된다. 만약, 어떤 변수가 음의 수를 갖지 않는다는 것을 명확히 알 수 있다면 음수 부호를 표시하기 위한 영역이 필요없을 것이다. 정수형에서 이 경우 부호 없는 정수 uint와 같이 사용할 수 있으며, 이 경우 부호 비트가 따로 필요치 않으므로 값의 표현 범위는 부호 비트 1을 더해 2 32승으로 표현된다.

 

1) int, uint

 

2) short, ushort

 

3) long, ulong

 

 

2.2.2 실수(float, double, decimal)

실수 형에는 float, double, decimal 3가지 형식이 존재한다. 컴퓨터에서 실수 형을 다루는 경우 컴퓨터의 실수 표현 방법으로 인해 많은 주의를 기울여야 한다.

 

1) float(System.Single)

float 타입은 32비트 부동 소수점 값, 일반적으로 실수라고 부르는 타입을 표현하기 위해 많이 사용되는 타입이다. 값의 범위는 1.5×10-45 ~ 3.4×1038의 근사범위를 가지며 전체 7자리의 숫자까지 표현이 가능하다.

float 형식으로 숫자 리터럴이 처리되도록 하기 위해서는 접미사 f 또는 F를 이용한다.

 

2) double(System.Double)

Double 64비트의 부동 소수점 값, float보다 2배의 공간을 차지하는 실수 값을 표현하기 위한 타입이다. 값의 범위는 5.0×10-324 ~ 1.7×10308의 근사범위를 가지며 전체 자릿수는 15~16개의 자리 숫자까지 표현이 가능하다.

C#에서는 실수형 상수 표기는 기본적으로 double형으로 인식된다. 다음에 사용된 1.5 double형으로 사용된다.

int i = i+1.5;

 

3) decimal

decimal은 부동 소수점 값을 표기하기 위한 형식으로 16바이트의 크기를 가진다. 28~29개의 유효 자릿수에 대한 표기가 가능하다. .NET 형식은 System.Decimal에 해당한다.

decimal 형식으로 숫자 리터럴이 처리되도록 하기 위해서는 접미사 m 또는 M을 이용한다.

 

2.2.3 byte

byte 형은 8비트 정수를 값을 저장하기 위한 데이터 형식으로 .NET 형식의 System.Byte에 해당한다. 값의 범위는 0~255까지의 정수형을 저장할 수 있으며, 소켓 프로그램이나 시리얼 통신과 같이 바이트 단위의 값 교환이 필요한 경우에 이용된다.

 

부호 있는 형태의 바이트 형식을 위해 sbyte라는 형식이 따로 존재한다.

 

2.2.4 불리안(Boolean)

불리안(boolean) 형은 bool 키워드를 이용해 사용하여 표기한다. .NET 형식의 System.Boolean 형에 해당되며 거짓의 진리 값을 표현하기 위해 이용된다.

아래 소스는 불리안(Boolean) 변수를 하나 선언하고 진리 값을 출력해주는 소스이다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

 

14

15

16

17

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

bool isTrue = false;

System.Boolean isFalse = true;

Console.WriteLine("Is True : {0}, Is False :{1}",

isTrue.ToString(), isFalse.ToString());

              Console.Read();       

}

    }

}

 

11, 12번째 라인은 불리안 형 변수 isTrue isFalse 를 선언하고 값을 각각 true false로 초기화 하고 있다. 11번째 줄의 bool  키워드와 System.Boolean은 동일한 의미로써 불리안 형식을 선언하는데 이용되는 2가지 형식 선언을 보여준다.

13번째 줄은 isTrue isFalse의 변수 값을 출력해주는 문장이다.

 

 

2.2.6 문자(char)

문자를 저장하기 위한 형식으로 char 키워드를 제공하는데, .NET 형식은 System.Char에 해당하며, 유니코드 문자로 2바이트의 크기를 가진다. Char는 구조체로 구현되어 있으며, 변환과 비교를 위한 몇 가지 메서드를 가진다.

문자형을 값은 홑 따옴표를 이용하여 다음과 같이 표기된다.

char ch1 = 'A';

char ch2 = '\x0041';

 

ch1 ch2는 동일한 값을 A를 가진다. char 형은 보여지는 이와 같이 문자 리터럴과 유니코드로 표현할 수 있다.

아래의 코드를 보자.

char ch = 65;

Console.WriteLine("{0}",ch );

C C++를 해보았다면 결과를 A가 출력된다고 잘못된 판단을 내릴 수 있다. C# char은 숫자 리터럴로 쉽게 변환할 수 있지만, char 형은 정수 표기 데이터 형식과는 다른 구조를 가진다. 따라서 이 코드는 컴파일 시 상수 값을 char 형으로 변환할 수 없습니다.라는 컴파일 에러가 뜨게 된다.

 

2.2.6 문자열(string)

C#에는 문자열을 저장할 수 있는 데이터 형식으로 string 키워드를 제공한다. .NET 형식은 System.String 에 해당하며, 유니코드 문자열 형태로 값이 들어가게 된다.

문자열은 쌍 따옴표로 묶어서 다음과 같이 표기한다.

string str = "String";

 

실제 문자열을 저장하기 위한 String 클래스는 내부적으로 char 포인터 형태로 구현되어 있다. 이러한 이유로 string 개체는 char의 배열 형태로 각각의 char에 접근하는 것이 가능하다. 여기서는 간단한 string 형식에 대한 설명이 목적이므로, String 클래스에 대해서는 나중에 따로 다루게 될 것이다.

* 문자열 개체는 생성된 이후 개체의 내용에 대한 변경이 불가능하다. 이는 메모리 재할당보다는 개체 생성과 반환을 통한 문자열 관리가 더 편리해서 이와 같은 방식으로 구현된 듯 하다.

 

이스케이프 문자는 특수한 기능을 가진 문자들로서 화면에 출력하거나 프린트로 출력할 때 여러 기능들을 표현 할 수 있다.

문자 출력 시 쌍 따옴표나 홑 따옴표, 백 슬래쉬 등의 출력과 같은 경우 역시 이스케이프 문자를 이용하여 손쉽게 출력할 수 있다.

Console.WriteLine("\tstring \rprint \"test\"");

 

아래 표는 C#에서 사용되는 이스케이프 문자를 정리한 표이다.

2. 이스케이프 문자

이스케이프 문자

결과

유니코드

\0

Null

0x0000

\a

경고음

0x0007

\b

백스페이스(Backspace)

0x0008

\t

수평 탭

0x0009

\n

새 줄(new line)

0x000A

\v

수평 탭(프린트 시)

0x000B

\f

폼 피트(프린트 시)

0x000C

\r

캐리지 리턴(Carriage return)

0x000D

\

쌍 따옴표

0x0022

\

홀 따옴표

0x0027

\\

백 슬래쉬(Backslash)

0x005C

\uABCD

\xABCD

유니코드 문자

0xABCD

 

2.2.6 nullable [inobae1] 

nullable 형식은 일반적인 데이터 형식에 추가로 null 값을 나타내기 위해 C# 2.0에서 추가된 개념이다. nullable 형식은 다음과 같이 2가지 방법으로 표현될 수 있다.

System.Nullable<T> nType;

T? nType;

 

여기서 T는 구조체를 비롯한 값 형식이 될 수 있지만 참조 형식은 될 수 없다.

다음은 int 형 변수 i nullable 형으로 선언하기 위한 2가지 방법이다.

System.Nullable<int> i;

int? i;

 

nullable 형의 데이터 형식을 이용하는 이유 중 하나는 데이터베이스의 bool 형식을 들 수 있다. Sql-Server의 불리안 형식은 일반적인 true, false 값 외에 null의 값을 포함해서 3가지 상태를 가진다. 그러나 기본 bool 형식은 2개의 값 true, false 밖에 가지지 못한다. 따라서 nullable 불리안 형식을 사용하면 이에 대한 자연스러운 처리가 가능하게 된다.

bool flag1 = null;   // 에러

bool? flag2 = null;  // 정상

 

다음은 nullable 형식을 이용해 선언한 데이터 형식들에 대한 예를 몇 가지 보여주고 있다.

int? i = 10;

double? d1 = 3.14;

bool? flag = null;

char? letter = 'a';

int?[] arr = new int?[10];

 

nullable 형식은 추가로 다음과 같은 2개의 읽기 전용 속성을 가진다.

HasValue : bool 형식이며, 변수에 null이 아닌 값이 포함되어 있으면 true, 아니면 false를 가진다.

Value : null이 아닌 경우 값을 나타내며, null 인 경우 InvalidOperationException을 발생 시킨다.

int? y = 10;

if(y.HasValue) Console.WriteLine(y.Value);

else Console.WriteLine("정의되지 않음");

 

1) 명시적 변환

nullable 형식은 Value 속성을 사용하거나 명시적으로 캐스팅하여 일반 형식으로 캐스팅 하는 것이 가능하다. 그러나 실제 null 값을 가질 경우 경우 InvalidOperationException 예외가 발생하게 된다. 명확한 처리를 위해서는 HasValue 속성을 통해 값의 존재 유무를 확인하는 방법이 가장 적절한 방법이 된다.

int? n = null; 

int m1 = n;         // 일반변수에 null이 할당되어 컴파일 에러가 발생함.

int m2 = (int)n;    // 컴파일은 되나 널값에 대해 exception을 발생시킨다.

int m3 = n.Value;   // 컴파일은 되나 널값에 대해 exception을 발생시킨다.

 

2) 암시적 변환

일반 형식에서 nullable 형식으로 변환이 이루어질 경우 암시적 변환이 이루어 진다..

int? n2 = 10;  // 암시적 변환

 

3) 산술 연산자

값 형식에서 사용되는 연산자들은 unllable에도 모두 사용할 수 있다. 산술 연산자에서 피 연산자가 null 인 경우는 연산의 결과는 무조건 null 값이 된다. 그 외의 경우는 일반 형식의 연산 결과와 동일하다.

int? a = 10;

int? b = null;

a++;             // 1이 증가하여 11

a = a * 10;      // 10을 곱하여 110

a = a + b;       // 110null을 더하면 null

 

비교 연산의 경우 nullable 형식이 하나라도 null이면 비교 결과는 항상 false가 된다. 따라서, 비교의 결과가 false라고 해서 그 반대의 경우가 true가 된다고 단정할 수 없다.

int? num1 = 10;

int? num2 = null;

if(num1>= num2) System.Console.WriteLine("num1>=num2");

else System.Console.WriteLine("num1<num2");

// num2 null이므로 비교결과는 false, num1 < num2 라고 단정할 수 없다.

 

 

4) ?? 연산자

?? 연산자는 null이 허용되지 않는 형식에 nullable 형식을 대입할 때 반환되는 기본 값을 정의 하며, 중첩 사용이 가능하다.

int? c= null;

int d = c ?? -1;    // d=c이고, c null 이면 d = -1 이 된다.

int? e = null;

int? f = null;

int g = e ?? f ?? -1;  // e, f가 둘다 null 일 경우 -1 이 되고 e null일 경우는 f

 

5) bool? 형식

bool? Nullable 형식에서는 true, false, null의 세 가지 값이 포함될 수 있다. 따라서, if, for, while 같은 조건문에서는 이를 사용할 수 없고, 사용된 경우 컴파일 오류가 발생한다. 이는 null이 조건문에서 명확한 의미를 주지 못하기 때문에 컴파일 오류가 발생한다. 조건문에서 사용되기 위해서는 앞에서 다룬 nullable 형식의 명시적 변환을 이용하면 컴파일 오류는 피할 수 있지만, 값이 null 경우 InvalidOperationException 예외가 발생하게 된다. 따라서, bool로 캐스팅하기 전에 HasValue 속성을 통해 값이 존재하는지 null인지 유무를 확인하는 것이 중요하다.

bool? b = null;

if (b) { }        // 컴파일 오류 발생

bool? b = null;

if ((bool)b) { } // 컴파일은 되나, InvalidOperationException 예외 발생

 

아래 표는 nullable 불리안 타입의 논리 연산 진리표이다.

3. nullable Boolean 연산 진리표

x

y

x&y

x|y

true

true

true

true

true

false

false

true

true

null

null

true

false

true

False

true

false

false

False

false

false

null

False

null

null

true

Null

true

null

false

False

null

null

null

Null

null


 



/* 출처 */
inobae의 놀이터
http://blog.naver.com/inobae