|
프로그래밍의 세계에서는 생산성을 최대한 끌어올리기 위해 같은 작업을 몇 번이고 되풀이하거나, 코드 고치기를 몇 번이고 하지 않습니다. 프로그래머는 기본적으로 어느 정도의 작업을 실행하는 순서를 라이브러리로써 작성하고, 필요로 하는 경우에 반드시 그 코드를 재사용합니다.- 그 이유는 명확합니다.
- 코드를 새로 쓰지 않음으로 인해 시간이 절약됩니다.
- 코드를 몇 번이고 테스트 할 필요가 없어지기 때문에 시간이 절약됩니다.
- 버그를 해결할 필요가 있는 경우, 그곳의 버그만 수정하기에 시간이 절약됩니다.
다형성은 코드 재사용을 가능하게 합니다. 다음의 코드 예를 사용해서 설명하겠습니다.
아직 이 식의 설명을 읽지 않으셨다면 여기서 설명을 읽어주십시오.
- 4는 숫자입니다. 좀 더 구체적으로 말하면, Integer(정수)라 불리우는 수입니다. 비주얼웍스에서 정수는 SmallInteger와 LargeInteger로 나뉩니다. 객체지향 용어에서 4는 객체입니다. 그리고 SmallInteger는 그 클래스입니다. 다른 말로 "4는 SmallInteger 클래스의 인스턴스입니다"가 됩니다. "연어는 생선입니다"를 바꿔 말하면 "연어는 생선 클래스의 인스턴스입니다"가 됩니다.
- 비주얼웍스는 거대한 클래스 라이브러리를 제공하고 있습니다. 이 라이브러리에는 클래스에 속하는 코드(메서드)가 포함되어 있습니다. 이것들의 메서드는 컴퓨터(컴퓨터 언어)에 처리를 요구하는 기능을 가지고 있습니다. 예를들어 수치가 왔을 경우 더하기, 빼기, 곱하기, 나누기를 컴퓨터에 요구합니다. 또한 "squared"(제곱)을 계산하기 위해서는 더욱 고도의 수학적 기능을 실행하도록 요구할 것입니다.
- 위의 식에서는 4(SmallInteger 클래스의 인스턴스)에 squared 메시지가 송신되어 있습니다.
여기서 질문이 있습니다. Smalltalk의 클래스 라이브러리 가운데 squared 메서드를 어떻게 찾아내나요?
squared 메서드는 SmallInteger 클래스에 속해있다고 가정합시다. 스몰토크는 메서드를 SmallInteger 클래스에서 발견합니다. 이것은 작은 정수로, squared 메서드가 실행되는 것을 의미합니다. "제곱"은 그 숫자 자신을 곱하라는 것을 의미인데, 3.14같은 숫자는 "제곱"이 가능할까요? squared 메서드가 SmallInteger 클래스에만 속해있다면 대답은 NO입니다. 하지만 3.14와 같은 숫자를 "제곱"할 수 있게 해야한다고 누군가 주장할지도 모릅니다. 스몰토크에서 3.14는 Float 클래스의 인스턴스입니다. Float (short for floating decimal)은 정수가 아닙니다. 하지만 소수는 곳곳에서 쓰입니다.(예를 들자면 0.12나 12.3456) 문제해결의 한 방편으로서 Float 클래스에 제곱 메서드를 추가하는 건 어떨까요?
이 방법으로 인한 문제해결은 어느 부분이 부적절할까요?
이 해결책이 좋지 않은 이유는 명확합니다.
- 코드가 중복되기 때문에 라이브러리 사이즈가 증가합니다.
- 원래 있던 제곱 메서드에 버그가 있는 경우라면 하나 뿐만이 아닌 두 가지 메서드를 수정해야 할 필요가 있습니다.
- 큰 정수나 분수형과 같은 수치형에서는 사용할 수 없습니다.
문제해결책은 바로, 모든 수치형에 사용할 수 있는 클래스에만 squared 메서드를 이행하는 것입니다.
다형성(Polymorphism)이란 단어는 두 가지 단어로 이루어져 있습니다. "Poly"는 "many"(많은)의 의미이며, "morph"는 "form"(형태)의 의미입니다. 때문에 다형성은, 재사용을 가능케하는 "많은 형태"를 지닌 메서드를 가능케하며, 그렇기 때문에 한층 더 유연성이 늘어나게 됩니다.
|