같은 문제를 푼 서로 다른 네 가지 방법
비행은 지구에서 적어도 네 번 따로 진화했어. 곤충, 멸종한 비행 파충류인 익룡, 새, 박쥐가 각각 독립적으로 비행을 풀어냈지. 어느 계통도 다른 계통에서 비행 능력을 물려받지 않았어. 새는 익룡에게서 날개를 받은 게 아니고 박쥐도 새에게서 받은 게 아니야.
네 계통은 같은 fly() 인터페이스를 서로 다르게 구현했어.
- 곤충. 외골격과 같은 재료인 키틴으로 만든 날개를 써. 날개 안에는 뼈가 없고, 가슴을 비틀어 날개를 움직이는 간접 근육이 힘을 내.
- 익룡. 엄청나게 길어진 네 번째 손가락 위로 피부 막이 펼쳐져 있어. 속이 빈 뼈와 거대한 날개를 가졌지.
- 새. 변형된 팔에 깃털이 붙어 있어. 팔뼈는 짧고 깃털이 양력의 대부분을 만들어.
- 박쥐. 길어진 여러 손가락 사이에 피부 막이 펼쳐져 있어. 익룡과는 다른 손가락을 쓰며, 파충류가 아니라 오늘날까지 이어지는 포유류 계통이야.
이것이 다형성이야. 인터페이스는 같지만 구현은 달라. 생물학에서는 이를 수렴진화라고 불러. 서로 다른 계통과 상속의 사슬이 같은 모양의 문제를 만나 비슷한 해법에 이른 거야. 인터페이스가 선명하게 드러나지.
수렴진화는 눈에 들어오기 시작하면 어디에나 있어
- 눈. 척추동물의 뒤집힌 망막, 문어의 바로 선 망막, 곤충의 겹눈, 갯가재의 눈은 모두
see()인터페이스를 독립적으로 다르게 구현한 사례야. - 반향정위. 박쥐와 돌고래는 모두 음파로 길을 찾아. 둘 다 포유류지만 6천만 년 넘게 따로 진화해 왔어. 인터페이스는 같고 코드 바탕은 달라.
- 유선형 몸. 어류인 참치, 포유류인 돌고래, 멸종한 파충류인 어룡은 서로 다른 조상에게서 왔지만 같은 유체역학 문제를 풀며 비슷한 몸 모양을 얻었어.
- 진사회성. 벌, 개미, 흰개미, 벌거숭이두더지쥐는 서로 다른 계통에서 같은 군체 구조를 독립적으로 발견했어.
객체 지향의 눈으로 보면 무엇이 보일까
서로 관계없는 계통에서 다형성이 거듭 나타난다면 문제의 모양 자체가 실제로 존재하고, 인터페이스는 계통보다 문제에 의해 정해진다는 뜻이야. 비행이라는 문제에는 양력을 만들고 방향을 조절하며 항력을 다스려야 한다는 모양이 있어. 어떤 코드를 물려받은 계통이든 이 문제를 풀다 보면 비슷한 인터페이스를 구현하게 돼.
프로그래머도 결국 같은 사실을 발견해. 어떤 인터페이스는 마음대로 정할 수 있는 것이 아니야. 문제 자체가 모양을 잡아 주지. 정렬 문제에 알맞은 인터페이스는 프로그래밍 언어가 달라도 비슷하고, 비행 문제에 알맞은 인터페이스는 곤충과 새, 박쥐에서 비슷해. 자연과 코드는 좋은 인터페이스의 모양에 동의해. 구현한 존재가 아니라 풀어야 할 문제가 그 모양을 정하기 때문이야.