C# 인터페이스 마스터하기: 정의, 구현, 실전 활용 사례
C# 인터페이스 완벽 가이드
C# 인터페이스의 기초부터 생성 및 구현 방법, 실제 프로젝트에서 빛을 발하는 활용 시나리오까지 상세히 안내합니다.
C# 인터페이스란 무엇인가?
C#에서 인터페이스는 구현을 제공하지 않으면서 메서드, 프로퍼티, 이벤트, 인덱서의 집합을 정의하는 계약(Contract)입니다. 추상 클래스와 달리 인터페이스의 모든 멤버는 암시적으로 abstract이며 public입니다. 이러한 특성 덕분에 인터페이스는 서로 관련 없는 여러 클래스가 공유할 수 있는 기능(Capability)을 정의하는 데 이상적입니다.
- 명명 규칙: 인터페이스 이름은 관례적으로 'I' 접두사를 붙입니다(예:
IPolygon).
- 접근 한정자: 인터페이스 내부에서 멤버에 접근 한정자를 지정할 수 없습니다. 항상 public입니다.
- 필드 선언 불가: 인터페이스에는 필드를 선언할 수 없습니다.
interface IPolygon { void CalculateArea(); }
인터페이스 구현하기
인터페이스를 사용하려면 클래스가 해당 인터페이스를 구현하여 모든 멤버에 대한 구체적인 정의를 제공해야 합니다. 상속과 마찬가지로 콜론(:) 구문을 사용합니다.
using System;
namespace CsharpInterface {
interface IPolygon {
void CalculateArea(int length, int breadth);
}
class Rectangle : IPolygon {
public void CalculateArea(int length, int breadth) {
int area = length * breadth;
Console.WriteLine($"Rectangle Area: {area}");
}
}
class Program {
static void Main(string[] args) {
Rectangle rect = new Rectangle();
rect.CalculateArea(100, 200);
}
}
}
실행 결과
Rectangle Area: 20000
여러 인터페이스 동시 구현
C#에서는 한 클래스가 여러 인터페이스를 동시에 구현할 수 있어, 타입의 다중 상속을 가능하게 합니다.
using System;
namespace CsharpInterface {
interface IPolygon {
void CalculateArea(int a, int b);
}
interface IColor {
void GetColor();
}
class Rectangle : IPolygon, IColor {
public void CalculateArea(int a, int b) {
int area = a * b;
Console.WriteLine($"Rectangle Area: {area}");
}
public void GetColor() {
Console.WriteLine("Red Rectangle");
}
}
class Program {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.CalculateArea(100, 200);
r.GetColor();
}
}
}
실행 결과
Rectangle Area: 20000 Red Rectangle
인터페이스 참조 변수 활용
인터페이스는 직접 인스턴스화할 수 없지만, 인터페이스 타입의 변수를 선언하고 이를 구현 클래스의 인스턴스로 할당할 수 있습니다. 이는 다형성(Polymorphism)을 구현하는 강력한 도구입니다.
using System;
namespace CsharpInterface {
interface IPolygon {
void CalculateArea(int length, int breadth);
}
class Rectangle : IPolygon {
public void CalculateArea(int length, int breadth) {
int area = length * breadth;
Console.WriteLine($"Rectangle Area: {area}");
}
}
class Program {
static void Main(string[] args) {
IPolygon poly = new Rectangle();
poly.CalculateArea(100, 200);
}
}
}
실행 결과
Rectangle Area: 20000
실전 예제: 다형성을 활용한 도형 면적 계산
IPolygon 인터페이스를 정의하고 이를 구현하는 두 개의 구체적인 도형 클래스를 만듭니다. 각 도형은 독립적으로 면적을 계산합니다.
using System;
namespace CsharpInterface {
interface IPolygon {
void CalculateArea();
}
class Rectangle : IPolygon {
public void CalculateArea() {
int length = 30;
int breadth = 90;
int area = length * breadth;
Console.WriteLine($"Rectangle Area: {area}");
}
}
class Square : IPolygon {
public void CalculateArea() {
int side = 30;
int area = side * side;
Console.WriteLine($"Square Area: {area}");
}
}
class Program {
static void Main(string[] args) {
Rectangle rect = new Rectangle();
rect.CalculateArea();
Square sq = new Square();
sq.CalculateArea();
}
}
}
실행 결과
Rectangle Area: 2700 Square Area: 900
왜 C# 인터페이스를 사용해야 할까요?
- 추상화(Abstraction): 구현을 강제하지 않고 계약만 정의하므로, 개발자는 클래스가 무엇을 해야 하는지에 집중할 수 있습니다.
- 명세(Specification): 인터페이스를 구현하는 모든 클래스는 선언된 메서드를 제공해야 하므로, 코드베이스 전반에 걸쳐 일관성을 보장합니다.
- 다중 상속(Multiple Inheritance): C#은 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 여러 기능을 조합할 수 있습니다.
- 느슨한 결합(Loose Coupling): 구체 클래스가 아닌 인터페이스에 의존하는 코드는 더 유연하며, 유지보수와 테스트가 용이합니다.