프로그래머로 취업 하고자 하는 후배들을 위한 3 번째 이야기
앞서 필자는 대한민국에서 SW 개발자로 취업하기 위하여 알아두어야 할 회사 정보에 대해서 알아 보았다. 이번에는 기술적인 측면에서 취업을 하기 위해 알아야 할 정보들을 작성하려고 하다보니, 어느 정도 수준의 독자 분들을 타겟으로 삼을까 고민이 되었다. 결국, 프로그래머로 취업은 하고 싶지만 아직 프로그래밍의 세계에 발을 들이지 않은.. 혹은 코딩은 해 보았으나 명확하게 본인의 소스 코드가 어떻게 동작하는 지 잘 모르는 분들을 위한 분들을 대상으로 시작하기로 하였다. 본 글은 SW 개발자가 되기 위해서 알아야 할 기초적인 컴퓨터 동작 원리에 대해서 다뤄보고자 한다. 이후에 설명할 많은 기술적인 용어들을 이해하기 위해서 반드시 이해해야하는 사항이니 반드시 이해하고 넘어가보도록 하자. 실은, 그리 어렵지 않다. 하지만, 필드에서 SW개발을 하고 있는 개발자들도 잘 이해하지 못 하고 있는 경우도 많다.
그럼 시작해 보자.
(참고로 아래 내용은 필자가 현재 집필중인 프로그래밍책의 일부분을 발췌한 내용임을 먼저 밝힌다.)
만약, 여러분이 컴퓨터를 전문적으로 교육 받은 분이 아니라면, 컴퓨터 동작 원리에 대해 무척 궁금해 할 것이다. (이 글을 읽고 있다면 반드시 그럴 것이라 장담한다.) 비단, 이 원리를 컴퓨터를 전공한 사람도 잘 이해 못 하는 경우가 많다.
여러분은 컴퓨터 혹은 노트북, 심지어 스마트폰 이나 태블릿 PC 등을 구매하면서 한 번쯤은 상세한 하드웨어 사양에 대해 고민해 본 적이 있을 것이다. 이왕이면 좋은 성능을 가진 장비를 가지고 싶어하는 것은 비단 필자뿐 만은 아닐 듯 하다. 가령, CPU 는 인텔에서 나온 건지, AMD에서 나온 건지, 클럭 수가 몇 인지, 메모리 용량은 얼마나 되는 지, 하드 디스크 용량은 얼마나 되는지, 운영체제는 32 비트인지, 64 비트인지.. 등등. 컴퓨터 동작 원리에 대한 이해 없이 이 숫자들을 가지고 본인에게 맞는 컴퓨터를 고르는 건 쉽지 않은 일이다. 그럼 위 항목들을 천천히 살펴 보자.
>_컴퓨터의 두뇌, CPU
CPU는 Central Processing Unit의 약자로써, ‘중앙 처리 장치’라고 불린다. 사람으로 따지면 ‘머리’에 해당하는 녀석이다. ‘컴퓨터 프로그램의 명령어를 해석하여 실행하는것’이 주 업무다. 가령, 외부에서 정보를 입력하고, 기억하고, 연산하고, 외부로 출력하는 일 들이다. CPU는 단독적으로는 동작하지 않는다. 컴퓨터 내부의 여러 부품과 데이터를 교환하면서 컴퓨터 전체의 동작을 제어한다. 필자 컴퓨터의 CPU는 인텔 Intel 이라는 회사에서 판매하고 있는 i5라는 CPU 다. 모델명은 M520 이다. 끝쪽에는 2.4 GHz라는 숫자가 보인다. CPU는 기본적으로 한 순간에 하나의 연산만을 할 수 있다. 2.4 GHz의 의미는 1초에 24억 번의 연산이 가능하다는 뜻 이다. 그렇기 때문에, 사람에게는 한 순간에 여러 일을 하는 것처럼 느껴진다. 숫자가 높을수록, 같은 시간에 할 수 있는 일이 많아진다. 마치, 대형 마트 계산대에 있는 종업원이 똑똑하면 똑똑할 수록 계산대에 머무르는 시간이 더 짧아 지는 것과 같은 이치다.
또 하나 생각 할 것이, 코어의 갯수다. CPU가 듀얼 코어 이면, 머리가 두 개이니 동시에 연산이 2번 가능하다는 의미이며, 쿼드 코어 이면, 머리가 4개이니 연산도 동시에 4번가능하다는 의미로 해석 하면 된다. 코어 수가 많을수록 짧은 시간에 많은 작업을 할 수 있을 것이다. 이외에도 CPU 내부 구조나 상세한 동작 원리에 대해서 많은 정보들이있지만, 일단 이 정도로만 가볍게 이해해보자.
(CPU에 대해서 더 상세한 정보를 알고 싶다면, 위키백과 링크를 참고해보자!)
>_컴퓨터의 손, 메모리
이 번에는 메모리를 살펴 볼까? 메모리는 사람의 ‘손’에 해당한다. CPU가 데이터나 프로그램을 읽으려면 어딘 가에 저장 되어 있어야 한다. 그 영역이 바로 메모리 영역이다. 마치, 주머니 속의 동전이 몇 개 있는 지 세기 위해서는 손으로 동전들을 꺼내서 손바닥에 펼쳐 봐야 아는 것과 같은 이치다. 만약, 손이 2개가 아니라 4개면 어떨까? (상상하고 싶지는 않다..) 손에 쥘 수 있는 동전 양이 많아진다. 컴퓨터 내에서 동시에 여러 가지 작업을 신속하게 하려면, 메모리 사이즈에 영향을 많이 받는다. 간혹, 인터넷 서핑을 하다가 웹 브라우저를 너무 많이 열면, 노트북이 버벅 거리는 경우가 있다. 이런 경우가 바로, 메모리가 부족한 경우다. 위에서 잠시 언급한 대형 마트의 계산대와 비유 하자면, 계산대에 계산원이 많을 수록, 동시에 계산 할 수 있는 고객의 숫자가 늘어나는 것과 같은 이치다!
메모리 영역의 가장 큰 장점은 ‘무척 빠르다’는 것이다. 손 위에 있는 동전을 쳐다 보는 건 어려운 일이 아니다. 하지만 가장 큰 단점은 전원이 들어오지 않을 때는 데이터를 기억하지 못하는 ‘휘발성’의 특징을 가지고 있다라는 것이다. 힘이 빠져서 주먹을 쥘 힘조차 없어 진다면, 들고 있는 동전을 모두 바닥에 떨어뜨리기 마련이다. 그리고 값이 많이 떨어지긴 했지만, 하드 디스크에 비해서는 ‘고가’이다.
>_컴퓨터 속의 주머니, 하드 디스크
그럼 하드 디스크의 영역은 어떻게 표현 할 수 있을까? 바로, 위에서 언급한 ‘주머니’ 다. 엄청 많은 동전을 손에 항상 들고 다닐 수는 없게 마련이다. 게다가 힘이 빠지면 떨어뜨리기까지 하니, 오랜 시간 동안 동전을 안전하게 보관하는 용도로 손은 좋은 선택이 아니다. 하드 디스크는 메모리와는 반대로 전원이 없어도 데이터를 저장 할 수 있는 ‘비휘발성’의 특징을 가지고 있으며, 메모리에 비해 값이 훨씬 ‘저렴’ 하다. 메모리는 개인 노트북 기준으로 현재 4 GB, 8 GB 정도의 기가바이트 (Gigabyte) 단위로 이야기 하고 있지만, 하드 디스크는 TB (테라바이트 Terabyte, 기가바이트보다 10의 3승만큼 더 크다) 시대다. 용량이 클수록 더 많은 데이터를 저장 할 수 있다. 하지만, 가장큰 단점은 ‘느리다’는 것이다. 아무래도 손에 있는 동전을 세어 보는 것 보다, 주머니 속에 있는 동전을 꺼내서 보는 것이 훨씬 느리다. 근래에는 SSD가 출현하여, 기존 하드 디스크보다 월등히 나은 성능을 보이고는 있으나, 이번 글에서는 컴퓨터의 기본 동작을 이해하는 것이니, 이 부분까지는 다루지 않도록 하겠다.
한 가지 더 언급 하자면, CPU는 메모리를 거치지 않고 하드 디스크의 데이터를 읽을 수 없다! 무조건 메모리를 거쳐야 한다. 주머니에 있는 동전을 세려고 본인 주머니를 뚫어져라 쳐다 보더라도, 세지 못 하는 것과 같은 이치다. 그렇기 때문에, 메모리와 하드 디스크 사이에 데이터 이동은 무척 빈번하며, CPU 연산 시 특정 데이터를 읽을 때, 해당 데이터의 위치가 메모리에 있는지 아니면 하드 디스크에 있는지에 따라서 CPU 연산 속도에 지대한 영향을 미친다. 메모리에 있다면 디스크를 읽을 필요가 없으니 신속하게 처리가 가능하겠지만, 메모리가 아닌 하드 디스크에 데이터가 있다면, 하드 디스크의 데이터를 읽어서 메모리에 얹은 다음에 읽어야 하니, 훨씬 응답 속도가 더디게 된다. 실제로 측정해보면, 몇 십배, 몇 백 배가 된다 해도 과언이 아니다. 이러한 성능 문제는 오늘날 컴퓨터 프로그래밍의 트랜드에도 큰 영향을 미치고 있다. (이 내용은 나중에 빅 데이터와 스파크와 같은 인 메모리 기술을 소개 할 때 반드시 이해하고 있어야 할 내용이다.)
>_컴퓨터와의 대화의 수단, 프로그래밍 언어
자, 그럼 지금까지 살펴 본 컴퓨터의 기본 동작 원리와 프로그래밍 언어와의 관계는 어떨까? CPU를 설명하면서 굵은 글씨로 강조한 문장을 다시 한번 읽어 보자.
‘컴퓨터 프로그램의 명령어를 해석하여 실행하는 것’
프로그래밍 언어는 컴퓨터의 머리라고 할 수 있는 CPU에게 어떤 작업을 하라고 명령을 내리는 언어다. 이 명령어를 통해서 컴퓨터는 사람이 입력하는 숫자를 기억하거나, 복잡한 연산을 처리하거나, 사람에게 멋진 화면을 제공 하는 등의 일을 수행한다. 이러한 프로그래밍 언어가 일반적으로 사람이 사용하는 언어와 같을까? 물론, 그렇지 않다. 실제로 컴퓨터가 이해할 수 있는 언어는 오로지 2개의 숫자의 조합뿐 이다. 바로 0과 1뿐이다! (이진수 혹은 바이너리 Binary 라고 한다.) 하지만, 사람은 0과 1만 가지고는 대화를 나눌 수가 없다. 그렇기 때문에, 프로그래밍 언어는 이 둘 사이의 간격을 채워 주는 역할을 한다. 사람에게는 친숙한 언어를 통하여 프로그램을 작성할 수 있게 도와주고, 프로그래밍 언어가 자체적으로 가지고 있는 고유한 번역 기능을 통하여 컴퓨터가 알아 들을 수 있는 0과 1의 숫자 조합으로 변경하여 프로그램이 실행 할 수 있게 해준다. 이런 역할을 하는 프로그래밍 언어들이 바로 Java, C, C++, JavaScript, Python 등 이다.
여러분이 만약 학교에서나 독학으로 프로그래밍을 해 본 경험이 있다면, 위 프로그래밍 언어의 문법 및 컴파일 방법, 실행 방법 등을 배워서 본인이 원하는 프로그램이 컴퓨터에 동작하는 재미있는 경험을 했을 것이다. 그렇다면 사회 생활에서의 프로그래밍과는 무슨 차이가 있을 까? 프로그래밍 언어는 컴퓨터와 대화를 하기 위한 수단임과 동시에 다른 프로그래머들에게 읽혀지기 위해 작성이 된다. 왜냐하면 회사 일의 규모라는 것이 혼자서 할 수 있는 수준을 벗어나기 때문이다. 문법을 지키는 것은 기본이지만, SW 개발자는 본인의 소스 코드가 읽기 쉽고, 깨끗하고, 이해하기 쉽게 작성이 되어야 한다. 이런 부분 역시 나중에 다뤄보도록 하겠다.
지금까지 CPU(머리) – 메모리(손) – 하드 디스크(주머니) – 프로그래밍언어(명령어) 의 관계에 대해서 살펴 보았다. 이 관계만 잘 이해해도, 현재 여러분이 사용하고 있는 모든 컴퓨터의 기본 동작 원리는 이해하는 셈이다. 여러분이 매일 매일 사용하고 있는 스마트폰 까지 포함해서 말이다. 이러한 기본적인 원리는 여러분이 프로그램을 작성할 때 반드시 기억해야 할 기본적인 사항이다. 이는 프로그램을 얼마나 잘 만드느냐와 직결하는 지식이니 잘 기억해두기 바란다. 그리고 한번 더 강조 하지만, 앞으로 필자가 소개 할 다양한 기술과 트랜드 등을 이해하기 위해서 반드시 알아야할 기본적인 지식이니 꼭 기억해두기 바란다.
그럼 다음 글에서는 국내에 어떤 유형의 SW개발자들이 있는 지 기술적인 관점에서 살펴 보도록 하겠다.