[CS] 데이터 보관하기



기본 데이터 형식

Decimal

decimal은 실수를 다루는 데이터 형식이지만 부동 소주점과는 다른 방식으로 소수를 다루며 정밀도가 높다.

decimal은 29자리 데이터를 표현할 수 있는 소수 형식이며 크기는 16바이트이다.


object 형식

object는 물건, 객체라는 뜻의 영어 단어이다. 그러니 object는 형식은 어떤 물건(데이터)이든지 다룰 수 있는 다룰 수 있는 데이터 형식이다. 하지만 어떻게 모든 데이터 형식을 다룰 수 있는 것일까? 바로 상속이 가능하게 해주는 것이다. 모든 데이터 형식이 자동으로 object 형식으로부터 상속받게 C#에서 조치를 취한 것이다. 즉, object 형식이 모든 데이터 형식의 조상이 되는 것이다. 예제를 보자.

using System;

namespace ConsoleApp6
{
    internal class Program
    {
        static void Main(string[] args)
        {
            object a = 123;
            object b = 3.141592653589793238462643383279m;
            object c = true;
            object d = "안녕하세요";

            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine(c);
            Console.WriteLine(d);
        }
    }
}

image

하지만 예를 들어 각 데이터 형식들은 데이터를 처리하는 방법이 다른데 어떻게 이런 일이 가능한지 알아보면 박싱과 언박싱이 일어나는 것을 알 수 있다.

박싱과  언박싱

object형식은 참조 형식이기 때문에 힙에 데이터를 할당한다. int나 double은 값 형식이기 때문에 스택에 데이터를 할당한다. object형식은 값 형식의 데이터를 힙에 할당하기 위해서 박싱 기능을 제공한다. 박싱은 뜻 그대로 박스에 포장한다는 의미이다. 만약 다음과 같은 코드가 있다면

object a= 20;

위 코드에서 20은 그림과 같이 박스에 담겨서 힙에 할당되고, a는 그 주소를 참조하는 모습이 된다.

image

이렇게 박싱이 일어나는 경우가 있는 반면, 힙에 있던 값 형식 데이터를 값 형식 객체에 다시 할당해야 하는 경우가 있다. 다음 코드를 보자.

object a=20;
int b=(int)a;

이 때 박싱되어 있던 값을 꺼내서 값 형식 변수에 저장하는 과정을 언박싱이라고 부른다.


문자열을 숫자로, 숫자를 문자열로

문자열을 숫자로 바꾸는 방법은 간단하다. C#에서는 정수 계열 형식, 부동 소수점 형식에 Parse()라는 메소드를 넣어줬다. 이 메소드에 숫자로 바꾸고 싶은 문자열을 넘기면 숫자로 변한다. 다음과 같이 말이다.

int a=int.Parse("12345");
float b= float.Parse("123.45");

숫자를 문자열로 바꾸는 방법도 간단한다. 정수 계열 데이터 형식이나 부동 소수점 데이터 형식은 object로부터 물려받은 ToString()이라는 메소드를 자신이 갖고 있는 숫자를 문자열로 변환하도록 재정의(오버라이드)하였다. 다음 코드를 보자.

int c=12345;
string d=c.ToString();

float e=123.45;
string f=e,ToString();

열거 형식

열거 형식은 변수와 달리 안에 들어있는 데이터를 절대 바꿀 수 없는 메모리 공간이다. 같은 범주에 속하는 여러 개의 상수를 선언할 때 아주 유용하다. 선언 방법은 다음과 같다. enum 열거 형식명 : 기반 자료형{상수1, 상수2, ….}여기서 기반자료형은 정수 계열만 사용 가능하며, 생략하면 int를 기반자료형으로 사용한다.

예를 들어 <사용자로부터 받는="" 응답="">들을 열거 형식으로 나타내보면 다음과 같다.

enum Dialogresult {YES, No, CANCEL, CONFIRM, OK}

그리고 각 상수에 값을 위와 같이 아무것도 넣지 않으면 앞에서부터 순서대로 0, 1, 2, 3, 4가 된다. 그리고 열거 형식은 말 그대로 새로운 형식이다. 담을 수 있는 데이터는 오로지 DialogResult 형식 뿐이다. 다음과 같이 말이다.

DialogResult result=DialogResult.YES;

Nullable 형식

프로그래밍을 하다보면 변수를 비워야 하는 상황이 생긴다. 0이 아닌 비어있는 변수 즉, null 상태인변수 말이다. 이런 경우, 변수에게 할당된 메모리 공간을 비울 수 있도록 하는 Nullable 형식을 사용하면 된다. 선언 방법은 다음과 같다.

데이터형식? 변수이름;

즉, 원래 데이터 형식 뒤에 “?”만 붙여주면 된다.

Nullable 형식을 사용할 수 있는건 값 형식만 된다.(참조 형식은 안된다) Nullable 형식을 선언하는 예시를 보이겠다.

int? a=null;
float? b=null;
double? c=null;

Nullable형식은 HasValue와 Value 두 가지 속성을 가지고 있다.

HasValue : 해당 변수가 값을 가지고 있는지 또는 그렇지 않은지를 나타냄

Value : 변수에 담겨 있는 값을 나타냄

예시를 보자

int? a=null;
Console.WriteLine(a.HasValue); // a는 null이므로 False 출력

a=37;
Console.WriteLine(a.HasValue);	// a는 37을 갖고 있으므로 True 출력
Console.WriteLine(a.Value);	// 37을 출력

만일 비어있는 변수에 대해서 Value를 통해 값을 꺼내려는 시도가 있으면 예외가 발생한다. 따라서 Nullable 형식을 사용할 때는 값을 꺼내기 전에 HasValue로 값이 있는지 확인하고 꺼내는게 중요하다.


var 키워드

int, string과 같은 명시적 형식 대신 var를 사용해서 변수를 선언하면 컴파일러가 자동으로 해당 변수의 형식을 지정해준다. 예시를 보자.

var a=3;	// a는 int형식
var b="Hello";	// b는 string 형식

단, var 키워드를 이용해서 변수를 선언하려면 반드시 선언과 동시에 초기화를 해줘야 한다. 그래야 컴파일러가 그 데이터를 보고 형식을 추론할 수 있기 때문이다.

그리고 지역변수로만 사용할 수 있다는 점을 명심하길 바란다.




© 2022. by KSC

Powered by sora