이전글
인터페이스 - 커넥터의 의미
인터페이스는 커넥터다.
마치 USB포트 처럼. 두 클래스를 이어줌
예를 들어 사용자로부터 온도를 반복적으로 입력받아 기록하는 ClimateMonitor메소드를 만드는데,
로그를 저장하는 방식 등은 ClimateMonitor 클래스를 사용하는 다른 프로그래머들의 입맞에 따라 결정할 수 있어야 한다면?
이럴 때 인터페이스는 훌륭한 해결책이 됨
ClimateMonitor클래스는 ILogger형식의 참조 logger를 이용하여 사용자로부터 입력받은 온도를 기록한다
예제는 이전장과 이어짐.
class ClimateMonitor
{
pirvate ILogger logger; //아직 null인 ILogger형식의 참조
//생성자의 매개변수에서 logger가 가르킬 객체를 받아서
//그 객체의 기능을 이 클래스에서 사용할 수 있는. 즉 상속의 기능과 동일하게 해주는
//'포함'이라는 기법
pulbic CimiateMonitor(ILogger logger)
{
this.logger = logger;
}
public void start()
{
while(true)
{
Console.Write("온도를 입력하세요 : ");
string temperature = Console.ReadLine();
if(temperature = "")
break;
logger.WriteLog("현재 온도 : " + temperature);
//ConsoleLogger클래스를 포함기법으로 상속받았으니 ConsoleLogger의 메소드 WriteLog()호출
}
}
}
그리고 다음과 같이 ConsoleLogger 객체를 생성자에 인수로 넘기면 ClimateMonitor는 콘솔에 메세지를 출력하게 됨(WriteLog())
=> ClimateMonitor의 ILooger logger = new ConsoleLogger()가 됨
ClimateMonitor monitor = new ClimateMonitor(new ConsoleLogger());
monitor.start();
ConsoleLogger클래스처럼 콘솔에 메세지를 출력하는게 아니라 파일에 로그를 출력하는 ILogger의 파생클래스
FileLogger를 만들어보자
class FileLogger : ILogger
{
private StreamWriter writer; //StreamWrite클래스 이용함 일단 무시
public FileLogger(string path)
{
writer = File.CreateText(path);
writer.AutoFlash = true;
}
public void WriteLoge(string message)
{
writer.WriteLine("{0} {1}", DateTime.Now.ToShortTimeString(), message);
}
}
그리고 FileLogger객체를 다음과 같이 ClimateMonitor생성자에 넘기면 이제 monitor객체는 파일에 로그를 저장하는 (FileLogger클래스의 기능)을 갖게 됨
ClimateMonitor monitor의 ILogger logger = new FileLogger("MyLog.txt");가 됨
ClimateMonitor monitor = new ClimateMonitor(new FileLogger("MyLog.txt"));
monitor.start();
ClimateMonitor는 FileLogger를 언급하지 않았다
FileLogger또한 ClimateMonitor를 언급하지 않았다
하지만 포함기법으로 필드에 private ILogger logger;를 해주었고
ILogger를 상속받는 FileLogger와 ConsoleLogger는
자동으로 부모인터페이스 형식으로 간주된다.
(클래스에서 파생클래스는 기반클래스와 똑같은 형식으로 간주된다는 개념이
인터페이스와 그것을 상속받는 파생클래스에도 똑같이 적용)
그렇기 때문에
매개변수로 ILogger형식을 받는다는 ClimateMonitor의 생성자가
FileLogger와 ConsoleLogger의 생성자가 매개변수로 들어갈 수 있는 것이다
=> 인터페이스를 상속받는 클래스들은 FileLogger뿐 아니라 이런식으로 다 ClimateMonitor와 소통가능
그래서
ClimateMonitor, FileLogger둘다 누가 자신을 사용하는걸 간주하고 코딩을 짜는게 아니라
마치 다른 장치처럼 본연의 임무에만 충실할 수 있고
이들을 인터페이스가 상속을 이용해서 연결해줄 수 있는 것이다.
즉 인터페이스는 커넥터다