C# 9. 인터페이스로 클래스 구조 정의하기
March 2, 2022, 11:37 p.m.
앞선 포스팅에서 클래스와 클래스의 상속에 대해서 알아보았습니다. 이번 포스팅에서는 인터페이스에 대해서 알아보겠습니다.
1. 인터페이스란?
인터페이스란 어떤 클래스의 필수 요소를 정의해 주는 것입니다. 즉, 어떤 클래스가 인터페이스를 상속받으면 해당 인터페이스가 지정하는 필드와 메서드를 모두 구현해야 합니다. 그러지 않으면 컴파일 에러가 나죠.
인터페이스는 interface 키워드를 사용하여 선언합니다. 아래의 예시를 보겠습니다.
interface IPredator
{
int HungryLevel { get; set; }
int Health { get; set; }
bool LookforFood();
void ReturnHome();
}
인터페이스에는 데이터를 저장할 수 없어요. 그리고 메서드도 이름과 반환 유형만 지정할 수 없습니다. 인터페이스라는 것이 애초에 상속받을 클래스에 필수로 들어갈 요소들을 정의해 주는것이기 때문에 그렇습니다.
또한 중요한 것이 인터페이스의 이름은 대문자 I로 시작해야 합니다. 관례상 그렇습니다. I로 시작하는 인터페이스들은 Visual Studio같은 에디터에서 쉽게 인식되어 사용하기 편하답니다.
2. 인터페이스 사용
아래와 같이 인터페이스를 상속 할 수 있습니다.
class Wolf : IPredator
{
private int hungrylevel;
private int health;
public int HungryLevel
{
get { return hungrylevel; }
set { hungrylevel = value; }
}
public int Health
{
get { return health; }
set { health = value; }
}
public bool LookforFood() {
// 음식 찾기
}
public void ReturnHome() {
// 집으로 돌아가기!
}
public void Eat() {
// 음식 먹기
}
}
Wolf 클래스는 Ipredator 인터페이스를 상속받았습니다. 그렇기 때문에 인터페이스가 지정해주는 모든 필드와 메서드를 구현했네요. 필드들은 get, set을 이용해 캡슐화를 하였습니다. 이것 또한 인터페이스에서 다 지정해 준것이죠!
3. 인터페이스 활용
인터페이스는 다양하게 활용할 수 있습니다. 인터페이스는 클래스처럼 객체를 만들 수는 없지만 자료형, 매개변수로 쓰일 수 있습니다. 매개변수나 자료형로 인터페이스를 사용하면 해당 객체는 인터페이스에서 지정한 메서드와 필드만 접근이 가능해집니다. 또한 해당 인터페이스를 상속하지 않는 객체는 지정할 수 없겠죠? 위에서 선언한 Wolf 클래스를 참고하여 인터페이스를 자료형으로 사용한 예시를 보겠습니다.
IPredator pred = new IPredator(); // 인터페이스는 객체를 만들 수 없으므로 컴파일 오류!
IPredator pred = new Wolf(); // Wolf 는 IPredator 인터페이스를 상속.
pred.LookforFood();
pred.Eat() // Wolf 객체에는 Eat()이라는 메서드가 있지만 IPredator가 지정하는 메서드가 아니므로 실행할 수 없어요.
아래 처럼 매개변수로도 사용할 수 있습니다.
public void EscapeFrom(IPredator predator)
{
// 해당 포식자로부터 도망치기!
}
4. is 연산자
인터페이스는 is 연산자를 통해 어떤 객체가 해당 인터페이스를 구현하는지 여부를 확인할 수 있습니다. 아래의 예시를 바로 보시죠!
IPredator predator;
Wolf wolf = new Wolf();
if (wolf is IPredator) {
predator = wolf;
}
is 연산자를 통해 wolf 객체가 IPredator 인터페이스를 구현하는지 여부를 확인하고 predator에 대입해 주었습니다.
이렇듯 is 연산자는 대입 전에 해당 인터페이스를 구현하는지 먼저 확인하여 컴파일 에러를 방지하는데 사용할 수 있답니다.
5. as 연산자
마지막으로 as 연산자에 대해서 알아보겠습니다. as는 해당 객체를 어떠한 자료형으로 간주하겠다고 말해주는 연산자 입니다. 예시를 보면서 마무리하겠습니다.
IPredator predator;
Wolf wolf = new Wolf();
predator = wolf; // IPredator로 사용
Wolf wolfee;
if (predator is Wolf) //prdator는 Wolf 객체였었으므로 true
{
wolfee = predator as Wolf; // IPredator를 Wolf로 간주
}