[C# 4.0] Duck Typing

C# 2009. 4. 6. 23:46 Posted by 알 수 없는 사용자
Dynamic 언어인 루비를 공부해 보신 분은 다음과 같은 구문을 많이 보셨을 겁니다.


X 라는 변수에 "hello" 라는 문자를 대입하고, 변수 X의 타입은 String입니다.


그리고 다시 X변수에 100을 넣으면, X변수의 타입은 Fixnum(Ruby에서 Integer를 표현하는 타입입니다)으로 변합니다.

여기에서도 알수 있듯이 동적인 언어에서는 Type이 동적으로 변합니다. 그래서 이런 속성을 이용해서 duck typing 이란 것을 구현할 수 있는데요. Dynamic language 를 주제로 검색엔진을 통해 검색해보면 항상 빠지지 않고 등장 하더군요.

그런데 왜 이름이 Duck Typing일 까요?

Ruby에서 Dynamic Typing에 관한 자료를 찾는 도중에, Duck typing을 좀 더 잘 이해할 수 있는 예제를 C# 4.0으로 구현해 보게 되었습니다.

참고 소스 : http://rubylearning.com/satishtalim/duck_typing.html


우선 Duck(오리) 클래스를 만들었고, 오리는 꽥꽥거리기도 하고(quack() 메소드), 수영도 하지요(swim())
오리만 있나요, 거위(Goose)도 있습니다. 마지막으로 오리의 꽥꽥거리는 소리를 내는 DuckRecoding이란 클래스도 만들었지요.

이제 꽥꽥거리게 만들어 보자구요.



2개의 static 메소드를 만들었습니다. parameter로 dynamic type의 duck이란 변수를 주고, 꽥꽥(quark()) 거리거나 수영(swim())하게 만들었습니다. 지금 duck변수는 오리인지, 거위인지, 아님 제 3의 조류인지 알 길이 없습니다. 

어떤 녀석들인지 확인해 보기로 하죠.


콘솔 출력을 이용해서. 첫번째 줄은, 진짜 오리로 하여금 꽥~~~~, 두번째 줄은 목소리를 녹음한 녹음기(DuckRecording)로 꽥~~~~~~, 세번째 줄은 오리 수영 시키기, 네번째 줄은 거위 수영시키기입니다.

이제 결과값을 보겟습니다.



첫번째 줄의 오리는 꽥~~ 거렷습니다. 두번째 줄은 무응답.... 세번째 줄은 오리가 수영을 하고 있군요. 네번째는 오리가 아닌 거위 수영입니다.  2번째 줄에서 예상되는 값은 꽥~~ 이었는데요, 나오지 않은 이유는 리턴 타입이 잘못 되어 있네요(죄송합니다. T.T).
아까 이렇게 선언했었지요.
 class DuckRecording
    {
        public void quack() { this.play(); }
        public string play() { return "Quark!"; }
    }


결론

위키디피아에서 Duck typing에 관해 다음과 같이 간단하게 적어 놓았네요.
If it walks like a duck and quacks like a duck, I would call it a duck.
오리처럼 행동하면 오리라 부를수 있다는 의미. String 처럼 행동한다면, String으로 다루어도 된다는 이야기. 결국 오브젝트의 부모나, 인터페이스의 영향보다, 그 오브젝트가 가진 메소드나 속성에 의해 그 오브젝트의  역활이 결정된다는 표현이 아닐까 하는게 제 생각입니다.

참고 사항 :  IronRuby에서 Fixnum 타입의 값이 to_f (Float type으로 변환)이 되지 않았습니다. 이유는 잘 모르겠네요. "methods"로 전체 메소드를 보면 to_f가 없는 것 같습니다. 

제가 알고 있는 Dynamic 언어인, Object C의 경우 Dynamic Object가 메소드를 호출 할 떄  런타임 하에서 그 오브젝트에 속한 메소드를 찾지 못하는 경우 런타임에서 경고로 넘어갑니다만, C# 4.0 에서는 Runtime Error 와 함께 VSTS 2010 이 죽고, Virtual PC가 얼어버리네요. 이 점은 정식 버젼이 나오면 다시 확인해 보고 싶습니다.

comment 를 확인하다 보니, 제가 쓴 글에 잘못된 내용이 있는 것 같네요. 그래서 글을 좀 수정했고요, 좋은 의견과 배움에 감사드립니다.  


[C# 4.0] Named and Optional Parameters

C# 2009. 4. 6. 15:34 Posted by 알 수 없는 사용자

Flex로 ActionScript 프로그래밍을 하다 보면 아래와 같은 메소드 선언을 많이 볼수 있습니다.
 
public function hitTestPointer(x:Number, y:Number, shapFlag:Boolean = false): Boolean
 
 Parameter 값에 Default 값을 넣어 사용하는 것은 ActionScript로 작업하고 있는 저로는 익숙한 표현이었지만, 가끔 다른 언어를 사용하다 보면 이런 표현이 있었으면 좋겠다고 생각했는데, 마침 C# 4.0에서 이런 문법을 사용할 수 있게 되었습니다. 위 코드 처럼 Boolean 타입인 shapFlag 의 값에 false 값을 넣어주는 것을 Optional Parameter 라고 하고, Default Parameter라고 부르기도 하더군요.
(지금 코드는 C#입니다)

 
public class Test
{
   public bool  hitTestPointer(float x, float y, bool shapeFlag = false)
   {
      .....................
   }
}
 
 
 그런데, Actionscript 와 차이점이 있다면, Parameter의 위치를 사용자가 원하는 대로 바꿀 수 있다는 점입니다. 예를 들어 Actionscript의 경우 Optional parameter 의 선언은 일반 parameter 뒤 이거나, 아니면, 전부 Optional parameter 로 선언해야 합니다. 

예들 들어
Actionscript )
hitTestPointer( 10, 10)  ------------>  OK
hitTestPointer( 10, false, 10) ---------> Error
hitTestPointer( 10, false) ------------> Error
하지만, C# 4.0 에서는 Named parameter 로 이 문제를 해결할 수 있습니다.
C# 4.0 )
hitTestPointer( 10, 10)  ------------>  OK
hitTestPointer( x: 10, shapFlag: false, y: 10) ---------> OK
hitTestPointer( x: 10, shapFlag: false) ------------> Error (y는 Optional Parameter 가 아님)
두번째 포스팅 하는 건데, (첫번째 포스팅은 내용에 맞지 않아 삭제함) 공부하다 제가 느낀 점만 간단히 적다보니 제대로 내용이 전달 되는 건 지 모르겟습니다. 관심 분야는 RIA 인데, C# 4.0 공부를 않 할 수가 없더라고요. 제 공부방향은 C# 4.0 의 내용을 파악한 뒤에 RIA 쪽으로 넘어가는 겁니다. 그런데, 아직 3.5 도 제대로 잘 모른다는...   어여튼 열심히 ^^

Welcome to F#(1) - 첫만남.

F# 2009. 4. 5. 20:58 Posted by 알 수 없는 사용자

What is F#?
F#에 대해서 들어본 적이 있으신가요? 아니면, Functional programming language 혹은 함수형 언어라고는 들어본적이 있으신가요? 아마도 최근에 부각되었었던 Erlang이나 기존의 Lisp, Scheme등을 들어보셨거나, 공부해보신 분이라면 알고계시리라 생각합니다. F#은 닷넷에서 돌아가는 함수형언어이고 현재 CTP(Community Technical Preview)버전이 공개된 상태입니다. 차후에 VSTS 2010에 포함되어서 나올 예정이구요. 


함수형 언어는 왜 배워야 하는데?
C#이나 Java와 같이 입력을 받아서 어떻게 그걸 처리할지 주저리주저리 이야기 해줘야 하는 언어는 명령형 언어(Imperative programming language)라고 합니다. 하지만, 그와 반대로 어떻게 할건지 보다는 무엇을 처리할지에 더 관심을 두는 형태를 선언형 언어(Declarative programming language)라고 합니다. 정규식이나 함수형언어 같은 언어가 포함되지요. 예를 들어보면 정규식같은 경우는 어떤 패턴을 잡을지에 관심이 집중되어 있습니다. 하지만, 어떻게에 대해서는 관심이 없지요. 즉, 명령형 언어와 선언형 언어는 서로 관점이 틀리기 때문에 서로 유용하게 쓸 수 있는 분야도 틀릴 수 있다는 것입니다.

물론, Anders Hejlsberg가 JAOO의 강연에서 이야기 한것처럼 함수형언어와 기존의 명령형언어(Imperative programming language)는 서로 다른 장점이 있기 때문에, 어떤 상황에서 어떤 언어를 선택하는 것이 옳은지 명확하게 이야기 할 수 는 없습니다. 하지만, 함수형언어는 나중에 더 자세히 다룰 수 있겠지만 Immutable, 즉 한번 값을 입력하면 다시는 값이 변경될 수 없는(C#에서 readonly를 생각하면 되겠죠.)걸 이야기 하는데, 이때문에 병렬적으로 실행되는 환경에서 흔히 문제가 되는 여러 스레드가 하나의 값에 접근할때 값이 잘못변경될 위험이 없습니다. 그래서 병렬 프로그래밍에서 가장 유용한 프로그래밍 모델로 생각되고 있으며 실제로 얼마전에 Erlang이 이슈가 되었던 것도 그런이유 때문이었던 것 같습니다.

근데 왜 F#을 공부해야 하는데?
개인적으로는 점차 플랫폼의 영향력이 커진다는 느낌을 받습니다. 그리고 기존의 플랫폼에 워낙 많은 기능이 이미 구현되어 있고, 그런 언어의 실행환경에 대해서는 신경을 쓰지 않고, 자신의 언어가 가질 특징들에 집중해서 새로운 언어를 만드는 것도 점차 중요해지는 것 같구요. 꽤나 히트했던 Ruby가 JRuby와 IronRuby로 자바와 닷넷에 각각 편입되는 것을 보더라도 그런 것 같습니다. 단순히 플랫폼의 덕만 보는게 아니라, 그 플랫폼에서 사용되는 다른 언어들과도 교차적으로 사용될 수 있다는 점도 꽤나 큰 이익이 아닌가 생각합니다. 이 주제에 대해서 잘 설명을 해주신 장성진님의 글을 읽어보시면 더 좋을 것 같습니다.

F#을 배워야 하는 이유는 하나의 어플리케이션을 개발할때, C#을 메인언어로 놓고 개발하면서 F#으로 개발했을때 이익이 되는 부분이라면, F#으로 개발해서 조합을 할 수 있겠죠. 저 역시도 그런 가능성을 가장 기대하고 있습니다.

앞으로의 방향은 어떻게 되니?
개인적으로 기존에 Scheme을 공부해본적이 있긴하지만, 워낙 잠깐이라 딱히 많이 아는건 없습니다. 그래서 공부해가면서 고민해가면서 여기에 적어볼 생각입니다. 그래서 내용이 엄밀하지 못하거나 심도가 없을 수도 있는데, 그런부분은 피드백으로 잘 훈계해주시면 완전 감사하겠습니다.

F#을 설치해보자
시작이 반이라고 했으니, F#을 설치하면서 빨리 반을 끝내보도록 하죠. F#은 현재 CTP버전이 나와있고, 비주얼 스튜디오 2008에서도 사용할 수 있습니다. 그리고 비주얼 스튜디오가 없더라도 명령행툴이 있기 때문에, 거기서 작업을 하면서 공부하실 수 있습니다. 물론 비주얼 스튜디오가 있음 더 편하겠죠. 일단 여기에서 F# CTP버전을 받을 수 있습니다. msi파일을 받아서 실행하시면 되구요, zip파일은 윈도우가 아닌 운영체제에서 압축을 풀어서 readme를 보라고 하는데, 별로 보고싶지 않아서 확인은 안 해봤습니다.(역시 글로쓰면 농담이 안살아나는 군요-_-)

F#과 만나서 Hello를 외쳐보자
Hello를 외치려면 일단 만나야 겠죠. 그럼, F# Interative를 실행해보죠. 그러면 아래와 같은 창이 하나 뜹니다.


궁금한게 있으면 #help;;를 쳐보라는 친절한 말까지 남겨주시죠. 여기서 우리는 F# Interative에게 뭔가 부탁하려면 '# + 부탁할내용 + ;;'을 해야 한다는 사실을 알 수 있죠. 참고로 F# Interactive에서 나가게 해달라고 부탁하는 말은 "#quit;;"입니다. 그러면, 언제나 처음 언어를 접하면 서로 인사를 나누어야 하니 Hello World를 한번 외쳐보도록 하죠.



위와 같이 한번 쳐보시죠. let HelloWorld~~;;는 선언부이고, 그 아래는 함수호출 결과입니다. 언어가 다르다 보니 모양도 좀 틀립니다. 우선 F# Interative에서는 하나의 의미를 갖는 문장이 끝난다는걸 ';;'을 통해 알립니다. 그래서 위문장은 ';;'를 만날때 까지 하나의 단위로 인식해서 함수를 선언해주는 것이고, 아래 문장은 호출이라는 것을 파악하는 것이죠. 그러면 이제 나가게 해달라고 부탁하시고 비주얼 스튜디오에서도 Hello World를 외쳐보도록 하겠습니다.


새프로젝트를 눌러보시면 윗 그림과 같이 Visual F#이 추가된걸 보실 수 있습니다. 그럼 프로젝트를 생성해서 아래그림 처럼 코드를 쳐보시죠.



그리고 정말 친숙한 명령 Ctrl+F5를 누르면, 정말 친숙한 콘솔창에 아래 그림과 같이 결과가 나옵니다.(너무 친숙해서 마치 집에 있는거 같군요. 이래서 집나가면 개고생이라나 봅니다.)



그리고 비주얼스튜디오에서 F# Interative창을 띄워서 평가하고 싶을때는 아래 그림과 같이 "보기 -> 다른 창 -> F# Interactive"를 눌러줍니다.



그러면, 아래 그림과 같이 하단부에 F# Interactive가 뜨게됩니다.



그리고 이제 비주얼 스튜디오에서 작업한 내용을 F# Interactive에서 확인해볼 수 있습니다. F#같은 함수형 언어에서는 모든 코드가 컴파일되는 것이 아니고 한줄 한줄 평가(Evaluation, 혹은 그냥 Eval)하게 되는데요, 작업 부분중에 평가 해보고 싶은 부분만 드래그해서 F# Interative에서 결과를 확인해볼 수 있습니다. 평가하는 방법은 우선 평가하고 싶은 부분을 정확하게 드래그 해서 마우스 오른쪽 버튼을 누르고 "Send to F# Interative"를 누르거나 "Alt + Enter"를 누르시면 됩니다. 아래 그림은 함수선언부를 먼저 F# Interactive로 보내서 평가하고 그 다음에 함수호출부분을 다시 평가해서 얻은 결과물입니다.



이제는 우리가 헤어져야 할시간, 다음에 다시 만나요
자 이제, F#과의 첫 인사를 마쳤습니다. 어떠셨나요? 제가 실력이 부족하고 글솜씨가 딸려서 좀 설명이 부족한 부분이나, 틀린 부분이 있을 수도 있습니다. 그럴땐 따뜻한 피드백으로 화답해주셨으면 좋겠습니다.(차가운 피드백은 반사하겠습니다-_-) 저 역시 아직 함수형언어 자체에 대한 이해도 부족하고, F#도 잘 아는 상태가 아니라서 인지 앞으로 어떻게 계속 글을 이어나가야 겠다는 명확한 생각은 없는 상태고 그저 글을 계속 쓰면서 정해나갈 생각입니다. 다음번 포스트에서는 간단한 예제를 통해 F#에 대해서 좀 더 자세한 설명을 드리고 명령형언어와 함수형언어의 차이에 대해서 좀 더 알기 쉽게 설명해볼까 하는 생각을 갖고 있습니다.(말이 길어지면, 둘중 하나만 하고요-_-) 이 글이 도움이 되는 분들이 있길 바라고, 다음 포스트로 뵙겠습니다.

참고자료
1. Expert F#, Don Syme, Adam Granicz, Antonio Cisternino, APRESS.
2. http://blog.java2game.com/229
3. http://jaoo.blip.tv/file/1317881/
4. http://en.wikipedia.org/wiki/Functional_programming
5. http://en.wikipedia.org/wiki/Imperative_programming
6. http://en.wikipedia.org/wiki/Declarative_programming