[C#] 변수와 데이터 타입 (값형식, 참조형식)

2023. 3. 25. 20:12공부/C#

 

변수와 데이터 타입 (값형식, 참조형식)

 

목차

1. 변수
2. 값형식, 참조형식
3. 기본 데이터 타입

 


 

1. 변수

 

프로그래밍에서의 변수(Variable)데이터를 담는 일정 크기의 공간을 의미한다.

변수는 보통 '선언한다' 라고 표현하며 우리는 선언된 변수를 통해 특정한 값을 저장할 수 있다.

 

 

<변수를 선언하는 방법>

int x;
(데이터타입 식별자(변수명);)

 

다른 언어로 프로그래밍을 공부한 적이 있다면 위 내용은 알기 쉬울 것이다. int x;정수를 저장하기 위한 변수 x를 선언한다는 의미이다. 그렇다면 이것이 왜 정수를 저장하기 위한 변수이냐? x앞에 선언된 데이터 타입이 정수 계열 형식인 int이기 때문이다. 우리가 int로 선언함으로써 컴파일러는 정수값을 저장하기 위한 메모리를 준비하는 것이다. 만약 정수 이외 다른 문자를 담길 원한다면 int가 아닌 다른 데이터 타입을 사용해야 한다. 

 

다음은 선언한 변수에 값을 할당하는 방법을 알아보자.

 

<변수에 값을 할당하는 방법>

//선언과 할당을 따로 진행
int x;
x=10;

//선언과 할당을 동시에 진행
int x = 10;

//같은 타입의 변수들은 동시에 선언 가능
int a,b,c;
int a=1, b=2, c=3;

 

 

선언한 변수에 값을 할당하는 방법으로는 대표적으로 위 두 가지가 있다.

C나 C++에서는 변수를 선언한 후에 아무런 값도 넣지 않으면 그 안에는 의미 없는 쓰레기 값이 들어간다. 그리고 이런 쓰레기값이 들어간 변수를 그래도 사용하면 프로그램이 이상하게 돌아가버릴 수 있다. 때문에 C#은 이런 문제를 방지할 수 있도록 초기화되지 않은 변수를 사용하면 에러 메세지를 내보내며 프로그램이 동작하지 않는다.

 

 

(초기화란? - 변수에 최초의 데이터를 할당하는 것.)

 

 

 

 

2. 값형식, 참조형식

 

데이터 타입은 값형식과 참조형식으로 분류할 수 있다. 값형식(Value Types)은 변수가 직접 값을 담는 데이터 형식을 의미하고 참조형식은(Reference Types)은 변수가 값 대신 값이 있는 곳의 위치를 담는 데이터 형식을 말한다. (이것을 참조라고 한다.) 이 값형식과 참조형식을 더 자세히 이해하기 위해서는 스택 메모리 영역과 힙 메모리 영역을 알아둘 필요가 있다.

 

 

우측의 a,b,c는 값형식으로 선언된 변수이다. 값형식으로 선언된 변수들은 위 그림처럼 차례대로 스택에 쌓여있다 코드 블럭이 끝나게 되면 가장 위쪽에 저장된 데이터부터 차례로 제거 된다. 스택 메모리는 돌멩이로 가장 밑층부터 차례차례 탑을 쌓는 것과 비슷하다고 할 수 있다. 가장 먼저 생성된 a는 돌탑을 쌓을때 제일 밑에 깔려있는 돌멩이다. 그 뒤로 들어오는 값들을 차근차근 쌓다보면 맨 위에는 가장 최근에 생성된 값이 쌓여있는 것이다. 

 

 

그렇다면 힙 메모리 영역은 무엇인가? 힙 메모리 영역은 참조형식과 연관이 있다. 스택 메모리는 코드 블럭이 끝나면 (중괄호 }를 만나면) 데이터를 스스로 삭제한다. 하지만 힙 메모리는 코드 블럭이 끝나도 데이터를 스스로 삭제하지 못한다. 그 대신 가비지 콜렉터(Garbage Collector)라는 것이 프로그램 뒤에 숨어 힙에 더 이상 사용하지 않는 객체가 있다면 그것을 제거해준다.

 

 

 

우측의 x,y는 참조 형식으로 선언된 변수이다. 참조 형식의 변수는 스택 메모리와 힙 메모리를 함께 이용하는데 힙 메모리 영역에 데이터를 저장하고 스택 메모리 영역에는 힙 메모리에 저장된 해당 데이터의 주소값을 저장한다. (위 이미지의 메모리 주소 이름은 예시를 위해 임의로 설정해두었다.저 숫자값이 들어간다는 것은 아니니 주의!) 데이터 값을 직접 저장하는 것이 아닌 데이터가 저장된 메모리의 주소를 '참조' 한다고 해서 참조 형식이라고 하는 것이다.

 

 

