프로그래밍 언어의 문법만 알면 개발을 할 수 있지 않나요? 왜 컴퓨터 구조와 운영체제를 배워야 할까요?

프로그래밍을 배우려고 마음먹으면 일단 프로그래밍 언어 책부터 찾아보곤 합니다. 하지만 프로그래밍 언어의 문법만 안다고 해서 실력 있는 개발자가 되기는 어렵습니다. 컴퓨터 구조와 운영체제를 알아야 프로그래밍을 근본적으로 이해하고 다양한 문제를 쉽게 해결할 수 있습니다.

 

 

컴퓨터 구조와 운영체제를 알아야 하는 이유, 맛보기

● 컴퓨터 구조를 이해하면 문제 해결 능력이 향상됩니다.
● 컴퓨터 구조를 이해하면 문법만으로는 알기 어려운 성능/용량/비용을 고려하며 개발할 수 있습니다.

● 운영체제는 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램입니다.
● 운영체제와의 대화를 통해 하드웨어와 프로그램을 더 깊이 이해하고 문제 해결의 실마리를 찾을 수 있습니다.

 

 


 

🖥️컴퓨터 구조를 알아야 하는 이유

 

컴퓨터 구조라고 하면 알 수 없는 컴퓨터 부품과 케이블, 복잡한 회로와 같은 이미지가 떠오르시나요?

언뜻 생각해 보면 이런 이미지는 프로그램 개발과는 큰 관련이 없어 보입니다. 지금껏 컴퓨터의 구성 요소와 작동 원리를 몰라도 프로그래밍 언어의 문법만 알면 프로그램을 개발하고 실행하는 데 전혀 지장이 없었기 때문입니다. 하지만 컴퓨터 구조는 실력 있는 개발자가 되려면 반드시 알아야 할 기본 지식입니다. 컴퓨터 구조를 이해하면 얻을 수 있는 장점에 대해 알아보겠습니다.

 

 

 

문제 해결 능력 

프로그래밍 강의나 책에 나오는 코드를 똑같이 따라 작성했는데도 코드가 제대로 작동하지 않는다면 어떻게 하실 건가요? 같은 코드를 작성했는데도 어떤 컴퓨터에서는 코드가 제대로 작동하고, 어떤 컴퓨터에서는 제대로 작동하지 않는 상황이 의외로 빈번하게 발생합니다. 

실무에서도 이런 상황이 종종 발생하는데요, 개발할 때는 문제 없이 작동했던 코드가 실제 사용자들에게 선보이는 자리에서는 작동하지 않는 상황이 비일비재합니다. 이 경우는 분명 코드상의 문법적인 오류만이 원인은 아닐 겁니다. 문제 해결의 실마리를 도저히 찾을 수 없는 사람은 발만 동동 구르겠죠. 당연합니다. 프로그래밍 언어의 문법만 알고 있는 사람에게 컴퓨터란 코드를 입력하면 어찌어찌 알아서 결과물을 툭 내놓는 ‘미지의 대상’일 테니까요. 결국 이들은 컴퓨터라는 기계에 코드를 ‘입력’만 할 수 있을 뿐 그 이상을 하기는 어렵습니다.

하지만 컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있습니다. 컴퓨터 내부를 거리낌 없이 들여다보며 더 좋은 해결책을 고민할 겁니다. 왜냐하면 이런 사고가 가능한 이들에게 컴퓨터란 ‘미지의 대상’이 아닌 ‘분석의 대상’일 테니까요.

이러한 역량이 업무 수행에 필요하다는 것을 기업들도 알고 있기 때문에 각종 기술 면접에서 컴퓨터 구조에 관한 소양을 검증하거나 반드시 알아야 하는 분야로 명시하기도 합니다.

 

컴퓨터 구조 채용

컴퓨터 구조 지식은 문법에 맞는 코드만 작성할 줄 아는 개발자를 넘어 다양한 문제를 스스로 해결할 줄 아는 개발자로 만들어 줍니다.

 

 

 

성능, 용량, 비용을 고려하는 능력

