Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
07-05 07:53
관리 메뉴

nomad-programmer

[Programming/C#] 구조체 (Structure) 본문

Programming/C#

[Programming/C#] 구조체 (Structure)

scii 2020. 9. 9. 23:01

C#의 복합 데이터 형식에는 클래스 말고도 구조체(Structure)라는 것이 있다. 구조체는 클래스하고 사촌지간쯤 된다. 필드와 메소드를 가질 수 있는 등 상당 부분 비슷하다.

struct 구조체이름
{
    // 필드, ...
    // 메소드, ...
}

struct MyStruct
{
    public int field1
    public int field2
    
    public void MyMethod()
    {
    }
}
구조체에서 public을 많이 사용하는 이유?

문법적으로 클래스와 유사하기는 해도, 각자의 존재의 이유는 조금 다르다. 클래스는 실세계의 객체를 추상화하려는데 그 존재의 이유가 있지만, 구조체는 데이터를 담기 위한 자료 구조로 사용된다. 따라서 굳이 은닉성을 비롯한 객체 지향의 원칙을 구조체에 강하게 적용하지는 않는 편이며, 편의를 위해 필드를 public으로 선언해서 사용하는 경우가 많다.

클래스와 구조체의 차이점

특징 클래스 구조체
키워드 class struct
형식 참조 형식 값 형식
복사 얕은 복사(Shallow Copy) 깊은 복사(Deep Copy)
인스턴스 생성 new 연산자와 생성자 필요 선언만으로도 생성
생성자 매개 변수 없는 생성자 선언 가능 매개 변순 없는 생성자 선언 불가능
상속 가능 모든 구조체는 System.Object 형식을 상속하는System.ValueType 으로부터 직접 상속 받음
클래스와 구조체의 가장 중요한 차이점? 바로 클래스는 참조 형식이고 구조체는 값 형식이라는 점이다.

클래스는 참조 형식이고 구조체는 값 형식이다. 따라서 구조체의 인스턴스는 스택에 할당되고 인스턴스가 선언된 블록이 끝나는 지점에 다다르면 메모리에서 사라진다.

인스턴스의 사용이 끝나면 즉시 메모리에서 제거된다는 점과 가비지 컬렉터를 덜 사용한다는 점에서 구조체는 클래스에 비해 성능의 이점을 가진다. 예를 들어 3차원 게임을 C#으롤 만들다고 가정하면 화면에 나타내야 할 수많은 좌표들의 사용이 끝나면 즉시 메모리에서 해제되는 것과 메모리에 그대로 남아 가비지 컬렉터를 사용하는 것, 이 정도만 생각해봐도 구조체를 사용할만한 동기가 될 것이다.

구조체는 값 형식이기 때문에 할당 연산자 = 를 통해 모든 필드가 그대로 복사된다.
구조체는 생성자를 호출할 때가 아니면 굳이 new 연산자를 사용하지 않아도 인스턴스를 만들 수 있다. 그리고 생성자를 호출하지 않아도 구조체의 각 필드는 CLR이 기본값으로 초기화 해준다.

using System;

namespace CSharpExample
{
    struct Point3D
    {
        public double x;
        public double y;
        public double z;

        public Point3D(double x, double y, double z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        // System.Object 형식의 ToString() 메소드를 오버라이딩
        public override string ToString()
        {
            return string.Format($"{x}, {y}, {z}");
        }
    }

    class MainApp
    {
        static int Main(string[] args)
        {
            // 선언만으로도 인스턴스가 생성됨.
            Point3D p3d1;
            p3d1.x = 10;
            p3d1.y = 20;
            p3d1.z = 40;

            Console.WriteLine(p3d1.ToString());

            // 생성자를 이용한 인스턴스 생성. 생성자 호출로 인해 new 키워드가 붙었다.
            Point3D p3d2 = new Point3D(100, 200, 300);

            // 구조체의 인스턴스를 다른 인스턴스에 할당하면 깊은 복사가 이루어진다.
            Point3D p3d3 = p3d2;
            p3d3.z = 400;

            Console.WriteLine(p3d2.ToString());
            Console.WriteLine(p3d3.ToString());

            return 0;
        }
    }
}


/* 결과

10, 20, 40
100, 200, 300
100, 200, 400

*/

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

[Programming/C#] 인터페이스 (interface)  (0) 2020.09.10
[Programming/C#] 튜플 (Tuple)  (0) 2020.09.09
[Programming/C#] 확장 메소드  (0) 2020.09.09
[Programming/C#] 분할 클래스  (0) 2020.09.09
[Programming/C#] 중첩 클래스  (0) 2020.09.09
Comments