나날이 Mono 프레임워크가 좋아지고 있습니다. 이번에 새로 나온 Mono 1.2.3 역시 상당 부분 개선이 이뤄졌습니다. Microsoft Stack (Windows Forms, ASP .NET, Visual Basic 8.0과 같은 부분)에 대한 지속적인 개선이 돋보입니다. 이번에 새로 추가되었거나 향상된 MS Stack에 대한 구현은 대강 아래와 같습니다.

- WinForm 2.0의 TableLayout 컨트롤 구현
- WinForm 2.0의 ~Strip 시리즈 컨트롤 구현
- WinForm 1.1의 SendKeys 메서드 구현
- WinForm 2.0의 ListViewGroups 및 AutoCompletion 구현
- 더블 버퍼링 기능 개선
- 이벤트 처리 기능 개선
- Visual Basic 8.0 Compiler 데뷔 (프리뷰)
- Mainsoft사의 ASP .NET에 관한 다양한 패치/스타터 킷 마이그레이션
- <tagMapping> 구현
- ASP .NET 2.0의 Session State Model 구현
- ProfileCommon 사용자 정의 프로필 클래스 지원
- App_Local/GlobalResources 폴더에 대한 완벽한 지원
- App_Code, App_LocalResources, App_GlobalResources의 변경 사항을 감지하고 이것의 반영을 위하여 자동으로 ASP .NET 응용프로그램을 재시작하는 기능 추가
- 리눅스에서 사용 가능한 System.Media 네임스페이스 구현 추가
- XML 웹 서비스의 SOAP 1.2 프로토콜 지원
- XML 웹 서비스를 위한 XmlSerializer 기능 개선
- MkBundle의 Machine.Config 파일에 대한 기능 개선
- HttpListener의 HTTPS 프로토콜 지원
- .NET 2.0의 Socket API 구현
- System.Drawing.SystemIcons 구현
- ColorMatrix의 알파값을 올바르게 다룰 수 있으며 40% 정도 더 빠름
- 알파 채널을 포함하는 PNG 이미지를 제대로 표시할 수 있음
- 투명 배경색을 지원하는 새로운 아이콘 이미지 디코더 추가
- 15/16bpp 비트맵 이미지를 전용 비트맵 이미지 디코더에 의해 처리함
- .NET 2.0 API에 관한 Monodoc이 추가됨
- PE 파일과 확장 데이터에 관한 서명을 생성할 수 있게됨
- SSL/TLS의 캐쉬 문제를 해결함
- XML 서명 및 암호화 문제를 해결함
- DSA 인증을 위한 상속된 키 매개변수를 지원함
- PKCS#12 파일 안의 DSA 인증을 지원함
- X.509 CRL에 대한 향상된 지원 기능 추가
- Microsoft.Build에 대응되는 xbuild 추가 (Visual Studio 2005 프로젝트 파일을 직접 사용할 수 있음)
- Sqlite ADO .NET Provider의 ADO .NET 2.0 지원 추가
- 제네릭 기반 리모팅을 사용할 수 있음
- 다차원 배열 접근에 대한 기능 향상을 위하여 JIT를 수정함
- JIT에 의한 상수 초기화 및 블럭 초기화가 지원됨
- SafeHandle에 대한 지원을 추가함
- Mono 헤더 파일에 버전의 구별을 추가하여 Mono 런타임의 버전 별로 구동할 수 있는 기반을 조성함
- 배열 객체의 초기화를 최적화하여 이전보다 30% 이상 최고 100%까지 성능 향상을 이끌어내었고 다차원 배열에의 접근 기능을 최적화하여 3차원 배열에의 접근의 경우 이전보다 4배 빠름
- 더 적은 메모리 사용률을 보임
- Alpha, MIPS, ARM용 포팅이 업데이트됨
- SPARC 포팅의 경우 이전보다 3배 빠르게 동작함
- 콘솔에서의 오버헤드를 최소화하기 위하여 빠른 초기화에서 늦은 초기화로 구현을 바꿈 (.NET 2.0의 특이한 콘솔 API에 대한 지원을 위하여 바뀐 부분)

