C# 타입(Type) 개념, 변수, 데이터 – C# 초급 8

C# 타입(Type) 개념

C#의 특징은 타입 선언(Type Declaration) 입니다. C와 C++과 비교하면 그 차이가 두드러져 보입니다. C프로그램은 데이터 타입과 함수 중심인 절차지향형 언어이고 C++은 함수와 클래스를 중시하는 객체지향형 언어입니다. 그렇다면 C#은? 타입 중심의 객체지향형 언어로 특징 지을 수 있을 것 입니다.

물론 이런 식으로 모든 C# 프로그램을 싸잡아서 언어를 규정하는 것은 조금 무리한 부분이 있습니다. OO지향형이라는 것보다는 개별 프로그램의 디자인 패턴이 더 중요하기 때문입니다. 다만 C#언어의 일반적인 캐릭터에는 타입(type) 개념이 유용하기 때문에 강조해봤습니다.

타입이란?

아직 C# 학습의 초기니까 타입(Type)에 대해서 원론적으로 알아보겠습니다. 사전적 뜻 풀이로는 유형, 종류이고 컴퓨터 프로그래밍에서의 타입(Type)은 데이터 타입(data type), 클래스 타입(class type) 등을 아우르는 템플릿(template) 입니다.

타입의 핵심은 타입에 따라 적합한 연산, 또는 메소드(함수, 동작)가 결정된다는 것 입니다. 즉 타입을 알면 어떤 연산이 가능한지 알 수 있습니다. 가장 간단한 타입은 byte – 바이트입니다. byte 는 0부터 255까지 저장 가능하며 메모리에서 8비트를 사용합니다. 이 타입은 정수 사칙연산이나 비교연산 등이 가능합니다. byte 같이 간단하고 기본이 되는 타입은 .NET 프레임워크에 사전 정의가 되있습니다.

복잡한 타입의 대표는 클래스(class)입니다. 사용자가 정의하는 타입으로 클래스에서 사용하는 데이터 타입을 멤버(member) 혹은 필드(field) 라고 하며 함수를 메소드(method)라고 합니다. 클래스의 멤버는 byte 같은 간단한 타입부터 복잡한 class 타입도 될 수 있고 접근 제어자를 사용하여 클래스가 가진 메소드에서만 멤버를 사용할 수 있습니다.

타입이 컴퓨터에게 주는 정보는 아래와 같습니다.

  1. 타입의 이름
    – ex> int, char, String…
  2. 데이터 구조
    – ex> byte : 8bit 정수, float : 16비트 부동 소수점, char : 16bit 유니코드…
  3. 가능한 연산과 제약사항
    – ex> 정수 연산, 소수 연산, 문자열 연산, 메소드 등…

타입 사용하기(변수 선언)

타입을 사용하려면 어떻게 해야 할까요? 크게 두 가지 절차를 거칩니다.

첫번째는 타입이 정의되어 있어야 합니다. 두번째는 타입을 선언해야 합니다.

C#과 .NET 프레임워크에는 미리 정의된 기본 타입이 있습니다. int 형은 4바이트로 약 -21억~ +21억까지 표현할 수 있는 기본 데이터 타입입니다. 정의가 되어 있으니 선언만 하면 되겠습니다. 아래 코드는 int 형 타입을 선언합니다. 타입을 선언하면 컴파일러는 타입의 정보를 바탕으로 메모리에 공간을 할당하고 초기화를 하는 코드로 변환합니다. 초기화는 선언과 동시에 할 수도 있고 선언한 후에 초기화할 수도 있습니다. 초기화를 하지 않으면 C# 컴파일러는 오류를 냅니다.

int money; // 선언
money = 100000; // 초기화

int age = 21; // 선언과 동시에 초기화

이렇게 기본 타입을 선언하는 것은 변수 선언(variable declaration)이라고 합니다. 변수는 말 그대로 변하는 수입니다. 데이터 타입의 또 다른 특성 이라고도 할 수 있는데 보통 프로그램에서 변수라고 할 때는 변수의 이름(variable name)을 지칭하는 것 입니다. 프로그래머와 컴파일러는 이름을 가지고 프로그램을 조작하기 때문에 중요합니다. 사람 입장에서는 소스코드에서 확인하는 이름이고 컴퓨터에게 변수 이름은 실제 값이 저장된 메모리 주소와 같습니다.

변수를 선언하면 정의된 타입에 따라 메모리에 값이 할당되는데 이를 타입 인스턴스라고 부릅니다. 혹은 객체라고도 부르는데 둘다 사용할 수 있는 용어입니다. 객체, 인스턴스 맥락에 따라 부르면 됩니다.

흔히 빵공장에서 빵틀이 타입이라면 틀에 맞춰 나온 빵을 인스턴스라고 비유합니다.(클래스도 마찬가지) 런타임에 메모리에 실제 올라가 있다고 보면 됩니다. (빵집 영업중)

클래스의 예(class)

클래스는 아직 배우지 않았으니 대략적 개념을 이야기하겠습니다. .NET은 객체지향 프로그래밍 언어로 C# 프로그램은 클래스에서 시작합니다. Main 함수는 시작점입니다. Program 이란 class 의 메소드인데 static 키워드를 사용해서 인스턴스 없이도 사용할 수 있습니다. (static 메소드에서 설명)