웹사이트를 개발했다고 가정해 볼게요. 웹사이트는 여느 프로그램과 마찬가지로 컴퓨터에서 작동하기 때문에 사용자들에게 선보이려면 이를 실행할 컴퓨터, 즉 서버 컴퓨터가 필요합니다. 인터넷 검색창에 ‘서버 컴퓨터’를 입력하면 아래와 같이 수많은 서버 컴퓨터가 검색됩니다. 서버 컴퓨터마다 사용하는 CPU와 메모리가 다르고 그에 따라 성능, 용량, 비용이 다양합니다.

컴퓨터 구조 서버 컴퓨터

어떤 컴퓨터를 고르실건가요? 무조건 저렴한 게 좋을까요? 아니면 최신 제품이 최고일까요?
저렴한 제품, 최신 제품과 같은 단순한 기준은 개인 컴퓨터를 고를 땐 문제가 되지 않으나, 프로그램을 실행할 서버 컴퓨터를 고를 땐 문제가 됩니다.

무작정 저렴한 컴퓨터를 고르면 턱없이 부족한 성능으로 인해 곤란한 상황에 처할 수 있습니다. 서버 컴퓨터의 성능이 너무 뒤떨어져서 링크를 누를 때마다 몇 초씩 기다려야 한다면 아무도 내가 만든 웹사이트를 이용하고 싶어 하지 않죠. 그렇다고 무작정 최신 컴퓨터를 고르면 수백, 수천만 원까지 비용이 불어날 수 있습니다. 예산이 한정된 상황에서 값비싼 컴퓨터가 늘 최선의 선택은 아닙니다.

 

컴퓨터 구조 AWS

서버 컴퓨터를 구매하지 않고 클라우드 서비스를 이용하더라도 이런 고민은 피할 수 없습니다. 어떤 CPU를 사용할지, 어떤 메모리를 사용할지 등을 직접 판단하고 현명하게 선택해야 합니다. 어떤 선택을 하는지에 따라 성능, 용량, 비용이 달라지기 때문이죠.

 

이런 상황은 다른 누군가가 대신 해결해 주지 않습니다. 내가 개발한 프로그램이 어떤 환경에서 어떻게 작동하는지는 내가 가장 잘 이해하고 있어야 하고, 프로그램을 위한 최적의 컴퓨터 환경을 스스로 판단할 수 있어야 합니다.

예를 들어 개발한 웹사이트가 제법 유명해졌다고 가정해 볼게요. 매일 새로운 회원 100명이 가입하고, 매일 새로운 글이 100개씩, 새로운 댓글이 1,000개씩 생성되고 있습니다. 이 웹사이트에 가입한 회원들의 정보, 그리고 각 회원이 남긴 게시글과 댓글은 어딘가에 저장되어 있어야겠죠? 다시 말해 저장 장치가 필요합니다. 그렇다면 어떤 저장 장치가 필요할까요? 그리고 어느 정도의 용량을 갖춰야 적당할까요? 이런 상황 또한 실력 있는 개발자라면 스스로 판단할 수 있어야 합니다.

앞에서 제시한 두 가지 상황으로 대표되는 성능, 용량, 비용 문제는 프로그래밍 언어의 문법만 알아서는 해결하기 어렵습니다. 혼자만 사용하는 프로그램을 만들 때는 이러한 문제를 생각조차 해 본 적이 없을 수도 있습니다. 하지만 유튜브, 워드 프로세서, 포토샵과 같이 사용자가 많은 프로그램은 필연적으로 성능, 용량, 비용이 고려됩니다. 그래서 컴퓨터 구조를 아는 것은 매우 중요합니다. 컴퓨터 구조에서 배우는 내용은 결국 성능, 용량, 비용과 직결되기 때문입니다. 즉, 컴퓨터 구조를 이해하면 입력과 출력에만 집중하는 개발을 넘어 성능, 용량, 비용까지 고려하며 개발하는 개발자가 될 수 있습니다.

 

 

 


 

🖥️운영체제를 알아야 하는 이유

