Unity3d C# toolba 사용해보기

C# Interface란 무엇인가?

C# Interface란 무엇인가?

어떤사람들은 객체지향 프로그래밍의 꽂은 인터페이스라고하고   중수에서 고수로 넘어가려면 이것을 잘 다뤄야 된다고 이야기를 한다죠.. 저는 뭐 아직 클래스가 뭔지도 제대로 파익이 안되어서 먼 미래의 이야기같네요 하지만 모르고 넘어갈 수는 없기 때문에  C#에서 말하는 인터페이스를 알아 보고자합니다

interface [이름]
{
    메소드..
    이벤트..
    인텍서..
    프로퍼티..
}

이렇게 나와있습니다.   또한 객체를 생성할 수 없다고 합니다;;  그럼 어디다 어떻게 쓰라는 건지..

이것은 인터 페이스를 참조하는 파생클래스를 만들어서 만들어진 클래스로부터 객체를 생성해서 사용은 가능합니다.  뭐.. 상속해서 사용해야하기때문에 이것안에 는 public 으로 선언해줘야 겠죠.. 이런것은 납득이 갑니다.

이거 사용 할려고 클래스를 만들어서 사용 해야 한다니 정말 번거롭네요.. 이게 대체 뭐라고..

interface { .. }     →  new 객체생성 (x)


intefrace Inf_nm {...}  →  class Cls_nm:  Inf_nm { … } →  Cls_nm inf = new Cls_nm( ...)    (O)


Inf_nm inf_nm = new Cls_nm() (O)    ← 지난 시간에 봤었던 것 같네요.. 기반클래스와 파생클래스의 관계처럼..  클래스가 인터 페이스로 상속을 받았으니  이런 식으로 형변환도 가능 하다라는…. 전 아직도 잘 모르겠네요 ㅠㅠ 객체 지향은 어렵습니다.


설명하기를 이것으.... 컴퓨터에 있는 usb 포트와 같다 라고 합니다.  약속이라고 합니다.

usb포트에 선풍기를 꽂으면 선풍기가 돌면서 바람이 나오고.. 메모리를 꽂으면 플래쉬메모리 저장장치로 사용할 수 있으며.. 스마트폰과 컴퓨터를 연결할 수 있고 충전도 할 수 있고..   이런 것들이 모두 가능한 이유는 usb라는 약속을 따랐기 때문인데요 이것을 인터 페이스와 같다고 설명하고 있습니다.

이것을 사용하려면.. 파생클래스를 선언해서 참조하는식으로 객체(인스턴스)를 만들어 사용한다고하는데  중간에 만들어지는 클래스에 각기 다른 기능의 메소드를 구현하여 마치 usb 포트처럼 다른 성격으로 사용할 수 있다고.. 이야기합니다. 그래도 그렇지 저는 잘 모르겠습니다. 과연 저렇게 하면..그게 편한 걸까요?
책에 나와있는 예제를 통해서 한번 이해를 해보도록 하겠습니다. 당체 무슨 이야기인지 햇갈리기만 하네요.
코딩하고 프로그램돌려보고 하니깐 조금.. 그것도 아주조금 의미는 살짝 와 닿는것 같지만 쉽지 않습니다.


C# Interface


위에 소스는 책에나와있는 예제코드를 약간 변형해서.. 퀴즈의 내용에 답하는 코드인데요.. 이번에도 역시 결과는 있지만 정답은 없습니다ㅜㅜ

가독성이 좀 떨어지는데 차근차근 알아가 봐야겠습니다. 제가 이해한내용이니 제가 틀릴수도있죠..

인터페이스라는 것을 선언 하는것은 이렇습니다.

ILoger라는 이름의 interface를 선언했습니다. 근데 안에 내용은 전혀 없네요
선언만 있을 뿐이지 안에 내용이 없는데 USB포트와 같다는 말이 실감이 나네요..  이것 안에 메소드를 어떤 클래스에 상속해서 어떤 형식으로 메소드의 내용을 채울지..? 그것에 따라 하는 역할이 바뀌는 것입니다.

   interface ILogger
   {
       void WriteLog(string message);
   }

그래서 이름도 이렇게 지은 것이 아닌가 하는 생각이 드네요..

Inteface 바로 아래와 아래 아래에 클래스를  만듬과 동시에 상속 받았네요
상속의 관계를 표현할때.. 기원클래스와 파생클래스의 개념처럼  

클래스이름 : 상속하는인터 페이스이름

이런 식의 문법으로 표현했습니다.

그러면서..  Interface 안에 구현해놓았던..  WriteLog(string message) 메소드를 선언하였네요..


