객체지향의 꽃은 다형성(Polymorphism)이야.


추상화니, 캡슐화니, 상속이니 하는 것도 다형성을 지원하려고 존재할 뿐이랄까.



이론적인 말로 하자면, 하나의 호출 지점(Calling point)에 필요한 만큼의 진입지점(Entry point)을 설정할 수 있거든.


멋있지 않냐. 콜 하는 지점은 하나 밖에 없는데, 들어갈 수 있는 함수가 여러개라니. 이게 안멋있으면, 공부좀 더 해라.



그런데, 이 다형성이라는 게 꼭 객체지향 언어에서만 가능한 게 아니라는 거야.


내가 아는 한 가장 객체지향적인 프로그램은 바로 운영체제거든.


시스템 콜 호출 규약은 하나 밖에 없는데, 그 지점에서 호출되는 시스템 콜 함수는 200개가 넘어.


게다가 시스템 콜 쓰는 애들은 그 밑에 뭐가 있는지 잘 몰라. 심지어는 내가 시스템 콜을 쓰고 있는지도 모르고 있는 경우가 많지. 콜 하려는 함수 자체도 캡슐화 된 거랄까?


예를 들어, 가장 보편적인 printf(???) 요거 쓰면, 결국 호출되는게 write 시스템 콜이라는 걸 몰라. 아마 그 때 넘겨주는 파일 번호도 모를 걸?


비슷하지? 객체지향이랑.


간단하게 요약하자면, C로도 객체지향 구현할 수 있어. 상속? 컴포지션으로 구현하면 된다.



그런데, 이 객체지향의 꽃인 다형성이라는게 엄청난 약점을 갖고 있어.


바로, 분기 예측이 안된다는 거야.


아마, 펜티엄4가 망한게 파이프라인 때문이라는 걸 아는 사람은 알걸? 분기예측 실패할 때 비용이 파이프라인 숫자거든.


자바가 꽤 빨라졌다고는 하지만, 느릴 수 밖에 없는 이유도 비슷한데. 컴파일 시간에 다 해 놔도 느린 걸 실행 시간(Run time)에 하려니, 어떻게 되겠냐?



자.. 그런데, 순수 자바 보다 더 느린게 스크립트라는 거다.



태초에 지식을 나누고자 IT 못 배운 과학자들이 Markup Language 로 어설프게 만들어 낸게 HTML로 돌아가는 WWW이야.


프린터나 알아먹으라고 만들어 낸 언어로 망을 구현한 거지. 어쩌겠어, 걔들은 못배운 애들인데. 물론, 그걸 미리 선도하지 못한 책임은 우리들에게 있고.


보통 IT 똑바로 배운 사람이었다면, ML로 뭘 만들어 낼 생각 안할 거야. 차라리 언어를 새로 만들고 말지.


아무튼, 그래도 그 ML을 좀 보완해보려고 나온게 스크립트야.



글쎄, 사실 HTML5는 내가 잘 몰라서 그런데,


아무리 그래도, 스크립트에다가 컴파일러를 갖다 붙일 생각하는 사람이 똑바로 배운 사람 같지는 않다.



결론은.


1. 객체지향의 본질은 진입지점과 호출 지점을 적절히 설정하는 데 있다.


2. 언어만 갖고 놀려면 딴 생각 하지 말고, 그거나 해라.


3. 시스템 손 대고 싶으면, 운영체제부터 파 봐라.


4. 막연히 '이러면 좀 낫지 않을까?' 싶은 무언가 있다면, 대게 그게 낫지 않은 이유가 존재한다.