우리가 흔히 사용하는 데스크톱 컴퓨터나 노트북, 스마트폰에는 모두 운영체제가 설치되어 있습니다. 대표적인 데스크톱 운영체제로는 윈도우와 macOS, 리눅스가 있고, 스마트폰 운영체제로는 안드로이드와 iOS가 있습니다. 컴퓨터 부품들은 전기만 공급하면 마치 마법처럼 알아서 작동하는 것이 아닙니다. 운영체제라는 특별한 프로그램의 지휘하에 작동하죠. 운영체제는 컴퓨터 부품들을 관리하고, 우리가 개발한 프로그램이 올바르게 실행되도록 돕습니다. 그러면 운영체제가 무엇인지 알아보고, 개발자들이 운영체제를 알아야 하는 이유에 대해 알아보겠습니다.

운영체제란

 

 

운영체제란?

모든 프로그램은 하드웨어를 필요로 합니다. 예를 들어 1+2를 계산하는 프로그램은 CPU를 필요로 하고, 이미지를 하드 디스크에 저장하는 프로그램은 하드 디스크를 필요로 합니다.

이때 프로그램 실행에 마땅히 필요한 요소들을 가리켜 시스템 자원, 혹은 줄여서 자원이라고 합니다.  CPU, 메모리, 보조기억장치, 입출력장치 등과 같은 컴퓨터 부품들은 모두 자원이라고 볼 수 있습니다.

즉, 모든 프로그램은 실행되기 위해 반드시 자원이 필요합니다. 여기서 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 바로 운영체제(operating system)입니다.


운영체제는 인터넷 브라우저, 게임과 같은 프로그램입니다. 그래서 운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 합니다. 다만 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역(kernel space)이라는 공간에 따로 적재되어 실행됩니다. 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역(user space)이라고 합니다. 즉, 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕습니다.

 

운영체제 커널 영역

 

 

아직은 조금 모호하죠? 예를 들어볼게요. 일반적으로 메모리에는 여러 개의 응용 프로그램이 사용자 영역에 적재되어 실행됩니다. 가령 작가가 책을 집필하기 위해 워드 프로세서, 인터넷 브라우저, 메모장을 실행 중이라면, 최소 세 개의 응용 프로그램이 사용자 영역에 적재되어 있는 셈입니다.

응용 프로그램(application software)은 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램을 의미합니다. 일상에서 사용하는 워드 프로세서, 인터넷 브라우저, 메모장, 게임 등과 같은 프로그램이 모두 응용 프로그램입니다.

 

 

운영체제 메모리

그런데 누가 이 프로그램들을 메모리에 적재했을까요? 위 그림에 따르면 워드 프로세서, 인터넷 브라우저, 메모장은 각각 2000번지, 1500번지, 1000번지에 적재되었는데, 메모리 주소가 겹치지 않도록 적당한 공간에 프로그램들을 적재해 준 건 누구였을까요? 바로 운영체제입니다. 운영체제는 실행할 프로그램을 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리합니다.

 

운영체제 메모리 자원 관리

 

 

또한, 이 세 개의 응용 프로그램이 실행되려면 반드시 CPU가 필요합니다. 그렇다면 어떤 프로그램부터 CPU를 사용하게 할까요? 그리고 얼마나 오랫동안 CPU를 이용하게 할까요? 이 문제 또한 운영체제가 해결합니다. 어느 한 프로그램이 CPU를 독점하면 다른 프로그램들은 올바르게 실행될 수 없기 때문에 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당합니다.

 

 

운영체제 CPU 자원할당

 

이번에는 워드 프로세서와 메모장이 동시에 동일한 프린터를 이용하려는 상황을 생각해 볼게요. 운영체제는 동시에 두 개의 프로그램이 프린터를 사용하지 못하도록 막고, 하나의 프로그램이 프린터를 이용하는 동안 다른 프로그램은 기다리게 만들어 프린터 자원을 관리합니다.

운영체제 자원 할당 관리

 

 

이처럼 운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 맡습니다.

응용 프로그램 운영체제 하드웨어

 

 

운영체제는 흔히 정부에 비유되기도 합니다. 한 나라의 정부는 땅, 인력, 돈 등 국내 자원을 효율적으로 배분하고, 국민들이 지켜야 할 규칙을 만들어 나라 전체를 관리합니다. 운영체제도 마찬가지입니다. 운영체제는 응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리합니다. 또한 정부에 기획재정부, 과학기술정보통신부, 외교부와 같이 역할별로 여러 부서가 나누어져 있는 것처럼 운영체제 또한 관리할 자원별로 기능이 나누어져 있습니다.

