Search Results for 'C# 3.0'

1 POSTS

  1. 2007.11.21 비함수형 언어에서 lambda 2

비함수형 언어에서 lambda

Posted 2007. 11. 21. 01:39
뒷북일 수 있지만 실무에서 C#으로 프로그래밍을 하지는 않는 관계로 오늘에서야 C# 3.0에서는 뭐가 바뀌었는지 잠깐 살펴보았습니다. LINQ처럼 DB 연동이 주라고 생각하고 있었는데, 의외로 타입 추론(type inference)나 람다 표현식(lambda expression) 같이 함수형 언어의 영향을 많이 받은 부분들도 보이더군요.

특히 3.0에 추가된 람다(lambda)는 2.0에 추가된 후에 상반된 반응을 얻었던 익명 대리자(anonymous delegate)을 보강한다는 측면에서 추가되었다고 합니다. 쉽게 말해서 네 자 이상의 이름을 걸러내는 필터를 만들기 위해 C# 2.0에서는 다음과 같이 코드를 작성합니다.

Func<string,bool> filter = delegate(string name) {
return name.Length > 4;
};


반면에 lambda를 사용한 C# 3.0의 코드는 다음과 같습니다.

Func<string, bool> filter = x => x.Length > 4;


x => x.Length > 4라는 부분이 바로 람다 표현식인데, x라는 인자를 하나 받아서 x.Length >4 를 리턴한다는 의미입니다. 위 예제만 보고 처음에는 식 밖에 못 오는 줄 알았는데 { } 사이에 집어 넣으면 구문도 사용할 수 있더군요.

C#의 lambda는 단순히 익명 대리자의 문법을 바꾼 것만은 아닌 듯 합니다. x => x.Length 와  같이 x의 타입을 명시해주지 않아도 타입 추론을 통해 찾아주는 부분은 기존 익명 대리자에 비해서는 발전하였네요.


여담이지만 파이썬 사용 시에 제일 불만이었던 것이 lambda입니다. 파이썬의 lambda는 함수형 언어도 아닌 주제에 말 그대로 람다 식(lambda expression)이어서 하나의 식만 사용할 있습니다.

사실 일반적인 함수형 언어야 프로그램 전체가 하나의 식으로 되어 있고 이를 연산(evaluation)하면서 프로그램을 수행하기 때문에 lambda expression은 무척 자연스러운 방식입니다. 반면에 프로그램 수행이 명백히 문장 중심인 파이썬이 정작 lambda에서는 표현식 하나만 쓸 수 있는 것이 항상 불만이었습니다. 조금만 복잡해져도 할 수 있는 일이 없으니 lambda를 익명 함수(anonymous function)로는 사용하지 못하는 경우가 많았거든요.

파이썬 3000에서도 이 부분에 대한 개선은 없다고 하는데, 파이썬은 쓰면 쓸수록 뭔가 아쉬운 느낌이 드는 언어입니다.