[ CnUnix ] in KIDS 글 쓴 이(By): shohe () 날 짜 (Date): 1994년03월19일(토) 07시51분25초 KST 제 목(Title): Polymorphism vs. Overloading 1. 들어가는 말 프로그램 = 데이타 + 알고리즘 입니다. 어떤 프로그래밍 언어에서는 데이타에 타입이 없고, 어떤 프로그래밍 언어에서는 있죠. 타입이 있는 것이 좋은 것인가 없는 것이 좋은가, 그리고 데이타 타입 검사가 강한 것이 좋은 것인가 약한 것이 좋은 것인가는 다른 논의이구요. 저는 프로그래밍 언어를 타입측면에서 간단하게 다음과 같이 나누고 싶습니다. (1) 타입이 없는 언어: 리스프 (2) 타입이 약한 언어: C 언어 (3) 타입이 강한 언어: 파스칼, C++ (3-1) Overloading을 사용하는 언어 (3-2) Polymorphism을 사용하는 언어 2. 본말 (1) Overloading이란? @라는 오퍼레이터를 예로 듭니다. @:: integer * integer -> integer 즉, 2개의 integer를 인자로 받아서 integer를 돌려주는 경우 @(x, y) := IntegerFunc (x, y) 로 정의가 되고 @:: double * double -> double @ (x, y) := DoubleFunc (x, y)가 된다고 합시다. 이경우를 보면 하나의 오퍼레이터 @에 두개의 함수가 달려있죠? 즉 인자가 integer인가 또는 double인가에 따라서 실제 함수가 결정된답니다. 보통 +, * 같은 것들이 다 이렇게 구현되어 있답니다. 정수 덧셈과 실수 덧셈이 다르게 구현되어 있답니다. 그외에도 C++에서는 overloading 기능을 제공하죠? 사용자가 이 기능을 사용할 수 있게끔... 이 경우의 약점은 무얼까요? 타입이 달라도 같은 함수를 쓸 수 있게끔 할 수 있나요? 정수든 실수든 DoubleFunc를 사용하게끔 할 수 있나요? Overloading에서 그런 기능을 제공하지는 못한답니다. 그래서 이것을 보완하기 위해서, C++같은 언어에서는 [타입 변환]기능을 제공합니다. (type casting) 엄밀하게 말하면, 타입 변환 기능은 반칙이죠? 이것 때문에 많은 문제를 발생할 수도 있고요... (2) Ploymorphism 만약에 우리가 바구니에 있는 물건의 갯수를 세고 싶다고 합시다. 물건의 형태에 상관없이요... 그것을 프로그램으로 쓸 수 있나요? 강한 타입 검사를 하는 프로그램에서 그런 것을 쓸 수 있을까요? 위의 예를 다시 듭니다. @: anytype * anytype -> anytype @(x, y) := func (x, y) 이렇게 할 수 있는 것이 polymorphism 의 개념이랍니다. 즉 강한 타입 검사를 하되, anytype을 제공하는 거죠. 최근에는 한단계 더 나아간 방법도 발견했답니다. @: 과일 * 과일 -> 과일 같이 광범위한 타입을 주는 방법이죠. 즉, 과일이라는 타입에는 사과 타입이 있을 수도 있고, 감귤 타입도 있을 수 있답니다. (제주도 사람이라는 것을 자랑하기 위해서, 감귤을.... 후후후) 단, 소나 말이라는 타입은 올 수가 없죠. 3. 끝내는 말 리스프이나 프롤로그는 타입이 없는 대신에 자유롭죠. 파스칼은 타입이 있어서 안전한 대신에, 자유롭지가 못하죠. 그래서 강한 타입을 주면서도 자유를 추구하고자 하는 뜻에서 overloading이나 polymorphism이 나온 거랍니다. overloading은 C++에서 볼 수 있고요. polymorphism을 보고 싶으면 함수언어(functional language)를 살펴보세요. ML, haskell, ... 이 있답니다. 4. 도움되는 책 - 대부분의 파스칼 교재 - 대부분의 C 교재 - 대부분의 C++ 교재 - ML for the working programmer, L.C.Paulson, Cambridge Univ. Press, 1991 - Type theory and functional programming Simon Thompson, Addison Wesley, 1991 - Categories and computer science, Cambridge Computer Science Texts 5. 꼬릿말 타입을 추론하는 방법은 어때요? 재미있겠죠? 혹시 [컴퓨터공학]이 아니라 [컴퓨터과학]을 하고 싶은 분은 Category theory쪽에 관심을 가져봄이 어떨지? 추억을 다시 되새길 수 있게 해 주신 분들께 감사드립니다. |