Language/C#

[C#] 타입(1) 값 형식의 변수

nowkoes 2024. 8. 6. 14:58

<본 카테고리는 "닷넷 정복 C#" 책을 기반으로 작성하였습니다>


값 타입

개요

C#에서 사용하는 타입의 분류

 

 타입(Type)변수의 형식이며 길이나 값을 해석하는 방식을 결정한다. 즉, 데이터의 특성을 정의하고, 해당 데이터를 어떻게 저장하고 조작할지 결정하는 중요한 요인이다. C#에서는 위의 표와 같이 타입을 크게 값 타입과 참조 타입으로 나눌 수 있다. 값과 참조에 대해 깊게 고찰해봐야 하지만, 이는 추후에 다루기로 하고, 값 타입의 변수들에 대해 먼저 알아보자.


본문

값 타입

 값 타입(Value Type)이란 스택에 할당되며 변수가 직접 값을 가지는 형식을 의미한다. 일반적으로 크기가 작고 길이가 일정한 값을 저장하며, 선언하는 즉시 기억 장소에 할당되어 바로 사용할 수 있다. 또한 값 타입은 클래스의 멤버나 메서드의 지역 변수로 선언될 수 있으며, 다른 언어들과 마찬가지로 자료형과 이름으로 선언하고, 선언과 동시에 초기화할 수 있다.

 

using System;

namespace MyCompiler 
{
    class Program 
    {
        public static void Main(string[] args) 
        {
            decimal x = 1.5;
            double y = 1.5;
            float z = 1.5f;
        }
    }
}

출력 결과

 

 값 타입은 크게 세 가지, 내장형, 열거형, 구조체로 나뉜다. 내장형에는 정수형, 실수형, 논리형, 문자형이 존재하는데, 유념해야 할 것은 실수형이다. C#에서 실수형은 float(4byte), double(8byte), decimal(16byte) 세 가지가 존재한다. 이때 float 형의 상수는 뒤에 f 접미사, decimal 형의 상수는 뒤에 m 접미사를 붙여야 한다. 만약 이러한 접미사를 따로 붙이지 않으면 컴파일러가 double 형으로 간주하고 에러를 띄운다.


열거형

 열거형(Enumeration)상수 집합에 이름을 붙여 관리하기 위해 사용하는 특별한 데이터 타입이다. 값이 특정 유한 집합으로 제한될 때 사용하는데, 일반적으로 관련된 상수들의 그룹을 만들고, 각 상수에 이름을 부여하여 코드의 가독성을 높이는 역할을 한다. 이때 enum 키워드를 이용하여 사용하는데, 타입 정의문은 명령이 아니어서 끝에 세미콜론을 붙이지 않는다. 

  • C#에서는 타입 선언은 실행문과 구분된다. 실행문은 특정 작업을 수행하며, 각 실행문의 끝에는 세미콜론을 붙여 끝을 명확히 표시한다. 반면, 타입 선언은 하나의 완전한 구문 단위로 간주되며, 내부에 여러 멤버를 가질 수 있는 복잡한 구조다. 이러한 선언의 끝에 세미콜론을 붙이지 않지만 중괄호를 사용함으로써 이를 구분 짓는다.

 

using System;

namespace MyCompiler 
{
    public class Scheduler
    {
        public void PrintDay(int day)
        {
            switch (day)
            {
                case 0:
                    Console.WriteLine("Sunday");
                    break;
                case 1:
                    Console.WriteLine("Monday");
                    break;
                case 2:
                    Console.WriteLine("Tuesday");
                    break;
                case 3:
                    Console.WriteLine("Wednesday");
                    break;
                case 4:
                    Console.WriteLine("Thursday");
                    break;
                case 5:
                    Console.WriteLine("Friday");
                    break;
                case 6:
                    Console.WriteLine("Saturday");
                    break;
                default:
                    Console.WriteLine("Invalid day");
                    break;
            }
        }
    }
    
    class Program 
    {
        public static void Main(string[] args) 
        {
            Scheduler scheduler = new Scheduler();
            scheduler.PrintDay(3); 
            scheduler.PrintDay(7); 
        }
    }
}

 

 예를 들어 다음과 같이 월요일부터 일요일까지 날짜를 출력하는 코드를 구성했다고 가정해 보자. 날짜에 인수가 정수이므로, 다른 사람이 봤을 때 이해하기 직관적이지 않다. 

 

using System;

namespace MyCompiler 
{
    public enum Days
    {
        Sunday,    // 0
        Monday,    // 1
        Tuesday,   // 2
        Wednesday, // 3
        Thursday,  // 4
        Friday,    // 5
        Saturday   // 6
    }
    
    public class Scheduler
    {
        public void PrintDay(Days day)
        {
            switch (day)
            {
                case Days.Sunday:
                    Console.WriteLine("Sunday");
                    break;
                case Days.Monday:
                    Console.WriteLine("Monday");
                    break;
                case Days.Tuesday:
                    Console.WriteLine("Tuesday");
                    break;
                case Days.Wednesday:
                    Console.WriteLine("Wednesday");
                    break;
                case Days.Thursday:
                    Console.WriteLine("Thursday");
                    break;
                case Days.Friday:
                    Console.WriteLine("Friday");
                    break;
                case Days.Saturday:
                    Console.WriteLine("Saturday");
                    break;
                default:
                    Console.WriteLine("Invalid day");
                    break;
            }
        }
    }
    
    class Program 
    {
        public static void Main(string[] args) 
        {
            Scheduler scheduler = new Scheduler();
            scheduler.PrintDay(Days.Wednesday);
        }
    }
}

 

 반면, 날짜를 지정하는 Days라는 열거형을 선언함으로써 훨씬 코드가 간결해지고 가독성이 좋아졌다. 이때 다음과 같이 열거 타입 이름 다음에 내부 저장 타입을 지정하면 용량을 조금 아낄 수 있다는 점도 알아 두자. 이때 열거 멤버는 열거 타입 소속이어서 참조할 때마다 일일이 소속을 밝혀야 한다. 물론 using 문을 이용하여 열거형 타입의 멤버를 미리 읽는 방법도 존재하니, 상황에 맞게 활용하면 된다.


구조체

 구조체(Structure) 타입이 다른 변수들의 집합이다. 이때 클래스와 유사하지만(메서드, 생성자 정의 가능, 멤버 참조 시 . 연산자 사용 등), 몇 가지 중요한 차이점이 있다.

 

  • 값 타입: 멤버의 개수에 제한이 없어 굉장히 커질 수 있지만 스택에 할당되는 값 타입
  • 상속 불가: 봉인되어 있어 더 이상 파생시킬 수 없으며 단독으로만 사용해야 함
  • 대입: 구조체끼리의 대입은 멤버 전체를 복사하는 느린 연산

 

 따라서 선언만 하면 곧바로 사용할 수 있지만, 참조 타입인 클래스와 사용 방법을 일관되게 통일하기 위해 new 연산자를 쓰는 (참조 형식으로 선언하는) 방식도 지원한다. 그리고 전방 선언도 필요 없고, 구조체의 선언문이 Main 보다 더 뒤에 있어도 상관이 없다. 

 

using System;

namespace MyCompiler 
{
    struct Book
    {
        public string name;
        public int price;

        public void output()
        {
            Console.WriteLine($"name = {name}\nprice = {price}");
        }
    }
    
    class Program 
    {
        public static void Main(string[] args) 
        {
            Book b1;
            b1.name = "A";
            b1.price = 10;
            b1.output();

            Book b2 = new Book();
            b2.name = "B";
            b2.price = 20;
            b2.output();
        }
    }
}


요약

C# 값 타입
1. 정의: 스택에 할당되는 형식
2. 특징: 선언하는 즉시 기억 장소에 할당
3. 종류: 내장형(정수, 실수, 논리, 문자), 열거형, 구조체
반응형

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

[C#] C# 개요 및 입출력  (0) 2024.08.05
[C#] WinForm Console 띄우기  (0) 2024.07.10
[C#] JSON 파싱 및 DLL 배포(1)  (0) 2024.07.09
[C#] 반응형 GUI  (0) 2024.07.07