다음을 통해 공유


C에서 형식 만들기#

이 자습서에서는 C#에서 형식을 만드는 방법을 설명합니다. 소량의 코드를 작성한 다음, 해당 코드를 컴파일하고 실행합니다. 이 자습서에는 C#에서 다양한 종류의 형식을 탐색하는 일련의 단원이 포함되어 있습니다. 이러한 단원에서는 C# 언어의 기본 사항을 설명합니다.

팁 (조언)

코드 조각 블록에 "실행" 단추가 포함된 경우 해당 단추는 대화형 창을 열거나 대화형 창의 기존 코드를 바꿉니다. 코드 조각에 "실행" 단추가 포함되지 않은 경우 코드를 복사하여 현재 대화형 창에 추가할 수 있습니다.

이전 자습서에서는 텍스트와 숫자로 작업했습니다. 문자열과 숫자는 간단한 형식입니다. 각각 하나의 값을 저장합니다. 프로그램이 커짐에 따라 보다 정교한 데이터 구조를 사용해야 합니다. C#에서는 필드, 속성 또는 동작이 더 많은 데이터 구조가 필요할 때 정의할 수 있는 다양한 종류의 형식을 제공합니다. 이러한 형식을 탐색해 보겠습니다.

튜플

튜플은 고정 길이를 가진 정렬된 값 시퀀스입니다. 튜플의 각 요소에는 형식과 선택적 이름이 있습니다. 다음 코드는 2D 점을 나타내는 튜플을 선언합니다. "실행" 단추를 선택하여 다음 코드를 대화형 창에 붙여넣고 실행합니다.

var pt = (X: 1, Y: 2);

var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");

팁 (조언)

C# 또는 프로그래밍 언어를 탐색할 때 코드를 작성할 때 실수를 합니다. 컴파일러는 이러한 오류를 찾아서 보고합니다. 출력에 오류 메시지가 포함된 경우 대화형 창의 예제 코드와 코드를 자세히 확인하여 해결할 사항을 확인합니다. 이 연습은 C# 코드의 구조를 학습하는 데 도움이 됩니다.

튜플의 멤버를 다시 할당할 수 있습니다. 대화형 창에서 기존 코드 다음에 다음 코드를 추가합니다. 결과를 보려면 "실행"을 다시 누릅니다.

pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");

식을 사용하여 원본의 수정된 복사본인 새 튜플을 만들 수도 있습니다 with . 대화형 창에 이미 있는 코드 다음에 다음 코드를 추가하고 "실행"을 눌러 결과를 확인합니다.

var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");

튜플 pt2ptX(6) 값을 포함하고 있으며, pt2.Y은 10입니다.

튜플은 구조적 형식입니다. 즉, 튜플 형식은 string이나 int 같은 이름이 없습니다. 튜플 형식은 멤버 수( arity라고 함) 및 해당 멤버의 형식으로 정의됩니다. 멤버 이름은 편의를 위해 사용됩니다. 멤버의 이름이 다르더라도 동일한 항의 개수 및 형식을 가진 튜플을 다른 튜플에 할당할 수 있습니다. 대화형 창에서 이미 작성한 코드 다음에 다음 코드를 추가하고 사용해 볼 수 있습니다.

var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);

변수 subscript 에는 두 개의 멤버가 있으며 둘 다 정수입니다. subscriptpt는 모두 동일한 튜플 형식의 인스턴스로, 2명의 int 멤버를 포함하는 튜플입니다.

튜플을 쉽게 만들 수 있습니다. 괄호로 묶인 여러 멤버를 선언합니다. 다음 항목은 각기 다른 형식과 원소 수를 가진 여러 튜플을 선언합니다. 다음 코드를 추가하여 새 튜플 형식을 만듭니다.

var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);

튜플은 쉽게 만들 수 있지만 기능이 제한됩니다. 튜플 형식에는 이름이 없으므로 값 집합에 의미를 전달할 수 없습니다. 튜플 형식은 동작을 추가할 수 없습니다. C#에는 형식이 동작을 정의할 때 만들 수 있는 다른 종류의 형식이 있습니다.

레코드 형식 만들기

튜플은 동일한 구조에서 여러 값을 원하는 경우에 적합합니다. 가볍고, 사용 시 즉시 선언할 수 있습니다. 프로그램이 진행되면서 코드 전체에서 동일한 튜플 형식을 사용하는 것을 확인할 수 있습니다. 앱이 2D 그래프 공간에서 작동하는 경우 점을 나타내는 튜플이 일반적일 수 있습니다. 이 값을 찾으면 해당 값을 저장하고 더 많은 기능을 제공하는 형식을 선언 record 할 수 있습니다. 다음 코드 샘플에서는 메서드를 Main 사용하여 프로그램의 진입점을 나타냅니다. 이렇게 하면 코드의 record 진입점 앞에 형식을 선언할 수 있습니다. 다음 코드에서 "실행" 단추를 눌러 기존 샘플을 다음 코드로 바꿉니다.

경고

복사하여 붙여넣지 마세요. 다음 샘플을 실행하려면 대화형 창을 다시 설정해야 합니다. 실수를 하면 창이 중단되고 계속하려면 페이지를 새로 고쳐야 합니다.

