C#의 데이터 타입

2024. 12. 20. 14:10개발/C#

이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.


데이터 타입은 언어마다 차이는 있지만 크게 다르지는 않습니다. 하나의 언어를 공부하셨다면 정수형, 소수형, 문자열 타입은 익숙할 것 입니다. 하지만 C#의 공부하다 보면 익숙하지 않은 키워드가 2가지가 나옵니다.

 

Object

참조 데이터 타입으로 힙 메모리 구역에 할당되어 데이터를 저장합니다. 언뜻 읽어보면 포인터와 비슷하다는 생각이 듭니다. 하지만 큰 차이가 2가지 있습니다.

 

데이터 형식

두 가지 모두 힙을 참조하는 데이터지만 타입의 차이가 있습니다. Object는 값 혹은 참조를 담는 객체 타입이며 포인터는 메모리 주소를 직접 참조하는 변수 입니다. Object는 객체로써 런타임 타입 정보를 포함하여 컴파일시 오류를 표시해 안정적인 데이터 타입 캐스팅을 지원합니다. 포인터는 데이터 타입에 대한 엄격한 검사는 없기 때문에 치명적인 오류가 발생할 수 있지만, 반대로 말하면 좀 더 자유로운 개발이 가능합니다. 예를 들어 구조체의 패딩 데이터를 넣어 다른 구조체 타입으로 변환하는 등의 작업이 해당될 수 있습니다.

 

메모리 관리

Object는 CLR의 가비지 컬렉터(GC)에 의해 메모리가 관리되며, 개발자가 메모리를 할당하고 해제할 필요가 없습니다. 그래서 개발자는 메모리 누수와 잘못된 메모리 접근같은 문제를 회피할 수 있습니다. 하지만 GC의 비용으로 인한 성능의 저하가 발생합니다. 반대로 포인터는 수동으로 메모리를 관리하여 치명적인 문제가 발생할 수 있지만 개발자의 역량에 따라 성능을 높일 수 있습니다.

 

object a = 155;
object b = 3.14;
object c = 'g';
object d = "Pascal";

박싱(Boxing)

int A = (int)a;
double B = (double)b;
char C = (char)c;
string D = (string)d;

언박싱(Unboxing)

 

작동원리는 데이터를 객체라는 박스에 담고 꺼낸다는 의미로 박싱언박싱이라는 작업을 통해 데이터를 참조합니다. Object 변수에 데이터를 저장하여 값 타입(스택에 저장된 데이터)을 힙에 저장되는 참조 타입으로 변환하는 것을 박싱이라 하며, 박싱으로 저장한 데이터를 원래 데이터 타입으로 변환하는 것을 언박싱이라고 합니다.

 

위의 코드처럼 Object는 모든 데이터 형식을 담을 수 있습니다. 그 이유는 Object는 모든 데이터 형식의 부모이기 때문입니다. 개발자가 선언한 객체또한 자동으로 Object를 상속합니다. 이를 이용하여, 데이터를 저장하거나 처리해야 할 때 타입이 명확하지 않은 경우 혹은 다형성 활용해야 하는 경우 Object를 사용 할 수 있습니다. 하지만 Object는 박싱/언박싱 비용으로 성능 문제가 발생하기 때문에 사용을 자제해야 합니다.

 

Var

C#은 강한 데이터 타입 검사를 하는 언어 입니다. 강한 타입 검사는 개발자의 실수를 예방하는데 큰 도움이 되지만, 코드를 작성하는데 더 피곤함이 동반되는 것은 어쩔 수 없습니다. 그래서 C#은 약한 데이터 타입 검사도 지원하여 개발자에게 편리함을 제공합니다.

var a = 427;
var b = 7.17;
var c = 'd';
var d = "Dining";

AS-IS: 컴파일 전

int a = 427;
double b = 7.17;
char c = 'd';
string d = "Dining";

TO-BE: 컴파일 후

 

var는 약한 데이터 타입 검사를 하는 키워드로, 명시적인 데이터 타입을 대신하여 사용 할 수 있습니다. 단 var를 사용할 때에는 선언과 동시에 초기화를 하여 컴파일러가 데이터 타입을 추론할 수 있게 해야 합니다. C# 컴파일러는 위 코드를 컴파일을 통하여 명시적인 데이터 타입으로 변환합니다.

 

C#을 비롯하여 .NET을 지원하는 언어의 데이터 타입 체계는 .NET의 공용 형식 시스템(CTS)을 따릅니다. 이는 언어간의 호환성을 갖도록 하기 위함입니다. 이 호환성을 통해 사용하는 개발언어가 달라도 프로젝트간 협업이 가능하게 됩니다. 아래는 CTS와 C#의 기본 데이터 타입을 비교한 것 입니다.

CTS C#
System.Byte byte
System.SByte sbyte
System.Int16 short
System.Int32 int
System.Int64 long
System.UInt16 ushort
System.UInt32 uint
System.UInt64 ulong
System.Decimal decimal
System.Single float
System.Double double
System.Boolean bool
System.Char char
System.String string
System.Object object

 

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

C# 프로퍼티  (0) 2025.02.12
C# 종료자, Finalize, IDisposable  (0) 2025.02.12
C# 참조에 의한 매개변수 전달  (0) 2025.02.11
Static 그리고 Main  (0) 2024.12.18
C# 그리고 .NET  (0) 2024.12.17