또한 MS의 IronPython 프로젝트를 기초로하여 기존의 CPython과의 호환성을 구축한 IPCE는 매력적입니다. IPCE는 IronPython이 기존의 CPython과 연동하여 동작하는 부분에 있어서 문제가 된 점을 패치하였으며 동시에 표준 Python 라이브러리를 첨부한 것입니다. 이 IPCE를 이번 Mono 1.2.3 릴리즈 안에 공식적으로 처음 포함했다고 합니다.

* 릴리즈 노트로 이동하기: http://www.go-mono.com/archive/1.2.3/
Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

파이썬은 기본적으로 문자열, 리스트, 튜플, 사전을 언어 차원에서 지원할 수 있는 스크립트 언어입니다. 오늘 알아볼 유형은 문자열과 리스트입니다. 나중에는 큐와 스택의 경우 리스트 안에 이를 Emulation (흉내내기)할 수 있는 함수를 호출하는 것으로 작업이 가능함을 확인하고 좀 더 자세히 다루어보기로 하겠습니다.

참고로 파이썬은 STL이나 .NET에서처럼 Stack과 Queue라는 것이 명확하게 존재하는 것이 아니므로 주의할 점이 있겠지요. 즉, 리스트를 사용하고 있지만 리스트가 아닌 스택이나 큐로서의 역할을 하고 있음을 명확히 알려줄만한 어떤 힌트가 포함되어야 한다는 뜻입니다. 쉬운 예로 변수 이름의 정의부터 달리한다거나 주석을 달거나 하는 등의 일이 있을 것입니다.

다시 본론으로 돌아가서, 파이썬이 기본적으로 제공하는 네 가지 유형의 데이터 구조를 분석해 보도록 하겠습니다.

* 문자열 (String)

파이썬의 문자열은 우리가 아는 문자열과 90% 같습니다. 나머지 10%가 무엇일까요? 파이썬에서의 문자열은 우리가 C/C++/Java/C#에서처럼 문자열의 특정 인덱스에 있는 글자를 치환하는 것을 지원하지 않습니다. C 계열 언어를 사용하다가 제일 어렵게 느껴지게 되는 부분이 바로 이 부분일 것입니다. 또한,  파이썬 코드에서의 문자열 표기는 작은 따옴표가 문자 하나를 나타내고, 큰 따옴표가 문자열을 나타내는 것이 아닙니다. 양쪽 표기 방식 모두 문자열을 의미합니다.

* 리스트 (List)

앞에서 예를 들었던 문자열과는 달리 리스트는 원소 단위의 편집이 가능하며 서두에서 설명하였던 그대로 큐와 스택을 에뮬레이션할 수 있는 관련 함수도 제공한다고 하였습니다.

리스트를 만들기 위해서는 다음과 같이 작성할 수 있습니다.

name = [ 'young-hee', 'cheol-soo', 'joo-yeon', 'min-ji' ]
loves = [ 'young-hee', [ 'min-su', 'cheol-soo' ], 'dong-soo', [ 'min-ji', 'jinee' ] ]

loves 리스트가 독특해 보입니다. 즉, 리스트 안에 리스트를 중첩해서 삽입하는 것이 가능함을 보여주고 있습니다.

리스트는 앞서 설명한 문자열과는 달리 훨씬 유연합니다. 원소의 개별 편집을 지원하기도 합니다. 특정 원소를 지우기 위해서는 다음과 같이 명령을 내리면 됩니다.

del name[0]
del loves[0]
del loves[0][1]

리스트에 제공되는 몇 가지 함수를 알아보도록 하지요. 우선 리스트를 사용하면서 가장 많이 사용할 정렬 함수를 살펴보면 간단합니다.

name.sort()
loves.sort()

결과를 확인해보려면 간단히 변수 이름만 입력해봐도 알 수 있습니다. 그런데 loves의 경우 중첩된 리스트에 있는 것이 앞으로 오고 개별 원소만 정렬된 상태로 되어있습니다. 무엇을 의미하는 것일까요? 중첩 리스트에서의 정렬은 재귀적이지 않음을 보여주는 것입니다.

중첩 리스트를 이용하여 간단히 행렬도 표현해볼 수 있을 것입니다. 예를 들면 [[1, 2, 3], [1, 1, 1], [3, 2, 1]] 과 같다고할 수 있겠지요.

