서론

  • 최근 작업하고 있는 주식 프로젝트에서 디비의 체결데이터를 가져와 처리하는 로직이 있었다. 종목코드, 시가, 고가, 저가, 종가 등을 저장해야 하는데 나는 딕셔너리안의 배열을 넣는 구조로 자료구조를 이용하였다. 그런데 팀원 중 한명이 딕셔너리 구조체를 사용해보라고 알려줘서 구조체라는 개념에 대해 공부해보려고 한다.

구조체

  • C#은 Value Type과 Reference Type 을 지원한다.
  • C#에서는 struct를 사용하면 Value Type을 만들고, Class를 사용하면 Reference Type을 만든다.
  • C# .NET의 기본 데이터형들은 struct로 정의되어 있다.
using System;

namespace MySystem
{
   class Program
   {
      // 구조체 정의
      struct MyPoint
      {
         public int X;
         public int Y;

         public MyPoint(int x, int y)
         {
            this.X = x;
            this.Y = y;
         }

         public override string ToString()
         {
            return string.Format("({0}, {1})", X, Y);
         }
      }

      static void Main(string[] args)
      {
         // 구조체 사용
         MyPoint pt = new MyPoint(10, 12);
         Console.WriteLine(pt.ToString());
      }
   }
}

  • 클래스는 실세계의 객체를 추상화하는데 존재의 이유가 있지만, 구조체데이터를 담기 위한 자료구조로 사용된다.

  • 특징 클래스 구조체
    키워드 class struct
    형식 참조 형식 값 형식
    복사 얕은 복사 깊은 복사
    인스턴스 생성 new 연산자와 생성자 필요 선언만으로 생성
    생성자 매개변수 없는 생성자 선언 가능 매개변수 없는 생성자 선언 불가능
    상속 가능 모든 구조체는 System.Object 형식을 상속하는 System.Value.Type으로부터 직접 상속받는다.
  • 구조체는 값 형식이기 때문에 구조체의 인스턴스는 스택에 할당되고 인스턴스가 선언된 블록이 끝나는 지점에서 메모리에서 즉시 제거된다.
  • 그러기 때문에 가비지 컬렉터를 호출하지 않아 클래스에 비해 속도가 빠르다.

다른 예제

struct Student {
    public string name;
    public int std_num;
    public int age;
};
using System;
 
struct Student {
    public string name;
    public int std_num;
    public int age;
};
 
public class MyStructTest {
    public static void Main(string[] args) {
        Student std; // 구조체 변수 선언
        Student std2;
 
        std.name = "최창현";
        std.std_num = 20201121;
        std.age = 29;
 
        std2.name = "파덕이";
        std2.std_num = 20201122;
        std2.age = 30;
 
        Console.WriteLine("Student 1 name : {0}", std.name);
        Console.WriteLine("Student 1 std_num : {0}", std.std_num);
        Console.WriteLine("Student 1 age : {0}", std.age);
 
        Console.WriteLine("Student 2 name : {0}", std2.name);
        Console.WriteLine("Student 2 std_num : {0}", std2.std_num);
        Console.WriteLine("Student 2 age : {0}", std2.age);
 
    }
}