C# interface2


ConsoleLogger클래스에는 현재시간과 입력받은 string 타입의 문자열을 콘솔창에찍어주는 일을하는것을 구현했습니다.

그리고 아래에 나와있는 FileLogger클래스는..  using System.IO; 을 해서..  StreamWriter형식을 이용하여 파일을 생성하는것을 구현한 것인데요.. 이건 나중에 배워야할 내용이긴 한데.. 아무튼 이 클래스에서는.. 파일을 생성하는것을 구현하고자 했습니다.

그런데 보시면..
오버로딩 되어있습니다. 클래스와 같은 이름으로해서 string type의 매개변수를 받는 것을 만들어 놨습니다.
지난시간에 배웠던 내용이죠.. 아무튼 정리를 하면서 책을 보니.. 더디긴 하지만 복습도 되고 좋네요

어떤 파일이름으로 저장을 할 것 인지를 구현하기 위해 추가한 것이죠
public FileLogger(string path)
       {
           writer = File.CreateText(path);
           writer.AutoFlush = true;
       }


바로 위에 나와있는 ConsoleLogger클래스에는 예제에는 나와있지는 않았지만.. 한번 똑같이 오버로딩을 구현해봤습니다. 흐린색으로 표시된 거 보이시죠?

책으로 독학으로 공부하려 다보니 물어볼 곳도 마땅치 않고.. 제가 궁금증을 스스로 해결해야 하는데 바로 이런 것들이죠..  실제 이것을 이용해서 접근하는 방법이 문제이긴 한데..  어떤식으로 접근 하는지를 확인도 할겸.. 테스트도하고 이런 것 이라고 생각해주세요..

소스가 꼬여있어서 복잡한데요..
저한테는 꼬부랑글씨 해석 하는 것 보다 좀 더 어렵네요 ㅜㅜ  처음이라 그렇겠죠? 생소해서..

그리고.. 아래는 인터페이스를 참조하지 않은 클래스를 만들었는데.. 여기도 오버로드가 되어있죠.. 이 타입의 매개변수를 받게 말이죠..

상속을 받지는 않았지만..  클래스내부에서 사용할 필드를 선언해서 사용해도 상관이 없나봅니다.

그리고 아래에는 온도를 콘솔창에서 입력받을 수 있는 기능을 하는 메소드를 하나 만들었습니다.

C# interface3



이렇게 구현을 하고  메인메소드에서..  바로위에 만들었었던 ClimateMonitor 타입의 객체에 인터 페이스를 상속받았던 ConsoleLogger(+매개변수) 타입의 객체를 전달해줬네요..

머리아픕니다 이게 무슨소린지;;;

ClimateMonitor클래스를 만들때 오버로딩하면서..인터페이스형태의 매개변수를 받을 수 있게 만들었잖아요?
그래서.. 문법적으로는  문제가 없어 보이는데..

   class MainApp
   {
       static void Main(string[] args)
       {
           ClimateMonitor monitor = new ClimateMonitor( new ConsoleLogger );
                          //new FileLogger("MyLog.txt"));
           monitor.strat();


       }
   }

ConsoleLogger와 FileLogger를 보니까 하나는 매개변수가없고 하나는 있습니다! 네.. 그렇죠.. 클래스생성시 오버로딩을 이용한거죠… 아무튼 이런식 으로 구현을 하였더니..
while문을 돌면서..  
logger.WriteLog("현재 온도: " + temperature);

logger.WriteLog로.. 받은 결과 값을..   ConsoleLogger로  monitor 생성자에게 값을 넘기면..

현재 시간과 입력한 값을 콘솔창에 뿌려주게 되고..

C# interface4

FileLogger("MyLog.txt") 로 값을 넘겨 주게 되면..
MyLog.txt 의 텍스트파일 안에 현재 시간과 입력한 값을 저장하게 됩니다.


C# interface5


정말 별 것 아닌 걸 이것을 이용하여 만들려고 보니 복잡합니다. 몇 번은 더 봐야겠습니다.

제 나름대로의 정리를 하여 내린 결론은  interface란 형식만 있고 결과가 파생 클래스에따라 달라진다! 입니다!   usb 포트가 정답이네요^^;

상황에 따라 다르겠지만.. 다른 케이스에서는 효율적일 수 도 있겠죠.. 지금은 객체 지향도 제대로 파악 못해서 나중에 실력이 늘면 다시 드려다 봐야겠습니다. ^^;  이상으로   C# Interface를 알아봤습니다.감사합니다.







댓글