아래 코드는 Main() 함수에서 다른 클래스인 MyClass의 인스턴스를 생성하고 메소드를 호출합니다. 여기서 인스턴스는 m1 인데 이는 MyClass 타입의 인스턴스 주소가 저장된 레퍼런스(참조) 입니다. byte와 int 등 기본 자료형(simple data type)과 다르게 클래스는 멤버와 메소드를 가지고 있어서 더 복잡하고 많은 기능을 가지고 있습니다. 자세한 내용은 클래스와 객체 챕터에서 배우지만 여기서 볼 것은 클래스도 결국 타입이다.(class is type) 해서 타입의 특성을 갖고 있다는 점입니다.

using System;

namespace Smoothie
{
    class Program
    {
        static void Main()
        {
            MyClass m1 = new MyClass();
            m1.display();
        }
    }

    class MyClass
    {
        private int member1=1111;
        public void display()
        {
            Console.WriteLine($"member1: {member1}");
        }
    }
}

한가지만 더 보면 Main() 함수에서도 자기 자신의 인스턴스를 생성할 수 있습니다.

using System;

namespace Smoothie
{
    class Program
    {
        static void Main()
        {
            Program pg = new Program();
            pg.Hello();
        }

        void Hello()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

.NET 에 정의된 타입

기본 타입

.NET 은 범용 프레임워크입니다. C# 뿐만 아니라 .NET을 지원하는 수십개의 CLI 언어들이 사용할 수 있도록 BCL에 원시 타입과 다른 기본 타입을 포함하고 있습니다. C# 키워드를 지정한 것은 object, short, int, float, decimal, byte, bool, char, string 입니다. 상세 사항은 MS의 .NET Framework Libraries 문서를 참고합니다.

사용자 정의 타입

사용자 정의 타입에는 class, struct, array, enum, delegate, interface 가 있습니다. 상세 내용은 각 주제의 포스팅에서 설명합니다.

자료구조 (stack, heap memory)

자료구조에 대한 내용이므로 간략하게 설명합니다. 우리가 작성하고 빌드하여 실행하는 프로그램은 사용목적에 따라 영역이 나뉘어져 있습니다. 어셈블리어적으로 스택(stack), 힙(heap), 데이터(data), 코드(code) 영역입니다. C#에서 코드영역과 데이터 영역은 컴파일러가 처리해야할 부분들이니 딱히 신경쓸일은 없습니다. 응용 프로그래머가 작성하는 코드는 스택과 힙 영역에서 돌아갑니다. 다시 말하면 C# 프로그래머의 주요 관심사는 스택과 힙을 얼마나 어떻게 사용 할 건지가 중요합니다. 물론 .NET 플랫폼은 CLR이 알아서 가비지 컬렉션(GC)을 해주기 때문에 딱히 그냥 놔두면 잘 돌아갑니다.

하지만 여전히 스택과 힙을 어떻게 사용할 것인가? 는 성능에 영향을 끼치는 부분입니다. 직접 메모리를 해제하는게 아니기 때문에 할당 부분에서 미리 예측해서 조절해야 하는데 스택과 힙 구조를 모르면 메모리 관리가 더 어려운 일이 될 수도 있습니다.

타입을 선언하면 스택 혹은 힙 메모리에 인스턴스가 생성됩니다. 여기서는 두 메모리의 용도는 다르다 정도만 말하고 해당 주제에서 자세히 다루겠습니다.

요약

C# 타입(Type) 개념에 대해서 알아보고 이에 관련한 주제들을 대략적으로 둘러봤습니다. 여기의 각 주제들은 하나의 챕터에서 깊이 다뤄야 하는 내용들이라 설명이 부실합니다만, 타입 개념을 이해하기 위해 참고할 가치는 있습니다. C#이란 언어를 배우지만 결국은 .NET 플랫폼에서 앱 개발과 운영이 목표기 때문에 전체 구조를 이해할 필요가 있습니다.

언어를 빨리 배우는 것도 중요하지만 기초공사 없이 언어 스킬만 늘리는 것 보다는 밑바닥을 다지며 올라가는 것도 좋습니다. 시간이 조금 더 걸릴 수 있겠습니다만, 기초가 탄탄하면 시간이 갈수록 더 빠르게 기술을 습득할 수 있고 시야도 넓어질 것 입니다.

기본 타입의 상세 사항은 MS 공식문서를 참조하도록 합니다. (참고문서) short, int, double 등 자료형이 많은데 정확하게 다 외울 필요까지는 없습니다. 다만 어느정도 감은 있어야겠지요. 예를 들어 100억이라는 정수를 사용하려면 어떤 자료형이 필요한가? 소수형은? 문자형과 string 은? 이런 질문들에 감을 잡고 대답할 수 있을 정도면 충분합니다.

참고문서

https://docs.microsoft.com/en-us/dotnet/standard/framework-libraries

C# 형식의 기본값 – C# 참조 | Microsoft Docs

Leave a Comment