2. 사용자 정의 자료형(User-Defined Type)은 구조체(struct)와 열거체(enum)와 클래스 (Class)으로 나누어져 있습니다. (클래스는 중요하니 다음 파트에서 설명드리겠습니다.)
클래스와 구조체 차이점
특징 클래스 구조체 키워드 class struct 형식 참조 형식(힙에 할당) 값 형식(스택에 할당) 복사 앝은 복사(Shallow Copy) 깊은 복사 인스턴스 생성 new 연산자와 생성자 필요 선언만으로도 생성 생성자 매개변수 없는 생성자 선언 가능 매개변수 없는 생성자 선언 불가능 상속 가능 값 형식이므로 상속 불가능

구조체는 값 형식 입니다.
구조체의 인스턴스는 스택에 할당되고 인스턴스가 선언된 블록이 끝나는 지점의 메모리에서 사라집니다.
인스턴스의 사용이 끝나면 즉시 메모리에서 제거된다는 점과 가비지 콜렉터를 덜 귀찮게 한다는 점에서 이점을 가집니다.
MyStruct s;
s.MyField1 = 1;
s.MyField1 = 2;
MyStruct t;
t = s;
s.MyField1 = 3;
s의 MyField1은 3, MyField2는 2이지만
t의 MyField1은 1, MyField2는 2입니다.
이유가 구조체는 값만 복사 되서 바꿀 뿐, 주소는 복사 되지 않습니다.
주소가 바뀌면 그 주소에 있는 값이 나오게 됩니다.
상태의 변화를 허용하는 객체 => 변경가능(Mutable)객체
상태의 변화를 허용하지 않는 객체 => 변경불가능(Immutable)객체
변경불가능(Immutable)객체
1. 멀티 스레드 간 동기화 할 필요 없음 => 프로그램 성능 향상
2. 버그로 인한 상태(데이터)의 오염을 막을 수 있습니다.
=>프로그램 버그를 유발시키는 상태 오염의 원인을 찾기 위해 수맣은 스레드를 디버깅해야 하는 괴로움과 성능 최적화를 위해 코드를 쥐여짜야 하는 괴로움을 겪지 않아도 된다는 의미 입니다
구조체 형식이 변경이 불가능한 것임을 선언하려면 readonly 한정자를 사용합니다. readonly 구조체의 모든 데이터 멤버는 다음과 같이 읽기 전용이어야 합니다.
코드를 입력하세요
readonly struct ImmutableStruct()
{
public readonly int ImmutableField; //OK
public int MutableField; //컴파일 에러
}