C#에서 추상 클래스(abstract class)는 인스턴스를 만들 수 없는 클래스입니다. 추상 클래스는 하나 이상의 추상 멤버(abstract member)를 포함하고 있으며, 이 추상 멤버는 구현이 없는 멤버입니다.
*인스턴스란?
인스턴스(Instance)란, 클래스를 기반으로 생성된 객체(Object)를 의미합니다. 클래스는 일종의 설계도이며, 실제로 사용하기 위해서는 이 클래스를 기반으로 객체를 생성해야 합니다. 이때 생성된 객체가 인스턴스입니다.
인스턴스를 생성하는 과정을 객체화(Objectification)라고도 부릅니다. 이 과정에서는 new 키워드를 사용하여 클래스의 생성자(Constructor)를 호출하여 객체를 생성합니다. 예를 들어, 다음과 같은 클래스가 있다고 가정해보겠습니다.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
위 클래스는 이름과 나이를 나타내는 속성(Property)을 가지고 있습니다. 이 클래스를 기반으로 객체를 생성하려면 다음과 같이 new 연산자를 사용하여 생성자를 호출해야 합니다
Person person = new Person();
위 코드에서는 Person 클래스의 생성자를 호출하여 person이라는 객체를 생성합니다. 이렇게 생성된 객체는 클래스의 속성(Property)과 메서드(Method)를 사용할 수 있는 인스턴스가 됩니다.
추상 클래스는 일반적으로 상속을 위해 설계됩니다. 추상 클래스를 상속하는 클래스는 추상 클래스의 추상 멤버를 모두 구현해야 합니다. 따라서 추상 클래스를 사용하면 클래스의 일관성을 유지하면서 다양한 구현을 만들 수 있습니다.
추상 클래스는 일종의 '틀'이며, 이를 상속한 클래스에서 구체적인 기능을 구현합니다.
하나 이상의 추상 멤버를 포함합니다. 추상 멤버는 선언만 하고 구현은 하지 않는 멤버입니다. 추상 멤버는 추상 클래스를 상속한 클래스에서 반드시 구현해야 합니다. 추상 클래스를 상속한 클래스는 추상 멤버를 모두 구현해야 합니다. 이를 통해 추상 클래스는 하위 클래스에서 일관된 동작을 유지할 수 있습니다.
아파트(Apartment)를 나타내는 추상 클래스로 예를 들어보겠습니다. 아파트 클래스는 다양한 종류의 아파트를 구현하기 위한 추상 멤버를 가질 수 있습니다. 예를 들어, 아파트 클래스에는 다음과 같은 추상 멤버가 있을 수 있습니다.
abstract class Apartment
{
public abstract int NumberOfRooms { get; }
public abstract int SquareFootage { get; }
public abstract void RentOut();
}
이 추상 클래스를 상속하는 클래스는 NumberOfRooms, SquareFootage, RentOut 멤버를 반드시 구현해야 합니다. 예를 들어, 고급 아파트(LuxuryApartment) 클래스는 다음과 같이 구현될 수 있습니다.
class LuxuryApartment : Apartment
{
public override int NumberOfRooms
{
get { return 3; }
}
public override int SquareFootage
{
get { return 2000; }
}
public override void RentOut()
{
Console.WriteLine("Luxury apartment rented out!");
}
}
이렇게 구현된 LuxuryApartment 클래스는 추상 클래스인 Apartment 클래스를 상속하면서, 필요한 멤버를 구현함으로써 고급 아파트를 나타내는 클래스로 만들어집니다. 이와 같이 추상 클래스를 사용하면 일관성 있는 클래스를 만들면서도 유연한 구현이 가능합니다.
인터페이스는 클래스나 구조체(struct)가 특정한 메서드, 속성, 이벤트 등을 반드시 구현하도록 강제하는 일종의 계약(contract)으로 볼 수 있습니다. 즉, 인터페이스는 클래스나 구조체의 동작 방식을 규정하는 템플릿(template) 역할을 합니다. 인터페이스는 다음과 같은 특징을 가지고 있습니다.
- 인터페이스는 클래스나 구조체의 행위를 규정하는 계약(contract)으로 볼 수 있습니다.
- 인터페이스는 추상 멤버(abstract member)만을 가질 수 있으며, 구현(implementation)은 제공할 수 없습니다.
- 클래스나 구조체가 인터페이스를 구현할 때는, 인터페이스에서 정의된 모든 멤버를 반드시 구현해야 합니다.
- 인터페이스는 다중 상속(multiple inheritance)이 가능합니다. 즉, 하나의 클래스나 구조체가 여러 개의 인터페이스를 구현할 수 있습니다. 인터페이스는 다음과 같은 방법으로 정의할 수 있습니다.
인터페이스는 다음과 같은 방법으로 정의할 수 있습니다.
interface IMyInterface
{
// 추상 메서드
void MyMethod();
// 추상 속성
int MyProperty { get; set; }
// 추상 이벤트
event EventHandler MyEvent;
}
위 예제에서는 IMyInterface라는 인터페이스를 정의하고, MyMethod()라는 추상 메서드, MyProperty라는 추상 속성, MyEvent라는 추상 이벤트를 정의하였습니다.
클래스나 구조체에서는 인터페이스를 다음과 같은 방법으로 구현할 수 있습니다.
class MyClass : IMyInterface
{
public void MyMethod()
{
// MyMethod()의 구현
}
public int MyProperty { get; set; }
public event EventHandler MyEvent;
}
위 예제에서는 MyClass라는 클래스가 IMyInterface 인터페이스를 구현하고 있습니다. MyClass 클래스는 MyMethod(), MyProperty, MyEvent를 모두 구현하였습니다.
인터페이스를 사용하면 코드의 유연성과 확장성을 높일 수 있습니다. 인터페이스를 사용하여, 클래스나 구조체 간에 일관성 있는 메서드, 속성, 이벤트 등을 정의하고, 이를 구현함으로써 각 객체 간의 연결성과 상호작용을 강화할 수 있습니다.
추상 클래스는 인터페이스와 유사한 기능을 제공하지만, 다음과 같은 차이점이 있습니다.
1. 추상 클래스는 구현을 포함할 수 있습니다. 추상 멤버 외에도 구현된 멤버를 포함할 수 있습니다.
<ㅡㅡ> 인터페이스는 추상 멤버만 포함할 수 있습니다.
2. 추상 클래스는 클래스이므로, 클래스의 다른 기능(생성자, 속성, 메서드 등)을 제공할 수 있습니다.
<ㅡㅡ> 인터페이스는 인터페이스에 정의된 멤버만을 가질 수 있습니다.
3. 추상 클래스는 다양한 상황에서 사용될 수 있습니다. 예를 들어, 추상 클래스는 클래스의 일관성을 유지하면서 다양한 하위 클래스를 만들 수 있는 경우에 유용합니다. 또한, 추상 클래스는 인터페이스보다 조금 더 유연한 클래스 설계를 위해 사용될 수 있습니다.
따라서, 인터페이스는 구현을 강제하기 위한 목적으로 사용되고, 추상 클래스는 추상적인 개념을 표현하기 위해 사용됩니다. 추상 클래스는 구체적인 구현을 가지고 있어서 일부 공통된 코드를 재사용할 수 있는 반면, 인터페이스는 다중 상속을 지원하고 클래스에 추가적인 기능을 제공하기 위해 사용됩니다
'Languages > C#' 카테고리의 다른 글
C# WPF Ellipse (0) | 2023.04.10 |
---|---|
Day 9: MVVM 디자인 패턴 소개 및 구현 (0) | 2023.04.10 |
C# Indexer (0) | 2023.04.07 |
Day 8: WPF 커스텀 컨트롤 만들기 (0) | 2023.04.07 |
Day 7: 자원 관리 - 리소스, 스타일, 템플릿 (0) | 2023.04.06 |