본문 바로가기
Programming Language/C#

[C#] 구조체

by dbxxrud 2019. 5. 18.

구조체 - 구조체는 데이터를 담기 위한 자료 구조이다. 클래스와 상당 부분 비슷한 데이터 형식인데, 간단한 데이터를 구조화해서 다룰 경우에는 클래스보다 구조체가 좀 더 적합하다. 또한 구조체는 클래스와 마찬가지로 메서드, 프로퍼티 등 거의 비슷한 구조를 가지고 있지만 상속은 할 수 없으며 값 형식이고 인터페이스는 구현 가능하다.

 

 

선언

 

 

 

 

클래스 VS 구조체

 

 

특징 클래스 구조체
키워드 class struct
형식 참조 형식 값 형식
복사 얕은 복사 깊은 복사
인스턴스 생성 new 연산자와 생성자 필요 선언만으로도 생성
생성자 매개 변수 없는 생성자 선언 가능 매개 변수 없는 생성자 선언 불가능
상속 가능 모든 구조체는 System.Object 형식을 상속하는 System.ValueType으로부터 직접 상속 받음

 

 

위 표대로, 클래스는 참조 형식이고 구조체는 값 형식이다(가장 중요한 차이!). 따라서 구조체의 인스턴스는 스택에 할당이 되고 인스턴스가 선언된 블록이 끝나는 지점의 메모리에서 사라진다. 인스턴스의 사용이 끝나면 즉시 메모리에서 제거된다는 점과 가비지 콜렉터를 덜 귀찮게 한다는 점에서 구조체는 클래스에 비해 성능의 이점 또한 가지고 있다.

구조체는 값 형식이기 때문에 할당 연산자 = 를 통해 모든 필드가 그대로 복사 된다.

 

 

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using static System.Console;
 
namespace MyClass
{
    struct Point3D
    {
        public int X;
        public int Y;
        public int Z;
 
        public Point3D(int X, int Y, int Z) //생성자
        {
            this.X = X;
            this.Y = Y;
            this.Z = Z;
        }
 
        public override string ToString() // System.Object 형식의 ToString()
        {
            return string.Format($"{X}, {Y}, {Z}");
        }
    }
 
    class MainApp
    {
        static void Main(string[] args)
        {
            Point3D point3; // 선언만으로도 인스턴스 생성
 
            point3.X = 10;
            point3.Y = 20;
            point3.Z = 40;
 
            WriteLine(point3.ToString());
 
            Point3D point3_2 = new Point3D(100200300); // 생성자를 이용한 인스턴스 생성도 가능
            Point3D point3_3 = point3_2; // 구조체의 인스턴스를 다른 인스턴스에 할당하면 깊은 복사가 이루어짐
            point3_3.Z = 400;
 
            WriteLine(point3_2.ToString());
            WriteLine(point3_3.ToString());
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

 

※ 혼자서 공부하며 정리하는 블로그 입니다.

참고서적 : 이것이 C# 이다.

참고사이트 : http://www.csharpstudy.com/CSharp/CSharp-struct.aspx

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

[C#] ToCharArray()  (0) 2019.05.23
[C#] 인터페이스 (Interface)  (0) 2019.05.18
[C#] 중첩 클래스  (0) 2019.05.18
[C#] 오버라이딩  (0) 2019.05.18
[C#] 상속  (0) 2019.05.18