** 돌발 퀴즈: 문자열과 리스트는 서로 형식 변환이 가능한 관계입니다. 문자열을 리스트로 바꾼 것과 리스트를 문자열로 바꾼 것의 차이점을 확인해 보시고 댓글로 그 차이점을 남겨주시기 바래요. ^^

돌발 퀴즈를 위한 힌트를 하나 드리겠습니다. 리스트와 문자열 사이의 형변환은 아래와 같이 하면 됩니다.

a = list('my lover')
b = str(a)

다음 Chapter에서는 리스트에서 제공하는 큐와 스택 에뮬레이션 기능을 살펴보기로 합니다.

Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

Python은 기존의 주류 언어들과 마찬가지로 함수와 객체를 지원합니다. Iron Python의 경우에도 당연히 이것이 가능합니다. 하지만 혼동하기 쉬운 점이 있는데, IronPython은 원래 "전역 (Global)"의 개념이 존재하지 않는 .NET 프레임워크의 특성을 간단히 무시하고 원래 Python의 특징을 흉내냅니다. 나중에 다룰 IronPython을 .NET Application에 Integration하는 단계에서 이것의 진짜 내막을 정확히 볼 수 있게 됩니다.

이러한 특징은 Visual Basic .NET의 모듈과 비슷한 원리인데, Visual Basic .NET의 모듈도 엄격히 따지면 보통의 클래스이지만 모듈의 이름을 애써 지정할 필요 없이 마치 전역 멤버처럼 사용하는 것이 가능한 이유가 Visual Basic 6.0의 특성을 흉내낸 것이기 때문입니다. 결론적으로 MSIL 코드에서는 전체 이름을 모두 기입해줍니다.

오늘 Chapter에서는 함수를 간단히 정의하고 사용하는 방법에 대해서 살펴보기로 합니다. 그리고 후반부에서는 C# 3.0에서도 도입이 거론되고 있는 람다에 대해서도 파이썬을 통해 보기로 합니다. 파이썬의 경우 람다는 실제로 사용하는 정규 문법입니다.

IronPython 콘솔을 켜고 다음과 같이 입력하도록 합니다.

def add(a, b):
  return a+b

구조는 너무나도 간결합니다. a와 b라는 것은 짐작이 가능합니다. 바로 함수의 매개 변수가 되는것이지요. 하지만 C#이나 VB.NET과는 달리 상당히 생략된 것이 많음을 알 수 있습니다. 하지만 이상하게 생각할 필요는 없습니다. 왜냐면, 우리는 목적에 맞는 프로그램을 온전히 구현하기 위한 것이 목표가 아니라 스크립트 언어의 특성에 맞는 프로그램을 표현 (Illustration)하기 위함이므로 이정도면 충분한 것입니다.

일단 a와 b라는 각각의 매개 변수에 대한 형식은 따로 지정하지 않았습니다. 즉 a와 b는 어떤 형식이든 대입이 가능함을 뜻합니다. 그리고 add라는 함수에 반환 형식을 지정하지 않았습니다. return 문 또는 뒤에 나올 yield 문 그 자체의 용법과 그것들이 다루는 데이터 형식에 따라서 함수의 반환 형식이 자동으로 결정될 수 있고 정확히 알 수 없는 경우에는 일반화된 형식으로 자동으로 결정하여 줄 것입니다.

위의 add 함수를 호출하는 방법 역시 간단합니다.

print add(1, 3)
print add("hello ", "world ")

첫 번째의 경우 숫자 4를 반환할 것입니다. 두 번째의 경우에도 Concatenation 처리가 된 문자열이 반환될 것입니다. 두 가지 동작 모두 유효한 것입니다.

이번에는 재귀호출을 사용하는 예를 다루어보도록 하겠습니다. 팩토리얼을 구하는 함수를 프로그래밍해보면 좋겠지요. ^^

def factorial(n):
  if n <= 1: return 1
  return n * factorial(n-1)

기본 알고리즘에 대해서는 따로 설명하지 않겠습니다. 당연한 이야기이지만 재귀 호출이 가능함을 보이고 있습니다.

이번에는 yield 키워드에 대하여 살펴보도록 하겠습니다.

def one_to_three():
  yield 1
  yield 2
  yield 3

