추상화와 가상화는 무엇인가?
컴퓨터 공학을 제대로 이해하기 위해서 알아야 할 가장 핵심적인 용어다. 추상성을 클래스화 해버리는 객체지향 프로그래밍은 물론 현대 소프트웨어의 큰 방향성을 이해할 수 있는 키워드다.
컴퓨터의 추상화와 가상화 작업은 서로 연관성이 있기 때문에 둘을 묶어서 살펴 보면 이해에 도움이 된다.
추상성, 가상성 이라는 용어에 귀를 귀울이는 자체가 부담스럽다면 그건 지극히 정상이다.
고등학교 수업 정도에서도 추상적 사고라던가, 가상의 세계 같은 말은 들어봤을텐데 그게 뭐가 어쨌다는 걸까?
둘 다 굉장한 주제다. 그리고 이 굉장한 주제를 몇개의 글만 읽고 모두 이해하는 것은 불가능하다. 컴퓨터의 추상성을 말로 듣고 이해할 수 있다면 읽어서 알고 있는게 아니라 이미 알고 있는 것을 확인한 것이다. 그만큼 난해한 부분이 있다.
말로 듣지 않아도 사물을 이해하는 천재는 어디에나 한두명은 있다. 그들은 때로 스스로를 드러내지 않는다.
한번 사전의 뜻을 살펴보자.
1. 일반적인 사항을 다루는 것이고
2. 구체성이 없는 것이다.
흠... 일반적이고 구체성이 없는 것이라면 이론 같은 것 이라고 생각할 수 있겠다.
* 컴퓨터의 추상화(abstraction) 정의 : 어떤 복잡한 것들을 단순화 시켜서 표현한 것이다.
예를 들어보면 추상화가 어떤 것인지 확실히 감이 올 것이다.
-> 당신이 자동차를 운전할 때 악셀을 밟으면 속도가 높아지고 브레이크를 밟으면 정지한다. 핸들을 오른쪽으로 돌리면 바퀴가 오른쪽 방향으로 향하고 왼쪽으로 돌리면 왼쪽으로 향한다. 여기까지 알면 운전을 할 수 있다.
그런데 운전을 하기 위해서 자동차 엔진의 구조와 작동원리를 알아야 할까? 타이어를 갈아끼우는 기술이 필요할까? 정답은 필요없다. 오늘날 내연기관의 자동차는 약 3만개의 부품이 들어가며 길거리에서 볼 수 있는 가장 복잡한 기계 중 하나다. 자동차를 바깥에서 보면 매끈한 바디(body)로 둘러쌓여 있고 복잡한 섀시의 내부는 보이지 않는다. 안에서 타면 고급스런 가죽 의자에 손에 감기는 핸들과 심플한 계기판이 보인다. 핸들과 바퀴가 연결되어 있는 부분이나 브레이크가 어떻게 자동차를 멈추는지 보이지 않는다. 이 모든게 추상화(Abstraction)이다. 요컨대 몰라도 된다.
다시 사전의 뜻을 본다. '일반적인 사항을 다루는 것이고 구체성이 없는 것이다.'
만약 당신이 세단을 운전할 수 있다면 SUV나 1톤 트럭도 운전할 수 있을 것이다. 현대차를 운전할 수 있다면 벤츠도 운전이 가능하다고 생각한다. (운전할 기회가 온다면...) 일반적인 차량을 운전할 수 있게 되는 것이 운전 기술이다. 차량을 조립할 필요도 타이어를 손수 갈아야될 이유도 없다. 차를 좋아하는 매니아나 엔지니어들에게 그런 능력과 여건이 있겠지만 그것은 일반적인 것을 다루는게 아니다. 차의 원리에 대하여 1도 모르는 사람이 탈 수 있는 것이다. 구체적으로 몰라도 된다. 이게 추상성이다. (Abstraction)
이것을 그대로 컴퓨터로 적용하면 된다.
컴퓨터를 사용하는 사람(컴퓨터의 운전자라고 볼 수도 있다)이 알아야 할 것은 컴퓨터를 킨 다음에 마우스로 클릭을 하면 된다. 인터넷을 하고 싶으면 웹브라우저를 더블 클릭하면 된다. 이게 끝이다. 엄청난 사실이다.
게임을 하는 사람은 게임을 키고 플레이할 줄 알면 된다. 리그오브레전드 전세계 1위 게이머인 페이커는 컴퓨터 공학의 전문가가 아니지만 게임의 세계를 지배한다.
만약 컴퓨터를 사용하기 위해서 운영체제를 직접 제작하고 응용 프로그램을 직접 만들어야 한다면 자동차가 그랬던 것 처럼 컴퓨터의 보급은 불가능했을 것이다.
추상화(Abstraction)에는 설계자(designer)와 사용자(user)가 있다.
As a user you don't have to know everything in detail. 사용자는 구체적인 것은 몰라도 된다는 게 핵심이다.
컴퓨터 공학의 상당 부분은 컴퓨터 시스템의 추상화 설계를 통해 사용자들이 복잡한 컴퓨터의 기능을 세부적으로 알 필요 없이 사용할 수 있게 만드는 것이다. 지금까지 이야기한 예는 주로 최종 유저인 사람과 사물에 대한 것이지만 추상화에는 단계가 있다.
* 하드웨어 레벨 -> 소프트웨어 레벨 -> 사용자 레벨
다시 각 레벨안에서 세분화된다.
프로그래머가 다루는 소프트웨어 레벨은 CPU에게 직접 명령을 전달하는 Instruction Set 부터, 운영체제 레벨, 응용프로그램 ... 또 다시 이 안에서 세분화가 진행된다.
그러니까 프로그래밍에 마스터는 불가능하다는 말도 일리가 있다. 이 모든 계층의 추상화를 전부다 이해하거나 암기하고 있는 사람은 없다. 자기 분야에 특화되서 두루 알고 있는 사람들은 있지만.
객체지향프로그램의 추상화 개념과도 연관이 있다. 기존의 프로그램은 절차적 프로그래밍 방법으로 접근했다. C언어를 보면 함수와 데이터가 분리되어 있었다. 그런데 C++과 자바에서 클래스라는 특수한 데이터 타입을 만들어서 함수를 메소드로 바꾸고 데이터를 속성으로 바꿔서 묶어버렸다. 그리고서 앱 프로그래머들에게 이제 부터 프로그램에서 자동차라는 객체를 사용하려면 핸들과 브레이크만 가지고 운전하면 되. 다른 것은 몰라도 되. 라고 말한 것이다.
복잡한 것을 간단히 한다는 것은 꼭 최종 유저에게만 그렇다는게 아니다. 하드웨어 설계자가 시스템 프로그래머에게 시스템 프로그래머가 응용 프로그래머에게 복잡한 것을 제거하고 준다는 뜻이기도 하다.
추상화에 대해 약간의 힌트를 발견했다면 한층 더 모호해질 수도 있다. 그래서 추상화가 어떤 것인지 대충 알겠는데 실제로는 어떻게 다뤄야 하는것인가? 누가 어떤 역할을 하는지 기준이나 규칙을 좀 명확하게 정해놓아야 하는게 아닌가?
맞다. 추상화라는 말로는 이해는 가도 와닿지 않는다. 컴퓨터 시스템을 모르는 사람이(흔히 컴알못이라고 한다) 판매점 주인과 가끔 소동을 벌이는 이유도 여기에 있다. 컴퓨터 하드웨어는 일체형이 아니라 호환 방식이다. INTEL CPU/Mainboard 호환 PC라고 하지 현대자동차의 제너시스 처럼 브랜드 명칭을 부르지 않는다.
Intel 호환 PC의 부품을 고르는 것은 고객의 자유지만 호환성 문제가 발생시 판매점의 책임이 있지만 고객의 책임도 0%라고 할 수 없다. 수많은 PC 부품간의 매칭 가능성을 계산해봐도 문제는 생길 수 있다. 일체형으로 제공하는 Mac 북의 경우 Intel PC에 비해 부품 호환성 문제가 거의 없을 수 밖에 없다. Intel은 느슨한 추상성을 제공하는 것이고 Mac은 좀 더 완전한 추상성을 추구하는 것이다. 어느쪽이 옳은지에 대한 것은 아니고 어떤 방향을 추구하는가의 문제다.
여기서 가상화를 시킬 수 있다. Mac 북은 전용의 OS와 전용의 소프트웨어를 장착한다. IOS를 사용하는 아이폰, 아이패드와 함께 사용할 수 있는 전용 앱스토어와 프로그램이 있다. 아이폰을 개발하기 위한 소프트웨어 언어와 안드로이드 개발 소프트웨어는 문법부터가 다르다. 아이폰의 개발자와 안드로이드 개발자가 따로 있다.
이들은 처음부터 같은 아키텍처로 설계하고 하드웨어도 짝을 맞춰놨으니 INTEL PC를 사용하는 사람들이 안드로이드 폰과 함께 사용하는 것과는 다르게 강한 결속력이 있다.
즉 애플사만의 가상기계, 가상의 소프트웨어로 이루어진 가상 세계가 존재한다는 것이다. 이 단계에서는 고객도 가상화가 되어있다. 사람들이 애플의 열렬한 매니아들을 비판하기 위해 만든 OOO 이라는 비속어도 생길만큼 애플의 가상화는 막강하다. 애플 제품을 우선시하는 사용자들의 이야기를 잘 들어보면 비슷하다.
애플이 구축한 강한 가상화 시스템이 확실한 브랜드 가치가 있음을 부정할 수 없다. 스티브잡스, 애플컴퓨터, 매킨토시, 아이폰, 아이패드, 맥북 이름만 들어도 시대의 아이콘이라는 브랜드 가치가 녹아있다.
Intel과 오랫동안 함께해온 MS의 경우 과거 파란화면(블루스크린)으로 악명이 높은데 사실 윈도우10에 와서는 상당히 안정이 되었음에도 불구하고 이런 과거의 이미지들이 지금까지도 MS에 대한 반감으로 남아있다. 한국에서 보다 해외의 경우 MS와 창업자 빌게이츠에 대한 안티 이미지가 엄청 강하다. 요새도 유튜브에서 빌게이츠는 devil 이라는 드립도 어렵지 않게 볼 수 있다.
그런 것 치고는 지금 하는 복지 사업이 너무 대비된다.
MS가 독점시장을 남용한 것은 사실이지만 한편으로 과거 IBM PC에서 시작된 다양한 부품과의 호환성을 포기하지 않았던 부분도 있다. 상업용 서버나 워크 스테이션은 안정성과 성능이 좋아야 하기 때문에 고가를 사용한다. 그런데 일반 소비자들은 그럴 여력이 없었다. 어쨋든 마이크로 소프트와 인텔은 소비자들게 PC를 커스텀 할 수 있는 자유 정도는 남겨줬다.
The Microsoft Monopoly - YouTube 마이크로 소프트의 독점
가상기계에 대한 Andrew Tanenbaum 의 Structured Computer Organization 에서는 해독(Interpretation)과 변환(Transalation)으로 가상화 단계를 설명하고 있다. 아래 그림과 같이 Level 0에서 Level N 까지 무한정 레벨을 올릴 수 있다. 물론 그냥 레벨을 올리는게 아니라 점차점차 복잡한 것들을 하나씩 줄이면서 레벨이 올라간다.
Level 0 이 디지털 논리 회로(CPU의 로직)에서 Level 5 (C언어 정도)까지 가는데 6단계가 소요된다. 이 책이 나온지 조금 되었으니 지금 기준으로 Level 6 는 Java 와 C++ 같은 객체 지향 언어일테고, Level 6.5 정도에 있는게 모듈, 객체, 함수를 다 이용하는 파이썬이나 자바스크립트 정도로 볼 수도 있다.
단계를 나눌 때 코드의 수로 보는 방법도 있다.
기계어는 일단 너무 길고 어셈블리어에서 바라보면 C언어의 1줄이 어셈블리어 2-3줄에 해당한다. 객체지향인 C++은 C언어보다 더 줄일 수 있고 Python 같은 언어의 경우 같은 내용을 코딩하면 반정도 코드가 줄어든다고 한다.
(대체적인 비교다. 프로그램 종류에 따라 다르다)
가상화와 가상기계라는 말을 함께 쓰는데 대표적인 가상기계는 자바 가상 기계(JVM - Java Virtual Machine)가 있다. 자바가 유명해진 것은 크로스 플랫폼을 제공하는 것에 있다. 소스코드를 한번 쓰면 다른 곳에서도 동작을 보장한다는 말이다. 핵심은 JVM 이 하는 일이다. 윈도우 에서는 윈도우 담당 JVM이 리눅스에서는 리눅스 담당이 맥OS가 임베디드 각자 있다. JVM 이전에는 윈도우와 리눅스에 따로 개발해야 했었다. 크로스 플랫폼이란 단어는 이식문제를 해결해 주는 것이 있고 이는 비용과 효율이 비약적으로 상승함을 의미한다.
크로스 플랫폼이란 단어가 많이 나오는데 일단 개발하는 회사의 입장에서는 적은 비용에 큰 결과물을 산출할 수 있기 때문에 좋다. 그런데 JVM 을 거치는 것은 아무래도 런타임에 CPU의 자원을 소모하는 일이니까 속도가 느려질 수 밖에 없는데 최근에는 가상기계도 발전해서 상당히 빨라졌다. 아마추어가 어설프게 짠 C++ 코드보다는 확실히 빠르다고 한다. 인간처럼 가상기계도 시간이 지나면 스스로 발전하는 것이다.
* 가상화도 추상화와 마찬가지로 광범위한 내용의 주제다. 보통 컴퓨터 구조에서 배우는 첫 단계는 가상 메모리, 가상 장치 등의 레벨이다. 리눅스 같은 경우 모든 하드웨어 장치를 파일로 가상화 시켜서 사용한다. 리눅스의 관점에서 모든 장치는 파일의 인터페이스로 관리한다. 실제로 물리적으로 붙어있는 기계지만 관리를 파일로 한다는 말이다. 관리자가 장치 관리를 하는 것은 파일관리를 하는 것과 같다.
좀 난해한 주제이지만 한번 쯤 정리해두기 위해서 기록해 둔다. 내용이 방대해서 초고를 쓰지만 혹 나중에 시간이 되면 깔끔하게 정리할 생각이다.