C#의 클래스, 구조체 및 레코드 개요

C#에서 형식(클래스, 구조체 또는 레코드)의 정의는 형식이 수행할 수 있는 작업을 지정하는 청사진과 같습니다. 개체는 기본적으로 청사진에 따라 구성 및 할당된 메모리 블록입니다. 이 문서에서는 이러한 청사진과 해당 기능에 대한 개요를 제공합니다. 이 시리즈의 다음 문서에서는 개체를 소개합니다.

캡슐화

캡슐화는 경우에 따라 개체 지향 프로그래밍의 첫 번째 pillar 또는 원리로 인식됩니다. 클래스 또는 구조체는 클래스 또는 구조체 외부의 코드에 각 멤버가 액세스하는 방법을 지정할 수 있습니다. 클래스 또는 어셈블리 외부에서 사용하지 않으려는 메서드 및 변수를 숨겨 코딩 오류 또는 악의적인 악용 가능성을 제한할 수 있습니다. 자세한 내용은 개체 지향 프로그래밍 자습서를 참조하세요.

멤버

형식의 ‘멤버’는 모든 메서드, 필드, 상수, 속성, 이벤트를 포함합니다. 다른 언어에는 있지만 C#에는 전역 변수 또는 메서드가 없습니다. 프로그램의 진입점인 Main 메서드까지도 클래스나 구조체 내에 선언되어야 합니다(최상위 문을 사용하는 경우 암시적으로).

다음 목록은 클래스, 구조체 또는 레코드에서 선언될 수 있는 모든 다양한 종류의 멤버입니다.

  • 필드
  • 상수
  • 속성
  • 메서드
  • 생성자
  • 이벤트
  • 종료자
  • 인덱서
  • 연산자
  • 중첩 형식

자세한 내용은 멤버를 참조하세요.

접근성

일부 메서드 및 속성은 클라이언트 코드라고 하는 클래스 또는 구조체 외부의 코드에서 호출하거나 액세스할 수 있습니다. 다른 메서드 및 속성은 클래스 또는 구조체 자체에서만 사용할 수 있습니다. 의도된 클라이언트 코드에서만 연결될 수 있도록 코드의 액세스 가능성을 제한하는 것이 중요합니다. 어떻게 형식 및 해당 멤버가 다음 액세스 한정자를 사용하여 클라이언트 코드에 액세스할 수 있는지 지정합니다.

기본 액세스 가능성은 private입니다.

상속

클래스(구조체는 아님)는 상속 개념을 지원합니다. 다른 클래스(‘기본 클래스’라고 함)에서 파생되는 클래스는 생성자와 종료자를 제외하고 기본 클래스의 모든 public, protected, internal 멤버를 자동으로 포함합니다.

클래스를 abstract로 선언할 수도 있습니다. 즉, 하나 이상의 해당 메서드에 구현이 없는 상태를 의미합니다. 추상 클래스는 직접 인스턴스화할 수 없지만 누락된 구현을 제공하는 다른 클래스에 대한 기본 클래스로 사용될 수 있습니다. 다른 클래스가 이 클래스에서 상속 받지 못하게 하려면 클래스를 sealed로 선언할 수도 있습니다.

자세한 내용은 상속다형성을 참조하세요.

인터페이스

클래스, 구조체, 레코드는 여러 인터페이스를 구현할 수 있습니다. 인터페이스에서 구현하는 것은 형식이 해당 인터페이스에 정의된 모든 메서드를 구현한다는 의미입니다. 자세한 내용은 인터페이스를 참조하세요.

제네릭 형식

클래스, 구조체 및 레코드는 하나 이상의 형식 매개 변수로 정의할 수 있습니다. 클라이언트 코드는 형식의 인스턴스를 만들 때 형식을 제공합니다. 예를 들어 System.Collections.Generic 네임스페이스의 List<T> 클래스는 하나의 형식 매개 변수로 정의됩니다. 클라이언트 코드는 List<string> 또는 List<int>의 인스턴스를 만들어 목록에 포함될 형식을 지정합니다. 자세한 내용은 제네릭을 참조하세요.

정적 형식

클래스(구조체나 레코드는 아님)를 static(으)로 선언할 수 있습니다. static 클래스는 static 멤버만 포함할 수 있고 new 키워드로 인스턴스화할 수 없습니다. 프로그램이 로드될 때 클래스의 단일 복사본만 메모리에 로드되고 해당 멤버는 클래스 이름을 통해 액세스됩니다. 클래스, 구조체 및 레코드에는 static 멤버가 포함될 수 있습니다. 자세한 내용은 정적 클래스 및 정적 클래스 멤버를 참조하세요.

중첩 형식

클래스, 구조체 또는 레코드는 다른 클래스, 구조체 또는 레코드 내에 중첩될 수 있습니다. 자세한 내용은 중첩 형식을 참조하세요.

부분 형식(Partial Type)

하나의 코드 파일 및 별도 코드 파일의 다른 부분에서 클래스, 구조체 또는 메서드의 부분을 정의할 수 있습니다. 자세한 내용은 참조 Partial 클래스 및 메서드합니다.

개체 이니셜라이저

해당 속성에 값을 할당하여 클래스 또는 구조체 개체와 개체 컬렉션을 인스턴스화하고 초기화할 수 있습니다. 자세한 내용은 개체 이니셜라이저를 사용하여 개체를 초기화하는 방법을 참조하세요.

익명 형식

명명된 클래스를 만드는 것이 불편하거나 필요하지 않은 상황에서는 무명 형식을 사용합니다. 무명 형식은 명명된 데이터 멤버로 정의됩니다. 자세한 내용은 무명 형식을 참조하세요.

확장명 메서드

별도의 형식을 만들어 파생 클래스를 만들지 않고도 클래스를 “확장”할 수 있습니다. 해당 형식에는 원래 형식에 속한 것처럼 호출할 수 있는 메서드가 포함됩니다. 자세한 내용은 확장 메서드를 참조하세요.

암시적 형식 지역 변수

클래스 또는 구조체 메서드 내에서 암시적 형식 지정을 사용하여 컴파일러가 컴파일 시간에 변수의 형식을 결정하도록 할 수 있습니다. 자세한 내용은 var(C# 참조)을 참조하세요.

레코드

클래스 또는 구조체에 record 한정자를 추가할 수 있습니다. 레코드는 값 기반 같음을 위한 기본 제공 동작이 있는 형식입니다. 레코드(record class 또는 record struct)는 다음과 같은 기능을 제공합니다.

  • 변경할 수 없는 속성을 사용하여 참조 형식을 만드는 간결한 구문
  • 값 같음 레코드 종류의 두 변수는 레코드 종류가 동일한 경우와 모든 필드에 대해 두 레코드의 값이 같은 경우에 같습니다. 클래스는 참조 같음을 사용합니다. 한 클래스 형식의 두 변수가 같은 개체를 참조하면 두 변수가 동일합니다.
  • 비파괴적 변형을 위한 간결한 구문 with 식을 사용하면 기존 인스턴스의 복사본이지만 지정된 속성 값이 변경된 새 레코드 인스턴스를 만들 수 있습니다.
  • 표시를 위한 기본 제공 형식 ToString 메서드는 레코드 형식 이름과 퍼블릭 속성의 이름 및 값을 출력합니다.
  • 레코드 클래스의 상속 계층 구조에 대한 지원. 레코드 클래스는 상속을 지원합니다. 레코드 구조체는 상속을 지원하지 않습니다.

자세한 내용은 레코드를 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.