그렇다면 참조 형식은 어떤 경우에 사용될까? 앞서 언급했든 참조 형식으로 선언된 변수는 코드 블럭이 끝나도 사라지지 않는다. 때문에 참조 형식 변수는 코드 블럭 밖에서도 해당 데이터를 사용하기 위해 선언한다. 참조형 데이터 타입으로는 문자열 형식object 형식이 존재한다.

 

 

 

3. 기본 데이터 타입

 

 

<정수 계열 형식>

 

(값을 상세하게 외울 필요는 없다)

 

 

보통은 정수를 저장할때 int를 많이 사용한다.

담을 수 있는 값의 범위가 많아질수록 필요한 메모리 양도 커지므로 무조건 큰 타입을 사용한다고 꼭 좋은 것은 아니다. 필요에 따라 적절하게 사용해야 한다.

 

<오버플로(Overflow)>

변수에 데이터 형식의 크기를 넘어선 값을 넣으면 오버플로가 발생한다. 데이터타입의 최대 값을 넘는 데이터를 담게되면 해당 데이터타입의 최저 값이 나오게된다. (예시로 byte 변수에 256을 담는다면 최저값인 0이라는 결과가 나온다.) 반대로 최저값보다 적은 데이터를 담게되는 언더플로(Underflow)가 일어나며 해당 데이터타입의 최대 값이 나오게 된다.

 


 

<부동 소수점 형식>

 

 

부동 소수점이라는 이름은 소수점이 고정되어 있지 않고 움직인다는 뜻이다. 때문에 부동 소수점을 다루는 데이터 타입은 정수 뿐 아니라 유리수를 포함한 실수 영역의 데이터를 다룬다. 

 

이러한 부동 소수점 형식은 소수점을 표현하기 위해 일부 비트를 사용하며 부호까지 표현해야 한다. 때문에 같은 정수계열의 크기를 표현하더라도 그 값이 달라질 수 있다. 또한 부동 소수점 형식은 정수 계열의 형식보다 계산이 복잡하고 느리다는 단점이 있다.

 


 

 

<논리 형식>

 

 

 

논리 형식은 참과 거짓을 판별할때 사용한다. 논리 형식은 예제를 통해 확인해보도록 하자.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Bool
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = true;

            if (a)
            {
                Console.WriteLine("참입니다.");
            }
            else
            {
                Console.WriteLine("거짓입니다.");
            }
        }
    }
}

 

<실행결과>

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Bool
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = false;

            if (a)
            {
                Console.WriteLine("참입니다.");
            }
            else
            {
                Console.WriteLine("거짓입니다.");
            }
        }
    }
}

 

<실행 결과>

 

 

bool로 선언된 a는 true와 false를 저장할 수 있다. if(a)는 a가 참인지 묻는 조건문이며 첫번째 코드의 경우, a에는 true값이 담겨있기 때문에 '참입니다.'라는 문장이 출력되었다. 반대로 두 번째 코드는 a에 false값이 담겨있어 '거짓입니다'라는 문장이 출력되었다.

 


 

 

<문자형식과 문자열 형식>

 

 

char형식은 '가', '나', '다', 'a', 'b', 'c'와 같은 문자를 다루는 타입니다. char형 변수를 선언하는 방법은 다음과 같다.

 

char a = '가';
따옴표(' ')로 문자를 감싸줘야 함.

 

char형은 하나의 변수에 하나의 문자만 담을 수 있다. 하지만 문자열 형식인 string을 사용하면 여러 개의 문자 형식을 한 번에 담아 처리할 수 있다. string형 변수를 선언하는 방법은 다음과 같다.

 

string a = "안녕하세요.";
char와는 다르게 큰 따옴표(" ")로 문자를 감싸줘야 한다.

 

 

그럼 예시 코드를 살펴보도록 하자.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Bool
{
    class Program
    {
        static void Main(string[] args)
        {
            //문자 형식
            char a = '보';
            char b = '고';
            char c = '싶';
            char d = '어';        
            Console.Write(a);
            Console.Write(b);
            Console.Write(c);
            Console.WriteLine(d);

            //문자열 형식
            string e = "정말 보고싶어";
            Console.WriteLine(e);
        }
    }
}

 

<실행 결과>

 

 

 

긴 문장의 경우 char형 보다는 string으로 선언하는 것이 더욱 간편하다는 것을 알 수 있다.

 

 


 

 

<object 형식>

 

object는 객체라는 뜻의 영단어로 어떤 타입이든 담을 수 있는 형식을 의미한다. C#의 모든 데이터 형식은 object로부터 상속을 받는다. (object의 데이터와 메소드를 물려받았다는 뜻이다.) 때문에 object는 모든 데이터 형식을 담아 처리할 수 있다. 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Bool
{
    class Program
    {
        static void Main(string[] args)
        {
            object a = 123456;
            object b = 1.23214;
            object c = true;
            object d = "보고싶어";

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

 

 

<실행 결과>