C#
5. 구조체
루체도
2020. 1. 29. 22:14
C#의 복합 데이터 형식에는 클래스 말고도 구조체라는 것이 있다.
구조체는 클래스의 사촌지간쯤 된다고 생각하면 편하다.
구조체도 필드와 메소드를 가질 수 있고 상당 부분이 비슷하다.
다음과 같이 struct 키워드를 이용해 선언한다.
struct 구조체명
{
}
////
struct ExampleStruct
{
public int Field1;
public int Field2;
}
구조체는 데이터를 담기 위한 자료 구조로 사용된다.
따라서 은닉성은 고려하지 않고 편의를 위해 필드를 public으로 선언해서 사용하는 경우가 많다.
다음 표는 구조체와 클래스의 차이점이다.
특징 | 클래스 | 구조체 |
키워드 | class | struct |
형식 | 참조 형식 | 값 형식 |
복사 | 얕은 복사 | 깊은 복사 |
인스턴스 생성 | new 연산자와 생성자 필요 | 선언만으로도 생성 |
생성자 | 매개 변수 없어도 생성자 선언 가능 | 매개변수 없으면 생성자 선언 불가 |
상속 | 가능 | 모든 구조체는 System.ValueType을 직접 상속받고 있다. |
가장 큰 차이점은 클래스는 참조 형식이고 구조체는 값 형식인 것이다.
구조체의 인스턴스느 스택에 할당되고 블록이 끝나는 지점에서 메모리에서 사라진다.
따라서 가비지 컬렉터를 귀찮게 하지도 않고 즉시 메모리에서 제거가 되서 성능의 이점을 가진다.
예를 들면 사용이 끝났을 때 해제되어야 할 인스턴스가 클래스 형태면 해당 블록이 끝난 이후에도 메모리에
계속 남아있다가 가비지 컬렉터가 처리해야 되서 성능에 저하가 발생한다. 그러나 이것을 구조체로 구현할 경우에는
알아서 메모리에서 제거가 된다.
구조체의 깊은 복사의 예
ExampleStruct st;
st.Field1 = 1;
st.Field2 = 3;
ExampleStruct st2;
st2 = st1;
st.Field1 = 4;
//st의 Field1은 1이고 st2의 Field1은 4가 된다.