많은 사람들이 자바를 통해서 OOP에 입문한다.
C와 C++ 언어를 배운 후에 자바를 배우는 길이 있고 그냥 자바부터 시작하는 길도 있다. 어느 트리가 정답인지 여전히 논쟁의 대상이다. 프로그래밍 마스터의 단계에 올라 고수가 되면 비슷하게 통한다고 한다.
필자의 소견은 자바로 시작한 사람들도 훌륭하게 업무를 잘 수행하고 있는 것을 보면 큰 문제는 없는 것 같다. 자바로 시작한 사람도 나중에 C언어와 포인터를 배울 것이라 생각한다. 어떤 사람은 필요에 의하여 어셈블리어를 다시 배우는 사람도 있다.
OOP는 상당 부분 추상화 개념에 대해서 이야기한다. C언어를 언급한 것은 그것이 반드시 컴퓨터 본연의 작동방식에 친화적이지 않기 때문이다. OOP는 자원을 더 많이 쓴다. 크로스플랫폼을 위한 자바가상머신과 가비지 콜렉터는 C나 C++ 같은 언매니지드 언어에서 처럼 빠르게 작동하지 않는다는 인식이 널리 퍼져있고. 상당 부분이 사실이다.
추상화 개념은 컴퓨터의 0과1을 다루는 문제와는 좀 다른 문제이다. 사실 0과1을 다루는 일은 기계에게 적합하다. 반면 인간의 뇌에게 있어서는 추상화가 더 쉽다. OOP를 논의할 때 하나 더 추가해야할 것은 우리는 항상 두개의 뇌(CPU)를 가지고 이 일을 하고 있다는 사실이다.
하나는 인간의 뇌(실제 사람머리 안에 있는)
하나는 기계의 뇌(메인보드 소켓에 장착된 CPU)
이 둘의 뇌 구조와 언어가 다르다는 부분이 핵심이다. 잘하는 것도 다르다.
2020년 현재 AI 의 미래에 대한 공포는 거의 클리셰가 되버렸는데, 항상 인간은 AI에게 밀려나는 피해자 역할이다.
하지만 인간은 CPU를 압도하는 강력한 능력이 있다.
2016년 알파고는 이세돌을 이겼다. 동일한 방식의 계산과 경우의 수 연산에 특화된 컴퓨터의 승리이다.
www.youtube.com/watch?v=JX_M-Esi7xQ
www.youtube.com/watch?v=-Bob2MEbm9g
김경일 교수는 AI는 메타인지를 갖지 못했다고 한다. 인간의 메타인지력은 현재 방식의 모든 AI를 능가한다는 내용을 설파하고 있다.
이세돌 구단과 김경일 교수의 이야기를 잘 들어보면 인간과 기계가 생각하는 차이점에 힌트가 보인다.
위에서 말한 것 처럼 프로그래밍이란 일을 하기 위해서는 인간과 기계가 머리를 맞대야 한다.
정확히는 인간이 주인으로써 기계에게 일을 시키는 것이다.
객체지향 프로그래밍을 왜 배우는지 그리고 앞으로는 어떤 프로그래밍을 하게 될지에 대해 의문을 제기하는 사람도 알려주는 사람도 많지 않다. 이미 OOP의 뜻을 알고 있는 사람들이 가르쳐주는 것에 인색한 건지 배우는 사람들이 무심한 건지 아쉬움이 있다.
객체지향은 안그래도 어려운 프로그래밍을 조금이나마 더 편하고 쉽게 만들기 위한 노력이다.
왜 어렵냐면 기계의 뇌가 인간의 뇌와 작동방식이 다르기 때문이다.
인간의 수학적 능력과 논리적 사고를 할 수 있도록 본 따 만든 기계일지라도 만능은 아니다. 그것은 아주 복잡한 인간 능력의 일부에 지나지 않기 때문에 완전하지 않다.
컴퓨터란 존재는 인간을 능가하기 위해서 발명된게 아니라 인간의 능력을 확장하기 위해 세상에 나왔기 때문이다.
인간과 컴퓨터를 비교하기 위해서 컴퓨터의 원시시대 모습을 보는 것은 도움이 된다.
튜링 머신은 초창기 컴퓨터의 모습이다. 아직도 영어로 Computer라는 말 대신 Virtual Machine이라고 사용하는지 궁굼했다면 이것이 Machine 에서 출발했기 때문이고 지금도 Machine 기계이기 때문이다. 아래 영상에서 처럼 손으로 작동하는 튜링머신은 반도체가 들어간 CPU 없어도 가능하다.
www.youtube.com/watch?v=7TycxwFmdB0
www.youtube.com/watch?v=vo8izCKHiF0
www.youtube.com/watch?v=E3keLeMwfHY
OOP 이야기에 왜 여기까지 왔느냐? 프로그래머가 다루는 기계의 본질이기 때문이다. 프로그래밍을 하려고 이클립스를 켜면 OOP 프로그래밍은 기계의 본질과는 너무 멀리 떨어져 보인다. 운영체제 이론에서는 컴퓨터를 감싸는 층들을 나누고 각각 계층에 가상 기계라는 표현을 한다.
하드웨어 계층이 있고(하드웨어는 말그대로 단단한 기계다) 그 위에 운영체제라는 가상 기계가 있고 그 위에 애플리케이션(응용 프로그램)이라는 또 다른 가상 기계가 있다.
기계란 단어가 꼭 단단한 하드웨어의 대명사는 아닌 것이다. 운영체제나 애플리케이션도 자체의 독립된 영역을 운영하는 기계가 될 수 있다. 자바가상머신(JVM - Java Virtual Machine)은 자바 프로그램과 운영체제 사이를 넘나들며 하나의 독립된 기계로써 활동한다. Write Once, run anywhere (한번만 쓰면 어디든지 실행한다) 라는 자바의 모토는 자바가상머신이 있기 때문에 가능하다. 이 가상 머신이 윈도우와 리눅스 Mac OS에서 바이트코드를 실행하고 관리한다.
기계라는 단어는 물질적인 단어처럼 들리지만 그게 다는 아니다.
메모리위에 올라와서 지금 움직이고 있는 것, 윈도우즈, 자바가상머신, 애플리케이션 모두 소프트웨어로 작성된 기계인 것이다. 그래서 프로그래밍을 작성한다는 것은 기계를 만드는 것과 같다. 큰 기계가 있고 작은 기계로 세분하여 나눠질 수 있다. 세상의 다른 기계들 처럼 말이다. 이를 태면 자동차나 비행기 같은 기계들처럼 부분이 모여서 전체를 완성한다.
리눅스 토발즈의 일이 OS층의 가상기계를 만드는 것이라면 자바 프로그래머들은 애플리케이션 계층을 만든다. 객체지향프로그래밍은 많은 사람들이 효과적으로 협동하기 위해 개발되었다. 이제 더이상 한 두사람이 만드는 프로그램에 한계가 왔기 때문이다. 사실 이런 경향은 점점 가속화되가고 있다. 현재의 프로그래밍 방식이 바뀔날이 머지않아 오리라는 예측도 해볼 수 있다. 더 빠르게 더 거대한 프로젝트를 완성하기 위해서 20년전에 개발된 OOP방식만으로 충분할까? 아니면 더 많은 인력을 투입하는 것 만이 해결책인가?
이런 문제에 대한 답은 쉽게 얻을 수 없다. 하지만 바뀔 것 같다. 그게 뭐가 될지 모르겠지만.
요새 너무나 빨리 변하는 소프트웨어 기술을 따라잡기가 쉽지 않다. 이럴 때 일수록 원리적인 지식에 충실해야 한다고 생각한다. 컴퓨터의 근본이 되는 내용을 포스팅하려고 노력하는 것도 그 의지의 일환이다.
다음 자바 포스팅에서는 객체지향 용어정리를 하도록 한다.