인터페이스는 관련된 기능을 하나로 묶어 정의하는 멤버들을 담은 타입이에요. 인터페이스는 클래스를 사용하는 쪽과 구현을 분리해서, 여러 가지 서로 다른 구현을 가능하게 하거나 서식, 비교, 변환 같은 일반적인 동작을 지원할 수 있게 해줘요.
인터페이스의 문법은 클래스나 구조체와 비슷하지만, 메서드와 속성이 시그니처로만 나타나고 본문은 제공되지 않아요.
public interface ILanguage
{
string LanguageName { get; set; }
string Speak();
}
public class ItalianTaveller : ILanguage, ICloneable
{
public string LanguageName { get; set; } = "Italiano";
public string Speak()
{
return "Ciao mondo";
}
public object Clone()
{
ItalianTaveller it = new ItalianTaveller();
it.LanguageName = this.LanguageName;
return it;
}
}
인터페이스에 정의된 모든 연산은 반드시 구현해야 해요.
인터페이스는 다른 멤버들뿐만 아니라 인스턴스 메서드와 속성도 포함할 수 있어요.
객체를 다른 객체와 비교할 수 있게 하려면 IComparable<T> 인터페이스를 구현해야 해요.
이 인터페이스에는 구현해야 하는 메서드가 하나 있어요: int CompareTo(T other).
CompareTo 메서드가 반환할 수 있는 값은 세 가지예요.
이 연습 문제에서는 무선 조종 자동차를 가지고 좀 더 많은 작업을 해봐요.
실험용 자동차가 개발되었고, 테스트 트랙은 양산형과 실험용 모델을 모두 다룰 수 있도록 수정해야 해요. 두 종류의 자동차는 이미 만들어졌으니, 테스트 트랙에서 둘 다 처리할 방법을 찾아야 해요.
게다가 양산형 자동차가 성과를 내기 시작했어요. 팀장은 양산형 자동차의 순위를 공개해서 경쟁 분위기를 이어가고 싶어 해요.
IRemoteControlCar 인터페이스에 메서드를 추가해서 두 종류의 자동차에 대한 Drive() 구현을 노출해 주세요.
TestTrack.Race(new ProductionRemoteControlCar());
TestTrack.Race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
IRemoteControlCar 인터페이스에 속성을 추가해서 두 종류의 자동차에 대한 DistanceTravelled 속성의 구현을 노출해 주세요.
var prod = new ProductionRemoteControlCar();
TestTrack.Race(prod);
var exp = new ExperimentalRemoteControlCar();
TestTrack.Race(exp);
prod.DistanceTravelled
// => 10
exp.DistanceTravelled
// => 20
ProductionRemoteControlCar 클래스에서 IComparable<T> 인터페이스를 구현해 주세요. 자동차의 기본 정렬 순서는 승리 수의 오름차순이어야 해요.
전달받은 자동차를 승리 수의 오름차순으로 정렬해서 반환하도록 정적 메서드 TestTrack.GetRankedCars()를 구현해 주세요.
var prc1 = new ProductionRemoteControlCar();
var prc2 = new ProductionRemoteControlCar();
prc1.NumberOfVictories = 3;
prc2.NumberOfVictories = 2;
var rankings = TestTrack.GetRankedCars(prc1, prc2);
// => rankings[1] == prc1
Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.