기술을 아는 것과, 누구나 이해할 수 있도록 전달하는 건 다르다는 걸 깨달았습니다.
이 시리즈는 ‘기술을 쉽게 전달하는 방법’을 고민하며 쓰는 저의 학습 기록입니다.컴퓨터공학이라는 거대한 분야를 처음 접했을 때, 저는 각 개념이 왜 등장했고 어떻게 연결되는지가 가장 궁금했습니다. 그래서 이 시리즈는 단순한 정의나 기능 설명보다 맥락 중심의 흐름과 구조적 이해에 집중했습니다.
비전공자도 부담 없이 읽을 수 있도록 가능한 쉬운 언어와 비유를 사용했지만, 그만큼 설명 방식에 부족한 점이 있을 수 있습니다. 혹시 더 좋은 설명이나 보완 아이디어가 있다면, 댓글로 자유롭게 피드백 남겨주세요! 😊
– 기계어부터 파이썬까지, 프로그래밍 언어는 어떻게 사람 친화적으로 바뀌었을까?
우리는 컴퓨터에게 “이 문서 좀 열어줘”, “사진 저장해줘” 같은 명령을 내리면, 컴퓨터는 알아듣고 그대로 실행하죠.
하지만 사실 컴퓨터는 사람의 언어를 전혀 알아듣지 못합니다.
왜냐하면 컴퓨터는 오직 ‘켜짐(1)’과 ‘꺼짐(0)’이라는 전기 신호만 알아들을 수 있거든요.
이처럼 단순한 신호만 알아들을 수 있는 컴퓨터와,
복잡한 언어를 사용하는 사람이 대화하기 위해선 서로를 이어주는 ‘언어’가 필요했습니다.
그리고 그 과정에서 프로그래밍 언어가 발전해왔습니다.
가장 처음에는 사람이 컴퓨터의 언어를 직접 배워야 했습니다.
그 언어의 이름은 바로 기계어(Machine Language)였죠.
기계어는 오직 0과 1로만 구성된 언어입니다.
프로그래머들은 10110000 01100001
처럼 생긴 이진수 조합으로 컴퓨터에게 명령을 내려야 했어요.
이건 사실상 전기 회로에 직접 신호를 보내는 것과 비슷합니다.
“이 전선에 전기를 흐르게 해서 이 부품을 작동시켜라!” 같은 느낌이죠.
기계어는 컴퓨터 입장에서는 완벽했지만, 사람 입장에서는 너무 어렵고 비효율적이었어요.
한 줄의 명령을 작성하려면 수십 개의 0과 1을 손으로 입력해야 했고,
무엇보다 읽기도, 쓰기도, 유지하기도 너무 힘들었으니까요.
그래서 나온 것이 어셈블리어(Assembly Language)입니다.
기계어와 거의 1:1로 대응되지만, 0과 1 대신 사람이 이해할 수 있는 기호를 사용합니다.
예를 들어, MOV A, 5
라고 쓰면 “A라는 공간에 숫자 5를 넣어라(MOV)”는 뜻이 되죠. 기계어보다는 훨씬 읽기 쉬운 ‘인간 친화적’ 기계어라고 할 수 있어요.
하지만 컴퓨터는 여전히 이걸 이해하지 못하기 때문에, 어셈블러(Assembler)라는 프로그램이 필요합니다.
어셈블러는 어셈블리어 코드를 읽고, 컴퓨터가 이해할 수 있는 기계어로 변환합니다.
이 과정을 거쳐 실행 파일이 만들어지고, 우리가 프로그램을 실행하는 런타임(runtime) 시점에 운영체제를 통해 CPU가 이 파일을 받아 실행합니다.
런타임이란 말 그대로 프로그램이 실제로 ‘실행되고 있는 중’인 상태를 뜻해요.
예를 들어, 워드 파일을 더블클릭해서 열고 키보드로 글자를 입력하는 그 순간이 런타임입니다.
어셈블리어는 기계어보다 훨씬 사용하기 쉬워졌지만,
여전히 하드웨어 구조에 깊게 묶여 있는 저수준 언어였습니다.
컴퓨터마다 문법도 다르고, 하드웨어를 잘 이해하고 있어야 사용할 수 있었기 때문에
여전히 사람이 컴퓨터에 맞춰야 하는 언어였습니다.
그다음 등장한 것이 바로 고급 언어(High-Level Language)입니다.
이 언어들은 사람이 읽기 쉽게, 사람의 사고방식에 가깝게 설계된 언어예요.
고급 언어는 단순히 문법이 쉬운 걸 넘어서,
‘문제를 어떻게 바라보고 해결할지’에 대한 철학적 관점(패러다임)도 담고 있어요.
바로 이 패러다임에 따라 절차형, 객체지향, 함수형이라는 방식들이 등장했습니다.
가장 오래된 방식인 절차형 프로그래밍은 문제 해결을 위해 작업 단계를 순서대로 작성합니다.
“1단계 → 2단계 → 3단계”처럼 순차적으로 작업을 수행하는 구조죠.
이 방식은 구조가 단순하고 직관적이기 때문에 시스템의 기본을 다질 때 많이 사용되며, 대표적인 언어는 C 언어입니다.
💡 C 언어
하드웨어에 가까운 저수준 특성을 유지하면서도 사람이 논리적으로 구조화된 코드를 작성할 수 있게 만들어졌어요. 그래서 운영체제, 드라이버, 임베디드 시스템 같은 ‘시스템 가까이’에서 일하는 프로그램에 많이 사용됩니다.
복잡한 소프트웨어를 만들기 위해 등장한 개념이 바로 객체지향 프로그래밍입니다.
이 방식은 현실의 사물처럼 '객체' 단위로 프로그램을 구성합니다.
객체는 속성(데이터)과 행동(기능)을 함께 가지고 있고, 서로 간의 관계와 상호작용으로 프로그램이 구성돼요.
예를 들어 고양이 객체는 '이름', '색깔' 같은 정보(속성)와 '야옹하기', '뛰기' 같은 동작(행동)을 함께 가질 수 있어요.
현실을 코드로 표현하기 쉽고, 복잡한 프로그램도 명확하게 구조화할 수 있어서 협업, 유지보수, 대규모 시스템에 강한 설계 방식입니다.
Java나 Python은 이 방식을 잘 지원하는 대표적인 언어예요.
☕️ Java
Java는 '한 번 작성하면 어디서나 실행된다'는 철학으로 등장했습니다.
운영체제마다 실행 환경이 달랐던 문제를 JVM(Java Virtual Machine)이 해결해주면서, Java 프로그램은 Windows, Mac, Linux 등 어떤 환경에서도 동일하게 작동할 수 있게 되었습니다.
🐍 Python
Python은 문법이 매우 간결하고 직관적입니다. 코드를 보면 마치 영어 문장을 읽는 것 같아요.
덕분에 프로그래밍 입문자, 데이터 분석가, AI 연구자 등 다양한 분야에서 널리 쓰이고 있어요.
쉽지만 강력하고, 빠르게 실험하기 좋은 언어입니다.
마지막으로 소개할 패러다임은 함수형 프로그래밍입니다.
이 방식은 수학 함수처럼 입력이 같으면 항상 같은 결과가 나오는 구조를 따릅니다.
이 방식은 상태를 바꾸지 않고, 외부에 영향을 주지 않는 순수 함수로 구성되어 있어서 예측 가능성과 안정성이 필요한 분야에서 특히 강점을 가집니다.
JavaScript, Kotlin, Python 등도 함수형 스타일을 도입하고 있으며, 현대적인 소프트웨어 설계에서 점점 더 중요해지고 있어요.
이제 우리는 “출력해줘”, “계산해줘” 같은 일상 언어에 가까운 명령어로 프로그램을 작성할 수 있게 되었습니다. 하지만 이 코드들은 컴퓨터가 그대로는 이해할 수 없기 때문에,
중간에서 이 코드를 기계어로 ‘번역’해주는 도구가 필요합니다.
그 도구가 바로 컴파일러와 인터프리터입니다.
컴파일(Compile) 방식은 전체 코드를 한꺼번에 기계어로 번역해서 하나의 실행 파일로 만들어줍니다. 대표적으로 C 언어가 이 방식을 따르며, 속도와 안정성에서 강점을 가집니다. 하지만 에러가 나면 전체를 다시 번역해야 해서 디버깅(debugging, 코드의 오류 또는 버그를 찾아서 수정하는 과정)이 불편할 수 있어요.
반면 인터프리트(Interpret) 방식은 코드를 한 줄씩 읽으면서 곧바로 실행합니다. Python이 대표적인 예인데요, 실험과 테스트에 유리하고 즉각적인 피드백을 받을 수 있다는 장점이 있습니다.
하지만 실행 속도는 컴파일 방식보다는 느릴 수 있죠.
✋ 여기서 잠깐
혹시 이 시리즈를 처음 보셨다면, 알려드릴 게 있어요.
우리는 컴퓨터를 하나의 회사, 그 중심에 있는 CPU를 CEO에 비유해 설명하고 있어요. CPU는 모든 계산과 실행을 지시하는 컴퓨터의 ‘두뇌’죠.이 비유를 바탕으로 컴파일과 인터프리트를 다시 생각해보면,
컴파일은 설명서를 미리 인쇄해서 CEO 책상 위에 올려두는 방식이고,
인터프리트는 비서가 옆에서 실시간으로 읽어주는 방식이에요.전자는 빠르고 안정적이며, 후자는 유연하고 즉각적인 반응이 가능하죠.
프로그래밍 언어는 사람과 컴퓨터가 함께 일하기 위해 만들어진 공통 언어로 발전해왔어요.
처음엔 오직 전문가만 이해할 수 있는 기계어로 시작했고,
조금 더 읽을 수 있는 어셈블리어를 거쳐,
지금은 누구나 사용할 수 있는 인간 친화적인 고급 언어로 발전해 왔습니다.
그리고 이제 우리는 그 언어 위에 어떤 철학으로 문제를 풀고,
어떻게 협업하며 소프트웨어를 만들어나갈지를 함께 고민하게 되었습니다.
지금까지는 “컴퓨터에게 무엇을 시킬 수 있을까?”에 집중했다면,
이제는 “그 작업을 어떻게 함께 기획하고, 나눠서 만들고, 유지할 것인가?”를 살펴볼 차례입니다.
소프트웨어 공학(Software Engineering)은
개발을 단순한 코딩이 아니라 기획, 협업, 설계, 품질관리까지 아우르는 하나의 종합 기술로 바라보는 분야입니다.
실제로 하나의 서비스가 어떤 기획 과정을 거쳐 탄생하고,
어떻게 팀원들이 나누어 개발하며,
문제가 생기면 어떻게 유지·보수하는지를 함께 알아볼 거예요.
다음 편도 기대해주세요! 😊