클래스(C# 프로그래밍 가이드)
업데이트: 2008년 7월
클래스는 다른 형식의 변수, 메서드 및 이벤트를 그룹화하여 사용자 지정 형식을 만들 수 있는 구문입니다. 클래스는 청사진과 같습니다. 클래스는 형식의 데이터 및 동작을 정의합니다. 클래스가 static으로 선언되지 않은 경우 클라이언트 코드에서는 변수에 할당되는 개체 또는 인스턴스를 만들어 클래스를 사용할 수 있습니다. 변수는 해당 변수에 대한 모든 참조가 범위를 벗어날 때까지 메모리에 유지됩니다. 모든 참조가 범위를 벗어나면 CLR에서 해당 변수를 가비지 수집 대상으로 표시합니다. 클래스가 static으로 선언되면 하나의 복사본만 메모리에 존재하며 클라이언트 코드에서는 인스턴스 변수를 통해서가 아니라 클래스 자체를 통해서만 클래스에 액세스할 수 있습니다. 자세한 내용은 정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.
구조체와 달리 클래스는 개체 지향 프로그래밍의 근본 특징인 상속을 지원합니다. 자세한 내용은 상속(C# 프로그래밍 가이드)을 참조하십시오.
클래스 선언
다음 예제와 같이 클래스는 class 키워드를 사용하여 선언합니다.
public class Customer
{
//Fields, properties, methods and events go here...
}
class 키워드는 액세스 수준 뒤에 사용합니다. 이 경우에는 public을 사용했기 때문에 모든 사용자가 이 클래스에서 개체를 만들 수 있습니다. 클래스의 이름은 class 키워드 뒤에 사용합니다. 정의의 나머지 부분인 클래스 본문에서는 동작과 데이터를 정의합니다. 클래스의 필드, 속성, 메서드 및 이벤트를 통칭하여 클래스 멤버라고 합니다.
개체 만들기
클래스와 개체는 서로 바꿔 사용되기도 하지만 근본적으로 이 둘은 서로 다릅니다. 클래스는 개체의 형식을 정의할 뿐 개체 자체는 아닙니다. 개체는 클래스를 기반으로 하는 구체적인 엔터티이며 클래스의 인스턴스라고도 합니다.
개체는 다음과 같이 new 키워드 뒤에 개체의 기반으로 사용할 클래스의 이름을 추가하여 만들 수 있습니다.
Customer object1 = new Customer();
클래스의 인스턴스가 만들어지면 개체에 대한 참조가 프로그래머에게 다시 전달됩니다. 위의 예제에서 object1은 Customer를 기반으로 하는 개체에 대한 참조입니다. 이 참조는 새 개체를 가리키지만 개체 데이터 자체를 포함하지는 않습니다. 사실 개체를 전혀 만들지 않고도 개체 참조를 만들 수 있습니다.
Customer object2;
이와 같이 개체를 참조하지 않는 개체 참조는 만들지 않는 것이 좋습니다. 이러한 참조를 통해 개체에 액세스하려고 하면 런타임에 오류가 발생하기 때문입니다. 그러나 다음과 같이 새 개체를 만들거나 이러한 참조를 기존 개체에 할당하여 참조가 개체를 가리키도록 할 수 있습니다.
Customer object3 = new Customer();
Customer object4 = object3;
이 코드에서는 모두 동일한 개체를 가리키는 두 개의 개체 참조를 만듭니다. 따라서 object3을 통해 개체에 대해 변경한 내용은 모두 이후에 object4를 사용할 때 반영됩니다. 클래스를 기반으로 하는 개체는 참조를 통해 참조되기 때문에 클래스를 참조 형식이라고 합니다.
클래스 상속
상속은 파생을 통해 이루어집니다. 즉, 클래스는 데이터와 동작을 상속할 기본 클래스를 사용하여 선언합니다. 기본 클래스는 다음과 같이 파생 클래스 이름 뒤에 콜론과 기본 클래스의 이름을 추가하여 지정합니다.
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
클래스에서 기본 클래스를 선언하면 생성자를 제외한 기본 클래스의 모든 멤버가 상속됩니다.
C++와 달리 C#의 클래스는 하나의 기본 클래스만 직접 상속할 수 있습니다. 그러나 기본 클래스 자체도 다른 클래스를 상속할 수 있기 때문에 클래스는 여러 개의 기본 클래스를 간접적으로 상속할 수 있습니다. 또한 클래스는 인터페이스를 두 개 이상 직접 구현할 수 있습니다. 자세한 내용은 인터페이스(C# 프로그래밍 가이드)를 참조하십시오.
클래스를 abstract로 선언할 수 있습니다. 추상 클래스는 시그니처 정의가 있지만 구현은 없는 추상 메서드를 포함합니다. 추상 클래스는 인스턴스화할 수 없습니다. 추상 클래스는 추상 메서드를 구현하는 파생 클래스를 통해서만 사용할 수 있습니다. 이와 반대로 sealed 클래스는 다른 클래스에서 상속할 수 없습니다. 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.
클래스 정의는 여러 소스 파일로 분할할 수 있습니다. 자세한 내용은 Partial 클래스 및 메서드(C# 프로그래밍 가이드)를 참조하십시오.
설명
다음 예제에서는 단일 필드, 메서드 및 생성자라는 특별한 메서드가 포함된 공용 클래스를 정의합니다. 자세한 내용은 생성자(C# 프로그래밍 가이드)를 참조하십시오. 그런 다음 new 키워드를 사용하여 클래스를 인스턴스화합니다.
예제
public class Person
{
// Field
public string name;
// Constructor
public Person()
{
name = "unknown";
}
// Method
public void SetName(string newName)
{
name = newName;
}
}
class TestPerson
{
static void Main()
{
Person person = new Person();
Console.WriteLine(person.name);
person.SetName("John Smith");
Console.WriteLine(person.name);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
unknown
John Smith
*/
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 단원을 참조하십시오.
1.6 클래스 및 개체
10 클래스
참고 항목
개념
참조
변경 기록
날짜 |
변경 내용 |
이유 |
---|---|---|
2008년 7월 |
base 액세스에 대한 잘못된 설명이 제거되었습니다. |