예를 들어 운영체제의 어느 한 부분에서는 CPU를, 어느 한 부분에서는 메모리를, 어느 한 부분에서는 하드 디스크를 관리합니다.

 

운영체제 쉽게 알아보기

 

 

 

✅운영체제를 알아야 하는 이유

개발자 입장에서 운영체제가 없는 세상은 상상만 해도 끔찍합니다. 아무리 간단한 프로그램이라도 운영체제가 없다면 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문입니다.

1과 2를 더한 결과를 모니터에 출력하는 간단한 프로그램을 생각해 봅시다. 이런 간단한 프로그램조차도 운영체제가 없다면 작성하기조차 매우 어렵습니다. 프로그램을 메모리에 적재하는 코드, CPU로 하여금 1과 2를 더하게 하는 코드, 모니터에 계산 결과를 출력하는 코드를 개발자가 모두 직접 작성해야 하기 때문입니다.

하지만 다행히도 이 세상에는 운영체제가 있습니다. 운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요 없이 운영체제의 도움을 받아 간편하게 개발할 수 있습니다.

 

그렇다면 개발자들이 왜 운영체제를 알아야 할까요? 어차피 운영체제가 알아서 하드웨어를 조작해줄 테고, 개발자들은 운영체제의 도움을 받아 프로그램만 개발하면 될 텐데 말이에요.

그 이유는  처음에 언급한 문제 해결 능력과 관련이 있습니다. 내가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어를 조작하는 프로그램이 운영체제입니다. 그래서 운영체제는 프로그램이 하드웨어 상에서 어떻게 작동하는지를 우리보다 더 먼저, 더 자세히 알고 있습니다.

그리고 운영체제는 딱딱한 하드웨어가 아닌 프로그램이기 때문에 우리와 대화할 수 있습니다. 운영체제는 현재 하드웨어의 상태는 어떠한지, 코드가 어떻게 실행되었는지, 하드웨어 상에 어떤 문제가 있었는지 등을 상세히 알려줄 수 있어, 이를 통해 우리는 문제 해결의 실마리를 찾을 수 있습니다. 즉, 운영체제를 깊이 이해하면 운영체제가 우리에게 건네는 말을 제대로 이해할 수 있고, 운영체제에 제대로 명령할 수 있게 됩니다. 그리고 결과적으로 하드웨어와 프로그램을 더 깊이 이해할 수 있습니다.

 

대표적인 운영체제와의 대화 예시는 오류 메시지입니다. 개발을 하다 보면 접하게 될 대다수의 오류 메시지의 근원은 운영체제입니다. 작성한 소스 코드를 하드웨어가 제대로 실행하지 못하면 운영체제는 아래와 같은 오류 메시지를 띄워 줍니다. 프로그래밍 문법만 학습한 사람들은 운영체제의 메시지를 이해하기 어렵고, 문제를 진단하고 해결하기도 어려울 겁니다.

 

메모리 누수현상잘못된 주소 참조

 

뛰어난 개발자 중 운영체제 지식을 그저 고루한 이론으로 치부하거나 알 필요가 없다고 말하는 사람은 거의 없습니다. 다수의 기업에서 운영체제에 대한 이해를 필수적인 기초 역량으로 요구하고, 채용 과정에서 기술 면접 등을 통해 검증하는 것도 이러한 이유 때문입니다.

 

 

 


혼자 공부하는 컴퓨터 구조+운영체제 위 내용은 『혼자 공부하는 컴퓨터 구조+운영체제』의 일부분을 재구성하여 작성하였습니다.

프로그래밍 언어의 문법만 안다고 해서 실력 있는 개발자가 되기는 어렵습니다. 컴퓨터 구조와 운영체제를 알아야 프로그래밍을 근본적으로 이해하고 다양한 문제를 쉽게 해결할 수 있습니다.

코드 속에 숨어 있는 문제를 해결하고 싶을 때, 부족한 전공 지식을 습득하고 싶을 때, 기술 면접을 준비하고 싶을 때 혼공컴운을 펼쳐보세요!