오늘은 C#에서 객체를 표현하는데 사용되는 가장 대표적인 2가지인 클래스와 구조체에 대해서 이야기를 해보도록 하겠습니다. 클래스와 구조체에 대한 예제코드를 알아보고 어떤 상황에 클래스를 사용하고 구조체를 사용하면 좋은지에 대해서 이야기를 해보도록 하겠습니다.
우선 구조체는 아주 옛날부터 존재했던 개념입니다. 객체 지향이라는 개념이 없을때 객체를 정의하기 위해서 구조체를 사용했는데요. 구조체는 변수와 함수로 이루어져 있습니다.
코드 앞에 접근제한자를 붙이고 struct 를 이용해서 정의를 합니다. 학생이라는 구조체를 만들어보도록 하겠습니다.
간단하게 학생번호와 이름 전공을 갖고 있는 학생이라는 구조체입니다. 구조체의 경우 생성자를 사용하게 되면 몇가지 제약조건이 생기게 되는데요. 매개변수가 없는 생성자를 만들 수 없고, 생성자를 생성하게 되면 필드가 모두 할당이 되어있어야합니다.
이런식으로 사용할 수 없다는 것입니다. 이런 경우에는 차라리 생성자를 사용하지 않으면 int, string의 기본값으로 초기화가 됩니다.
그리고 구조체의 경우 상속이라는 개념이 없습니다. 상속은 클래스가 만들어진 다음에 생긴 개념이기 때문에 클래스 이전에 생긴 구조체의 경우 상속이라는 개념이 업습니다.
그리고 구조체의 경우 스택 메모리에 할당이 됩니다. 그래서 생성을 하면 초기값을 설정을 해야하는 것입니다.
클래스는 구조체가 생기고 구조체에서 할 수 없는 것들이 생기면서 조금 더 코드를 쉽게 작성할 수 있게 만들어진 개념입니다. 객체 지향이라는 개념이 생기면서 함께 생긴 개념으로 자식 클래스와 부모 클래스의 개념이 생기고 상속이라는 아주 유용한 기능이 생기게 된 것이 클래스인데요.
여기서 상속이란 부모 클래스의 성질을 자식 클래스가 물려 받고 또 다른 성질을 표현하는 것을 의미하는데요. 예를 들어서 동물이라는 클래스가 있고, 이 동물이라는 클래스를 상속 받아서 코끼리 클래스, 사자 클래스, 원숭이 클래스와 같이 다양한 클래스를 만들 수 있습니다. 이건 매우 단적이 예이고 상속은 다음에 더 자세하게 다루도록 하곘습니다.
우선 클래스의 경우 구조체에서 에러가 났던 것들이 허용됩니다.
클래스는 구조체와 다르게 힙 메모리 영역에 할당이 되고 해당 클래스가 할당된 힙 메모리의 주소가 스택 메모리에 추가가 됩니다. 즉 메모리의 주소와 실제 메모리가 다르다는 것이죠.
그러면 구조체와 클래스는 각각 어느때 사용하는 것이 올바르게 사용하는 것인지 이야기를 해보도록 하겠습니다. 사실 두개를 혼용해서 사용해서 에러만 안난다면 어떤 것을 사용하던 상관없지라고 생각할 수 있겠지만, 조금 더 최적화된 프로그램을 만들기 위해서는 명확한 기준을 세우고 구분해서 사용하는 것이 좋다고 생각합니다.
클래스를 사용해야하는 경우
1. 상속이 필요한 경우
2. 메모리를 많이 차지하는 경우
구조체를 사용해야하는 경우
1. 짧게 생성되고 없어지는 경우
2. 클래스를 사용할 필요가 없는 경우
C# 에서 힙 메모리는 가비지 컬렉터가 자동으로 메모리를 관리하는데, 이때 클래스에 메모리가 자주 생성되고 없어진다면 가비지 컬럭터가 필요 이상으로 호출되기 때문에 퍼포먼스가 내려가기 때문에 구조체를 자주 사용하는 것이 좋은데요. 하지만 구조체의 경우 스택 메모리에 할당되고 스택 메모리는 가용 메모리가 작기 때문에 필요한만큼 생성하는 것이 좋습니다.
즉, 두 가지를 적절하게 사용하는 것이 중요합니다.
WPF 처음 시작하는 분들은 꼭 보세요. (1탄) (9) | 2020.04.19 |
---|---|
WPF Control 상속 관계 정리 (4) | 2020.04.17 |
C# Boxing And UnBoxing (1) | 2020.03.29 |
C# 메모리구조, 스택(Stack), 힙(Heap) (0) | 2020.03.25 |
C# 프로그래밍 Bitmap 사용방법 (2) | 2020.03.24 |
댓글 영역