구조체(Structures)
C/C++에서 등장했던 구조체가 C#에서 다시한번 등장합니다. 구조체는, 클래스와 상당히 비슷한 구조를 지니고 있습니다. 하지만 무시할 수 없는 큰 차이점이 존재하는데, 클래스는 힙에 생성되는 참조 타입(Reference Type)이고, 구조체는 스택에 생성되는 값 타입(Value Type)이라는 것이죠. 구조체는 클래스보다 메모리 소모가 덜하므로 어떤 개발자들은 구조체를 더 선호하기도 합니다. 아래는 구조체의 선언 형식입니다.
struct 구조체명 { // 멤버 변수.. 메소드.. }
위의 예제를 보시면, 클래스처럼 멤버 변수를 가질수도 있고, 메소드 역시 가질 수 있습니다. 한번, 구조체를 사용하여 학생의 이름과 국어, 수학, 사회, 과학, 영어 점수를 담는 구조체를 정의해보도록 하겠습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication24 { struct Test { public string name; public int korean; public int math; public int society; public int science; public Test(string name, int korean, int math, int society, int science) { this.name = name; this.korean = korean; this.math = math; this.society = society; this.science = science; } public void Show() { Console.WriteLine(name + "의 시험 점수:"); Console.WriteLine("국어: " + korean + ", 수학: " + math + ", 사회:" + society + ", 과학: " + science); } } class Program { static void Main(string[] args) { Test student1 = new Test("김철수", 94, 96, 84, 92); student1.Show(); Test student2; student2.name = "김영희"; student2.korean = 100; student2.math = 84; student2.society = 96; student2.science = 86; student2.Show(); } } }
김철수의 시험 점수: 국어: 94, 수학: 96, 사회:84, 과학: 92 김영희의 시험 점수: 국어: 100, 수학: 84, 사회:96, 과학: 86 계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 9~30행에 Test라는 구조체가 정의되었습니다. name, korean, math, society, science라는 멤버 변수를 가지고, 생성자와, Show 메소드를 멤버로 가집니다. 여기서 주의하실 점은, 매개변수가 없는 생성자와 소멸자는 선언할 수 없으며, 상속을 지원하지도 않고, 디폴트 생성자 정의 역시 지원하지 않습니다. 또 하나는 구조체의 멤버를 초기화 할 수 없다는겁니다. 만약 구조체 내에서 초기화를 하고 싶으시다면 생성자를 구현하여 생성자 내에서 초기화를 하셔야 합니다.
그리고, 36~37행을 보시면 각각 new 연산자로 구조체의 객체를 생성하고, 반대로 39~45행을 보시면 new 연산자를 사용하지 않고 선언만으로도 인스턴스화 할 수 있습니다. 값 타입(Value Type)인 구조체는, 이처럼 바로 접근이 가능하고 서로 대입이 가능합니다. 이렇게 구조체는 C#에서 크기가 작거나, 내부가 그렇게 복잡하지 않을때. 즉, 작고 단순한 메서드를 포함하고 있는 선, 컬러같은 그래픽 요소 등을 구조체로 정의합니다.