객체 지향 프로그래밍을 할 때 'virtual', 'abstract', 'interface'는 알고있어야 하는 개념입니다. 각각의 키워드는 클래스와 메서드의 동작 방식을 제어하고, 코드의 유연성과 재사용성을 높이는데 사용됩니다. 이 글에서는 세 가지 키워드의 차이점과 특징을 서술해보겠습니다.
설명
Virtual
- 정의: 'virtual' 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언에 사용되어, 파생 클래스에서 이를 재정의할 수 있게 합니다.
- 특징:
- 기본 구현을 제공할 수 있습니다.
- 파생 클래스에서 'override' 키워드를 사용하여 재정의할 수 있습니다.
- 선택적으로 재정의할 수 있습니다.
- 기본 클래스에서 공통 동작을 정의하고, 파생 클래스에서 필요에 따라 동작을 변경할 때 사용합니다.
- 코드 예시:
public class Payment
{
public virtual void ProcessPayment()
{
Console.WriteLine("Payment");
}
}
public class CreditCardPayment : Payment
{
public override void ProcessPayment()
{
Console.WriteLine("CreditCardPayment");
}
}
Abstract
- 정의: 'abstract' 키워드는 클래스 또는 멤버 선언에 사용되며, 반드시 파생 클래스에서 구현되어야 합니다.
- 특징:
- 추상 클래스는 인스턴스화할 수 없습니다.
- 추상 메서드는 구현을 제공하지 않습니다.
- 추상 메서드는 파생 클래스에서 반드시 재정의해야 합니다.
- 공통된 인터페이스를 정의하되, 구체적인 구현은 파생 클래스에 맡기고자 할 때 사용합니다.
- 코드 예시:
public abstract class Shape
{
public abstract double GetArea();
public void DisplayArea()
{
Console.WriteLine("Area: " + GetArea());
}
}
public class Circle : Shape
{
private double _radius;
public Circle(double radius)
{
_radius = radius;
}
public override double GetArea()
{
return Math.PI * _radius * _radius;
}
}
Interface
- 정의: 'interface'는 클래스 또는 구조체에서 구현해야 하는 메서드, 속성, 이벤트 및 인덱서의 정의를 포함합니다.
- 특징:
- 구현을 제공하지 않습니다.
- 다중 상속을 지원합니다.
- 모든 멤버는 기본적으로 'public' 입니다.
- 클래스 간의 계약을 정의하고, 다중 상속을 통해 다양한 클래스에서 동일한 동작을 구현하고자 할 때 사용합니다.
- 코드 예시:
public interface IDrivable
{
void Drive();
}
public interface IFlyable
{
void Fly();
}
public class FlyingCar : IDrivable, IFlyable
{
public void Drive()
{
Console.WriteLine("Driving on the road");
}
public void Fly()
{
Console.WriteLine("Flying in the sky");
}
}
정리
Virtual: 기본 동작을 제공하면서, 필요시 파생 클래스에서 이를 재정의할 수 있도록 합니다.
Abstract: 공통된 행동 방식을 정의하지만, 구체적인 구현은 파생 클래스에 맡깁니다.
Interface: 구현을 강제하는 계약을 정의하며, 다중 상속을 통해 다양한 클래스에서 동일한 동작을 구현할 수 있습니다.
지금까지 'virtual', 'abstract', 'interface' 에 대해 알아보았습니다.
현재 글의 내용 중 틀린 부분이나, 지적하실 내용이 있으시다면 언제든지 알려주세요! 읽어주셔서 감사합니다.
'CS 공부' 카테고리의 다른 글
[C#] 메모리 구조 (0) | 2024.07.22 |
---|---|
[C#] 가비지 컬렉터 (Garbage Collector, GC) (0) | 2024.07.15 |
[C#] 박싱과 언박싱 (Boxing & Unboxing) (0) | 2024.07.02 |
[C#] 해시셋 (HashSet) (0) | 2024.06.28 |
[C#] 링크드 리스트 (Linked List) (0) | 2024.06.23 |