yield 키워드는 C# 2.0의 것과 완전히 같은 용법을 제공합니다. 다만 return 키워드를 더 쓰지 않고 yield 문 하나만을 사용합니다.

그리고 함수를 프로그래밍하면서 필요한 것이 하나 더 있는데, 바로 함수의 문서화 작업입니다. 간단하지만 습관으로 두시는게 좋겠지요. Iron Python은 따로 문서화 문자열을 두지 않으면 자동으로 함수의 시그니처 (함수의 반환 형식과 매개 변수 목록, 함수의 이름과 같은 정보)를 생성하여 문서화에 반영하지만 이것을 직접 변경할 수도 있습니다.

def one_to_three_v2():
  "이곳에 설명문을 달아놓으면 됩니다."
  yield 1
  yield 2
  yield 3

첫 줄에 지정한 문자열이 바로 문서화 문자열이 됩니다. 이것을 확인해 보기 위하여 두 가지 방법을 쓸 수 있는데 하나는 __doc__ 프로퍼티를 직접 조회하는 것이고 또 하나는 help() 내장 함수를 이용하는 것입니다.

help(one_to_three_v2)
print one_to_three_v2.__doc__

help 내장 함수의 경우 좀 더 정리된 모습을 보여줍니다. 두 번째 방식도 가능한 것이므로 참고하시기 바랍니다.

오늘의 마지막 순서로 람다에 대하여 살펴보기로 합니다. 람다는 앞서 간단한 설명을 통해 언급하였듯이 C# 3.0에서 도입하고자 하는 람다와 유사한 것입니다. 람다는 한 줄에 표현이 가능한 수식을 함수로 만들어줍니다. 다음의 예를 살펴보도록 하지요.

(lambda x, y: x ** y)(10, 3)

위와 같이 구문을 입력하면 10의 3승 값인 1000이 반환됩니다. 간단히 분석해보도록 하지요. x와 y는 함수에서처럼 매개 변수를 뜻합니다. 그리고 : 기호 다음에 나오는 것이 수식이 됩니다. 람다는 값을 반환하는 작업 등은 전혀 하지 않습니다. 하지만, "평가"가 가능한 식 그 자체가 반환값이 됩니다.

일반적으로 모든 수식은 반환값이 자동으로 산출되는 "평가"가 가능한 형태입니다. 그리고 반환값이 있는 모든 종류의 함수들을 포함하여 읽기가 가능한 프로퍼티, 상수, 변수 등도 "평가"가 가능한 형태입니다. 이 두 가지를 모두 활용하더라도 반환값을 만들어낼 수 있는 것도 가능합니다. 더 나아가, 람다 자체는 어떤 값을 분명히 반환한다는 일종의 규약을 가지고 있기 때문에 람다 안에 람다를 집어넣는 중첩도 가능합니다.

람다는 저장해두었다가 필요할 때 재사용할 수 있습니다. 위의 식을 임의의 함수 o로 받아봅니다.

o = lambda x, y: x ** y
o(10, 3)

방금전과 마찬가지의 결과가 나타나게 됩니다. 이번엔 좀 더 나아가 람다 안에 람다를 집어넣는 중첩의 한 예를 보겠습니다.

(lambda x, y: (lambda z: z + 1)(x) ** y)(9, 3)

실용적으로 보이지는 않지만 가능한 예임을 들기 위하여 다소 복잡한 코드를 써보았습니다. 차례대로 따라가보면 쉽습니다. 안쪽의 람다부터 살펴보도록 하지요.

안쪽의 람다는 z라는 매개 변수를 받고 z에 1을 더하는 계산을 합니다. 함수 정의에 이어서 곧바로 호출을 하는데 여기에 들어갈 값은 바깥쪽의 람다의 x라는 매개 변수입니다. 즉, x에 1을 더한 값을 반환합니다. 그리고 이렇게 나타난 값에 y승 연산을 시키도록 합니다. 이것이 바깥 람다가 됩니다. 곧 이어, 바깥 람다 정의에 이어 호출에 들어가는데 인수로 9와 3이 주어집니다. 결과적으로 9는 1을 더하여 10이 되고 10의 3승을 계산합니다. 즉, 1000이 반환되겠지요.

오늘 강좌도 상당히 길었습니다만 도움이 되실거라 믿습니다.

Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다