English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#에서 struct는 값 타입 데이터 타입으로서 데이터 구조를 표현합니다. 그것은 파라미터화된 생성자, 정적 생성자, 상수, 필드, 메서드, 속성, 인덱서, 연산자, 이벤트, 내장 타입 등을 포함할 수 있습니다.
struct는 상속이 필요하지 않은 작은 데이터 값을 저장하는 데 사용될 수 있습니다. 예를 들어, 좌표 포인트, 키-밸류 쌍, 복잡한 데이터 구조 등입니다.
struct 키워드를 사용하여 구조를 선언합니다. 기본 접근자는 구조와 그 멤버의 내부 접근자입니다.
다음 예제는 좌표 그래프 구조를 선언합니다.
struct Coordinate { public int x; public int y; }
기본 타입 변수와 마찬가지로 new 연산자를 사용하거나 사용하지 않고 struct 객체를 생성할 수 있습니다.
struct Coordinate { public int x; public int y; } Coordinate point = new Coordinate(); Console.WriteLine(point.x); //출력: 0 Console.WriteLine(point.y); //출력: 0
위에서 new 키워드를 사용하여 Coordinate(좌표) 구조의 객체를 생성했습니다. 이는 구조의 기본적인 파라미터 없는 생성자를 호출하며, 모든 멤버가 지정된 데이터 유형의 기본 값으로 초기화됩니다.
new 키워드를 사용하지 않고 struct 유형의 변수를 선언하면, 어떤 생성자도 호출되지 않으며 모든 멤버가 초기화되지 않은 상태로 남습니다. 따라서 각 멤버에 접근하기 전에 그들에게 값을 할당해야 하지 않으면 컴파일 시에 오류가 발생합니다.
struct Coordinate { public int x; public int y; } Coordinate point; Console.Write(point.x); // 컴파일 시 오류 point.x = 10; point.y = 20; Console.Write(point.x); //출력:10 Console.Write(point.y); //출력:20
구조(struct)은 파라미터 없는 생성자를 포함할 수 없습니다. 그것은 파라미터화된 생성자나 정적 생성자만 포함할 수 있습니다.
struct Coordinate { public int x; public int y; public Coordinate(int x, int y) { this.x = x; this.y = y; } } Coordinate point = new Coordinate(10, 20); Console.WriteLine(point.x); //출력:10 Console.WriteLine(point.y); //출력:20
파라미터화된 생성자에서 모든 구조의 멤버를 포함하고 멤버에 할당해야 합니다. 그렇지 않으면, 어떤 멤버가 할당되지 않은 상태로 남아 있으면 C# 컴파일러는 컴파일 시에 오류를 출력합니다.
struct(구조)는 속성, 자동 구현 속성, 메서드 등을 포함할 수 있으며, 클래스와 같습니다.
struct Coordinate { public int x { get; set; } public int y { get; set; } public void SetOrigin() { this.x = 0; this.y = 0; } } Coordinate point = Coordinate(); point.SetOrigin(); Console.WriteLine(point.x); //출력: 0 Console.WriteLine(point.y); //출력: 0
다음 struct에는 정적 메서드가 포함되어 있습니다.
struct Coordinate { public int x; public int y; public Coordinate(int x, int y) { this.x = x; this.y = y; } public static Coordinate GetOrigin() { return new Coordinate(); } } Coordinate point = Coordinate.GetOrigin(); Console.WriteLine(point.x); //출력: 0 Console.WriteLine(point.y); //출력: 0
구조는 특정 작업에 대한 구독자를 알릴 이벤트를 포함할 수 있습니다. 아래의 구조체(struct)는 이벤트를 포함하고 있습니다.
struct Coordinate { private int _x, _y; public int x { get{ return _x; } set{ _x = value; CoordinatesChanged(_x); } } public int y { get{ return _y; } set{ _y = value; CoordinatesChanged(_y); } } public event Action<int> CoordinatesChanged; }
위의 구조는 coordinateChanged 이벤트를 포함하고 있으며, x 또는 y 좌표가 변경될 때 이 이벤트가 발생합니다. 아래의 예제는 CoordinateChanged 이벤트를 처리하는 방법을 보여줍니다.
class Program { static void Main(string[] args) { Coordinate point = new Coordinate(); point.CoordinatesChanged += StructEventHandler; point.x = 10; point.y = 20; } static void StructEventHandler(int point) { Console.WriteLine("좌표가 변경되었습니다: {0}", point); } }
struct는 값형 타입이므로 클래스 객체보다 빠르다. 데이터를 저장하려고 할 때마다 struct를 사용하십시오. 일반적으로 구조는 게임 프로그래밍에 적합합니다. 그러나 구조보다 클래스 객체를 전송하는 것이 더 쉽습니다. 따라서 데이터를 네트워크나 다른 클래스를 통해 전송할 때는 struct를 사용하지 마십시오.
struct은 생성자, 상수, 필드, 메서드, 프로퍼티, 인덱서, 연산자, 이벤트 및 내장 타입을 포함할 수 있습니다.
struct은 매개변수가 없는 생성자나 디스트럭터를 포함할 수 없습니다.
struct은 클래스와 동일한 인터페이스를 구현할 수 있습니다.
struct은 다른 구조체나 클래스를 상속할 수 없으며, 클래스의 기본 클래스로 사용할 수도 없습니다.
struct은 구성원을 추상 구성원, 닫힌 구성원, 가상 구성원 또는 보호된 구성원으로 지정할 수 없습니다.