다음 코드는 record 형식을 선언하고 Point를 나타내는 데 사용하며, Main 메서드에서 그 Point 구조를 사용합니다.

public record Point(int X, int Y);

public static void Main()
{
    Point pt = new Point(1, 1);
    var pt2 = pt with { Y = 10 };
    Console.WriteLine($"The two points are {pt} and {pt2}");
}

record 선언은 값을 X 저장하는 형식 및 Y 읽기 전용 속성에 대한 Point 코드의 한 줄입니다. 해당 형식을 사용하는 모든 위치에서 이름을 Point 사용합니다. 형식과 같이 Point올바르게 명명된 형식은 형식이 사용되는 방법에 대한 정보를 제공합니다. 이 메서드는 Main 식을 사용하여 with 기존 지점의 수정된 복사본인 새 지점을 만드는 방법을 보여 있습니다. 줄 pt2 = pt with { Y = 10 } 에는 "pt2 10에 할당된 값을 제외하고 동일한 값 ptY 있습니다."가 표시됩니다. 단일 with 식에서 변경할 속성 수를 추가할 수 있습니다.

record 의 선언은 모든 C# 문과 같이 끝나는 ;한 줄의 코드입니다. 멤버를 선언하여 record 형식에 동작을 추가할 수 있습니다. 레코드 멤버는 함수 또는 더 많은 데이터 요소일 수 있습니다. 형식의 멤버는 형식 선언과 문자 사이에 { 있습니다 } . 만든 레코드 선언을 다음 코드로 바꿉다.

public record Point(int X, int Y)
{
    public double Slope() => (double)Y / (double)X;
}

그런 다음 식이 포함된 줄 다음에 다음 코드를 Main 메서드에 추가합니다 with .

double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");

튜플에 형식과 Y 값을 나타내는 형식을 X 추가했습니다. 명명된 형식을 record 정의하고 기울기를 계산하는 멤버를 포함했습니다. record 형식은 추가 동작을 포함하는 형식 classrecord class약식입니다. 형식을 Point 수정하여 다음과 같이 만들 record struct 수 있습니다.

public record struct Point(int X, int Y)
{
    public double Slope() => (double) Y / (double) X;
}

record struct는 모든 record 형식에 추가된 추가 동작을 포함하는 struct 형식입니다.

구조체, 클래스 및 인터페이스 형식

C#의 모든 명명된 형식은 class 형식이거나 struct 형식입니다. A class참조 형식입니다. A struct값 형식입니다. 값 형식의 변수는 인스턴스의 내용을 메모리에 인라인으로 저장합니다. 즉, record struct Point는 두 개의 정수, XY를 저장합니다. 참조 형식의 변수는 인스턴스의 스토리지에 대한 참조 또는 포인터를 저장합니다. 즉, record class PointXY 값을 보유하는 메모리 블록에 대한 참조를 저장합니다.

실제로 값 형식은 할당될 때 복사되지만, 클래스 인스턴스의 경우 복사본은 참조의 복사본입니다. 복사된 참조는 XY에 대해 동일한 스토리지를 사용하는 지점의 동일한 인스턴스를 가리킵니다.

record 한정자는 컴파일러에 여러 멤버를 작성하도록 지시합니다. 기본 사항 섹션의 레코드 형식 에 대한 문서에서 자세히 알아볼 수 있습니다.

형식을 record 선언할 때 형식은 같음 비교, 할당 및 해당 형식의 인스턴스 복사에 기본 동작 집합을 사용해야 한다고 선언합니다. 관련 데이터를 저장하는 것이 형식의 주요 책임인 경우 레코드가 가장 적합합니다. 동작을 더 추가할 때는 record 한정자를 사용하지 않고 struct 또는 class 형식을 사용하는 것을 고려하십시오.

보다 정교한 동작이 필요할 때 값 형식에 struct 형식을 사용하지만, 주된 책임은 값을 저장하는 것입니다. 형식을 사용하여 캡슐화, 상속 및 다형성과 같은 개체 지향 관용구를 사용합니다 class .

다른 형식이 구현해야 하는 동작 계약을 선언하는 형식을 정의 interface 할 수도 있습니다. struct 형식과 class 형식 모두 인터페이스를 구현할 수 있습니다.

일반적으로 더 큰 프로그램 및 라이브러리에서 이러한 모든 형식을 사용합니다. .NET SDK를 설치한 후에는 기본 사항 섹션의 클래스 에 대한 자습서를 사용하여 이러한 형식을 탐색할 수 있습니다.

"C#에서 형식 만들기" 대화형 자습서를 완료했습니다. 분기 및 루프 링크를 선택하여 다음 대화형 자습서를 시작하거나 .NET 사이트 방문하여 .NET SDK를 다운로드하고, 머신에 프로젝트를 만들고, 코딩을 계속할 수 있습니다. "다음 단계" 섹션에서는 이러한 자습서로 돌아갑니다.

다음 문서에서 C#의 형식에 대해 자세히 알아볼 수 있습니다.