C# 강좌 15편. 구조체(Structures) [작성 중 2018/02/18]
1. 구조체(Structures)
C/C++에서 등장했던 구조체가 C#에서 다시 한번 등장합니다. 구조체는, 클래스와 상당히 비슷한 구조를 지니고 있습니다. 구조체는 주로 몇 가지의 항목으로 구성된 간단한 개체를 구조화하기 위해 사용됩니다. 예를 들어서, 우리가 2차원의 좌표를 나타내기 위해 Point 구조체를 만들고자 한다면 아래와 같이 나타낼 수 있습니다.
struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } }
위 예제를 보면 클래스와 똑같은 구조를 지니고 있습니다. 클래스와 다를게 없는 것 같은데, 어떤 부분에서 차이가 나는 것일까요? 이를 아래의 도표에서 정리해 보았습니다. (자세한 설명은 이곳)
특징 |
클래스 |
구조체 |
형식 |
참조 형식 (힙에 할당) |
값 형식 (스택에 할당) |
상속 |
가능 |
불가능 |
인터페이스 상속 |
가능 |
가능 |
매개 변수가 없는 명시적 생성자 |
가능 |
불가능 |
MSDN에서는 구조체는 아래와 같은 조건을 모두 만족할 때 사용하기를 권장하고 있습니다.
1. 논리적으로 기본 자료형(integer, double, ...)과 유사한 단일 값을 나타낸다.
2. 인스턴스의 크기가 16 바이트보다 작다.
3. 불변이다.
4. 박싱(Boxing)이 빈번하게 일어나지 않는다.
간단하게 말하면, 구조체는 확장이 필요없는 간단한 데이터 구조를 정의할 때 용이하게 사용될 수 있습니다. 우리가
위의 예제를 보시면, 클래스처럼 멤버 변수를 가질수도 있고, 메소드 역시 가질 수 있습니다. 한번, 구조체를 사용하여 학생의 이름과 국어, 수학, 사회, 과학, 영어 점수를 담는 구조체를 정의해보도록 하겠습니다.
using System; namespace Example { struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class Program { static void Main(string[] args) { Point point1; point1.x = 20; point1.y = 30; Console.WriteLine("point1: x = {0}, y = {1}", point1.x, point1.y); } } }
결과:
point1: x = 20, y = 30
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 9~30행에 Test라는 구조체가 정의되었습니다. name, korean, math, society, science라는 멤버 변수를 가지고, 생성자와, Show 메소드를 멤버로 가집니다. 여기서 주의하실 점은, 매개변수가 없는 생성자와 소멸자는 선언할 수 없으며, 상속을 지원하지도 않고, 디폴트 생성자 정의 역시 지원하지 않습니다. 또 하나는 구조체의 멤버를 초기화 할 수 없다는겁니다. 만약 구조체 내에서 초기화를 하고 싶으시다면 생성자를 구현하여 생성자 내에서 초기화를 하셔야 합니다.
그리고, 36~37행을 보시면 각각 new 연산자로 구조체의 객체를 생성하고, 반대로 39~45행을 보시면 new 연산자를 사용하지 않고 선언만으로도 인스턴스화 할 수 있습니다. 값 타입(Value Type)인 구조체는, 이처럼 바로 접근이 가능하고 서로 대입이 가능합니다. 이렇게 구조체는 C#에서 크기가 작거나, 내부가 그렇게 복잡하지 않을때. 즉, 작고 단순한 메서드를 포함하고 있는 선, 컬러같은 그래픽 요소 등을 구조체로 정의합니다.
... static void Main(string[] args) { Point point2 = new Point(); Point point3 = new Point(10, 10); Console.WriteLine("point2: x = {0}, y = {1}", point2.x, point2.y); Console.WriteLine("point3: x = {0}, y = {1}", point3.x, point3.y); } ...결과:
오늘은 여기에서 강좌를 마치도록 하겠습니다. 수고하셨습니다.
다음 강좌에서는 인터페이스(interface)에 대해 알아보도록 하겠습니다.
'프로그래밍 관련 > C#' 카테고리의 다른 글
C# 강좌 20편. 리플렉션과 애트리뷰트(Reflection and attributes) (7) | 2012.10.16 |
---|---|
C# 강좌 19편. 델리게이트와 이벤트(Delegates and Events) (17) | 2012.10.14 |
C# 강좌 18편. 컬렉션(Collection) (6) | 2012.10.13 |
C# 강좌 17편. 예외 처리(Exception handling) (7) | 2012.10.13 |
C# 강좌 16편. 인터페이스(Interface) (16) | 2012.10.12 |