소프트웨어 이야기

Reflect on .NET 그러니까, 우리나라 SW 기술자에게 어떻게 희망을 갖도록 하나?!

이현봉 2011. 4. 15. 13:34
한달 전만해도 .NET이 대체 어찌 생긴 녀석인지 잘 몰랐다. 그런데 관심을 갖아야 할 이유가 생겼다.  이럴 줄 몰랐다.  또 이렇게 모를 일이 생길 것이 얼마나 많을지.

다행스럽게 .NET환경이 자바와 거의 닮았다.  MSDN에 가니 자료가 넘친다.  2주 전 Visual Studio 2010을 깔다가 황당했다.  7기가 바이트가 넘다니.  OMG.  이래 저래 C 드라이브에 공간을 마련하고 설치시작...  그리고 몇 시간이 걸렸다.  

10년도 더 지난 전에 학생들 가르칠때 VS6.0 과는 천양지차.  그동안 많이 발전했다.  Eclipse보다 단순하고 직관적이다. Eclipse 쓰던 사람은 쉽게 적응하겠다.  한가지 아쉬운 것이 VS 2010 이 한글판이라 금방 눈에 들어오지 않는다.  라이브러리 보는 것은 인터넷 영어판으로 연결해 보고 있다. 

무엇으로 공부할까 하다 Andrew Troelsen 이 쓴 Pro .C# 2010 and .NET 4 platform으로 정했다.  잘 썼다.  가끔씩 유머스러운 내용도 있고.  .NET이 어떻게 돌아가는 지에 대해서도 잘 설명했다.  이 책과 C# for Java Developers 의 도움을 받아 쉽게 C#에 적응할 수 있었다.  JAVA와 거의 같으면서, 자바보다 더 다양한 기능/syntax를 제공한다.  어떤 것은 자바에서 꼭 있었으면 하던 것을 제공해 주어서 좋다.  그렇지만 Pointer는 없애도 좋았을 것이다.  JAVA의 event handling 방법보다 C#의 방법이 더 나은 방법인것 같다. 좀 혼동이 되는 것은 event와 delegate간의 관계이다. 
Type이 event라고 생각해 오브젝트를 찍어보면 delegate 종류로 나온다.  event야 delegate야?  대체 너희 둘은 무슨 관계냐?

public
delegate void MyEventHandler();  // MyEventHandler 라는 패러미터가 없고 return이 void인 형태의 delegate를 선언 

class
TestEvent
{
   
// Declare the event of type MyEventHandler. Event handlers
     
       // for TriggerIt must have the same signature as MyEventHandler.

      public event MyEventHandler TriggerIt;   // C#에서 event는 해당 클래스의 public member variable이다.  즉, event를
// 발생시키는 (publish) 클래스는 event 오브젝트를 갖고있는 (has a) 형태이다
     
TriggerIt은 이벤트인데, 이 녀석은 MyEventHandler라는 delegate와 딱 붙어 움직인다.  따라서, event를 선언할 때 그 event와 짝을 이루는 어떤 signature를 갖는 delegate(즉, 그 delegate가 가르치는 event handler의 signature)를 함께 선언함으로써 그 event가 어떤 signature를 갖는 event handler method들을 받아드리는가 (등록을 가능하게)하는 것을 함께 선언하고 있다.  Visual Studio는 TriggerIt을 찍으면 이것이 MyEventHandler 타입이라 알려준다.  이말은 TriggerIt이 event인데, 이것에 MyEventHandler 형태 ( 즉, void return, no parameters) 의 event handler를 등록시킬 수 있다는 것을 말해주는 것이다.

TriggerIt += new MyEventHandler(event_handler_method) 형태로 TriggerIt에 event_handler_method를 등록한다.  즉,  MyEventHandler 형태의 delegate를 생성해서 그 녀석이 event_handler_method 를 가르키라는 것이고, 이런 reference를 TriggerIt에 등록하라는 것이다.   event_handler_method는 Java와 다르게 특정 interface를 구현하는 메소드명일 필요가 없다.   TriggerIt 이벤트를 발생시키려면 단순히  TriggerIt() 하면 된다.  마치 TriggerIt 의 constructor를 부르는 것과 같이. 

     1.  MyEventHandler ---> event_handler_method   // two have the same signature
     2.  MyEventHandler is registered to TriggerIt        // by += operator
     3.  When TriggerIt is fired by TriggerIt(), TriggerIt event is published to its subscribers and event handlers in them get
         to be executed. 

MS가 제공하는 Smart Client Software Factory 2010을 써서 DeskTop app을 만들어 보려 한다.  첫인상은, 아니 그래봐아 PC 어플인데 무슨 이렇게 까지 해야 하나?  C# 와 Visual Studio 만 갖고도 좋더구만.  그런데 몇일째 보다 보니 SCSF 2010 그게 아니다.  이거 정말 OO 개발방법과 디자인패턴을 녹여내 만든 시도이다.  모든 SW 개발/architect의 꿈인 종속성 없애기, Dependency Injection, 메시지로 주고 받기, runtime에 필요한 것 composite해 플러그인 같이 끼워 놓을 수 있기, 모듈들이 asynchronous하게 동작하기와 같은 사상이 담겨져 있다.  그런데 Inversion of Control 을 많이 사용해 지나치게 정형화되어 있어 외울 것도 많고 복잡하다.  익혀도 쓸모가 있을까?   

여기서 말하는 Command, Event Broker 같은 말이 패턴에서 말하는 그런 말이란 것이지...  감동이 몰아친다.  SW 개발은 이렇게 해야 한다.  그래도 역시 복잡하다.  익숙해지려면 좀 시간이 필요할 것 같다.  80년대 말 인공지능인가 Symbol Processing 과목이었던가 blackboard 패턴/구조를 만들어 비슷한 기능을 했던 기억이 난다.  모듈들끼리 직접 call 하지 않고 blackboard를 메시지의 publish/subscribe 매개체로 삼아 종속성을 줄이고.  Android 개발환경이 이런 패턴을 포함하더니 이제는 일반화되는 것인가?   

대한민국의 SW 생태계는 어디로 가고 있나?  SW엔지니어는 무슨 희망을 갖고 사는지?  내가 후배들에게 SCSF와 같은 개발 방법을 익히는게 좋을 것 같다고 자신있게 말할 수 있을까?  

Let it go.