Struct vs Class

C++에서 구조체와 클래스의 차이는 기본 접근 권한자 차이밖에 없다.
클래스는 디폴트로 private, 구조체는 public을 가진다.

C#도 C++과 같을까?

아니다. 둘은 완전히 다른다.

< C# 구조체와  클래스 차이점 >

클래스는 참조 타입이며 힙에만 생성됨
구조체는 갑 타입으로 스택과 힙에 생성된다.
구조체안에서 직접 초기화를 못한다.
클래스 배열을 만들면 할당전에는 null로 초기화 된다.
구조체 배열을 만들면 모든 값이 기본적으로 할당된다.

< 구조체는 값처럼 생성 할수 있다 >

구조체는 new를 이용해 생성 할 수도 있지만 아래와 같이 값처럼 생성해서 사용 할 수도 있다.
이때는 힙이 아니라 스택에 생성 된다.

    struct People
    {
        public string name;
        public string age;
    }

    class Test
    {
        public Test()
        {
            People p;
            p.name = "simpson";
            p.age = "20";
            Console.WriteLine("Value {0}, {1}", p.name, p.age);
        }
    }

 


< 클래스와 구조체의 리턴값 차이점 >

구조체를 값 타입이라 리턴 값을 바꿀수 없다.
클래스는 참조 타입이라 리턴값을 변경 할 수 있다.

class Class

{

    public int a;

}

struct Struct

{

    public int a;

}

 

 

namespace struct_vs_class

{

    class Program

    {

        static Class mClass;

        static Struct mStruct;

        static Class CreateClass()

        {

            mClass = new Class();

            return mClass;

        }

 

        static Struct CreateStruct()

        {

            mStruct = new Struct();

            return mStruct;

        }

 

        static void Main(string[] args)

        {

            CreateClass().a = 100;

            //CreateStruct().a = 100;

            //오류 CS1612: 변수가 아니므로 'struct_vs_class.Program.CreateStruct()'의 반환 값을 수정할 수 없습니다.

            Struct s = CreateStruct();

            s.a = 100;

 

            Console.WriteLine( "Class: " + mClass.a + "  Struct: " + mStruct.a);

        }

    }

}

결과 :

Class: 100  Struct: 0

 

< 클래스와 구조체 배열 차이점 >

클래스 배열은 null로 초기화 된다.
구조체 배열은 디폴트 값이 모두 할당 된다.
 

class Class

{

    public int a = 0;

}

struct Struct

{

    //public int a = 0; 초기화 못함

    public int a;

}

 

 

namespace struct_vs_class

{

    class Program

    {

        static Class [] mClass = new Class[2];

        static Struct [] mStruct = new Struct[2];

 

        static void Main(string[] args)

        {

            Console.WriteLine( "Class is null: " + (mClass[0]==null) + "  Struct: " + mStruct[0]);

        }

    }

}

결과 :

Class is null: True  Struct: Struct

 

< 메모리 차이 >

참조 : http://www.dotnetperls.com/struct

Class version

 

Size of List:

1 object
512 KB

Size of internal array:

100000 objects
3.8 MB

Struct version

 

Size of List:

1 object
24 bytes

Size of internal array:

100000  object
4.0 MB

오브젝트 한 개일때는 구조체가 메모리 용량이 작지만, 배열일대는 클래스의 메모리 용량이 더 작다.
구조체가 값에 의한 호출이라 배열일때 더 많은 용량을 차지한다.

< 할당 속도 차이 >

참조 : http://www.dotnetperls.com/struct

Class with 8 ints:               2418 ms
Struct with 8 ints:               936 ms [faster]

Class with 4 string references:  2184 ms
Struct with 4 string references:  795 ms [faster]

10만 반복을 1000만 루프로 반복 해서 오브젝트를 생성 했을 때 차이이다.
구조체가 훨씬 빠른다.
이렇게 많은 데이터를 한꺼번에 생성하지 않는다면 구조체든 클래스든 뭘 사용 하던지 상관이 없을 것이다.