안녕하세요? 피터입니다.
오늘은 프로그래밍 세계에서 흔하게 사용되는 주요 용어들에 대한 개념을 쉽게 풀어보겠습니다.
흔히 컴퓨터는 0과 1밖에 모른다고 말하는 것을 들어봤을 겁니다. 이게 무슨 말일까요?
예를 들어서 설명해보겠습니다.
한국이라는 나라에서는 사람과 사람이 의사소통하는데 있어서
한국어라는 언어를 사용합니다.
한국어는 자음과 모음이 결합된 한글로 이루어져 있습니다.
컴퓨터의 세계에서는 사람과 기계가 의사소통하는데 있어서
기계어(machine language)라는 언어를 사용합니다.
기계어는 0과 1로 조합된 명령어(instruction)로 이루어져 있습니다.
한국인과 의사소통을 하려면 한국어를 알아야 합니다.
그렇다면 컴퓨터와 의사소통을 하려면 기계어를 알아야 할까요?
아주 오래 전에는 그랬었지만 다행이도 지금은 기계어를 알 필요는 없습니다.
한국어를 모르는 사람이 통역사를 통해 한국인과 대화를 할 수 있듯이,
사람과 컴퓨터 사이에도 통역사 역할을 하는 존재가 있습니다.
바로 어셈블러와 컴파일러입니다.
먼저 등장한 어셈블러는 개발자가 어셈블리어로 코드를 작성하면 이를 기계어로 번역해주었습니다.
그런데 이 어셈블리어도 굉장히 사용하기 어려웠으며 컴퓨터 구조에 종속적(정확히는 두뇌 역할을 하는 CPU에 종속적)이었기 때문에 새로운 구조를 가진 CPU가 등장할 때마다 똑같은 프로그램을 서로 다른 어셈블리어로 작성해야 하는 큰 불편함이 있었습니다.
그래서 CPU 구조에 종속적이지 않고 좀더 쉽게 사용할 수 있는 컴파일러가 등장하게 됩니다.
즉, 사람이 C, C++, Java 등의 사람이 사용하기 편리한 언어를 사용해서 프로그램 코드를 작성하면, 컴파일러가 이를 각 CPU타입에 맞는 어셈블리어로 번역(compile)하고, 이를 다시 어셈블러가 기계어로 번역(assemble)하여 컴퓨터가 이를 이해하도록 하고 있습니다. 최근에 나오는 컴파일러는 어셈블러를 내제하고 있기 때문에 개발자는 컴파일만 하면 바로 기계어로 번역이 됩니다.
결론적으로 여러분은 C나 C++, Java 등과 같은 고급 언어만 배우면 손쉽게(?) 컴퓨터와 의사소통이 가능한 것입니다.
하지만 의사소통만 가능해서는 컴퓨터로 할수 있는 일이 별로 없습니다. 게임이나 동영상 플레이어, 워드프로세서 같이 다양하고 복잡한 기능을 수행하는 프로그램을 만들기 위해서는 엄청나게 많고 복잡한 프로그램 코드를 작성해야 합니다. 구조적인 설계를 하고 큰 기능을 작은 기능들로 나눈 다음 각각 기능별로 구현을 해야 하는데 이 많은 작업을 혼자서 다 한다는 것은 불가능에 가깝습니다.
그렇기 때문에 여러 사람들이 하나의 로그램을 동시에 만드는 일이 많아지고, 여러 사람이 모여서 만들다 보니 비슷한 기능을 하는 코드들이 각자의 개성을 뽐내며 많이 생겨나게 됩니다. 이것은 관리적으로도 그렇고 쓰는 사람에게도 혼란을 주는 여러모로 비효율적인 현상입니다.
그래서 사람들은 이처럼 비슷한 기능을 하는 코드들을 한군데 모아놓고 다같이 공유해서 함께 쓰기로 합니다. 이렇게 탄생한 것이 바로 라이브러리(Library)입니다.
라이브러리를 만들어서 여러 사람과 공유하고 이를 활용해서 개발하게 되니 개발기간이 획기적으로 단축되고 각자 개성 넘치던 코드도 일관성이 생기면서 유지관리 측면에서도 효율이 증가하게 됩니다.
각각의 라이브러리는 누구나 필요하면 가져다 쓸 수 있도록 구체적이고 명확한 사용법, 즉 인터페이스를 제공합니다. 특히 응용 프로그램을 개발하는데 사용되는 인터페이스들을 API(Application Program Interface)라고 부릅니다.
이렇게 여러 조직에서 수많은 라이브러리들이 만들어지고 활용되어지면서 각 라이브러리들은 범용적으로 활용할 수 있게끔 많은 사람들이 고민하여 표준을 정하게 됩니다. 그렇게 만들어진 표준 라이브러리들은 이제 프로그래밍에서 없어서는 안되는 존재가 되었습니다.
개발자들은 이제 라이브러리를 통해 손쉽게 대형 프로그램을 개발할 수 있게 되었습니다. 그러나 한번 대형 프로그램을 개발하고 나서 또 다른 유사한 대형 프로그램을 개발하려고 할 때 다시 처음부터 개발하는 것은 너무 비효율적이라고 생각했습니다.
그래서 기본 골격이나 고정적인 설계 구조는 재사용 할 수 있도록 하고 나머지 세부적인 비즈니스 로직 부분을 개발자가 구현할 수 있는 환경을 제공하고자 만든 것이 프레임워크(Framework)입니다.
개발자들은 프레임워크를 활용해서 개발비용을 획기적으로 줄일 수 있게 되어 대형 프로그램이라고 해도 소수의 인원으로 개발이 가능할 정도로 효율성이 비약적으로 상승했습니다.
이렇게 다양한 프레임워크가 만들어지면서 개발자들은 단지 프레임워크를 선택하여 환경 구성을 하고 비즈니스 로직을 구현하기만 하면 되었습니다. 그런데 이 환경 구성을 할 때마다 매번 라이브러리 및 컴파일러, 개발툴과 디버깅 툴을 설치하고 필요한 환경 변수들을 셋팅하는 작업을 하는 것이 번거로웠습니다. 그래서 이러한 것들을 묶어서 하나의 패키지 형태로 구성하게 되는데 이것이 바로 SDK(Software Development Kit) 입니다.
대표적으로 Java SDK, Android SDK, DirectX SDK 등이 있습니다.
개발자들은 이런 SDK를 설치해서 자신들이 필요로 하는 프레임워크 기반의 프로그램들을 개발할 수 있게 되었습니다.
그런데 이러한 프레임워크를 만드는 사람들은 소수이고, 사용하는 사람들은 갈수록 많아지면서 사용자들의 요구를 만드는 사람들이 따라가지 못해 불편을 겪는 일이 생겨나기 시작했습니다.
그래서 사용자들은 자신들이 직접 라이브러리나 프레임워크를 만들기로 했습니다. 공개적으로요. 누구나 만드는데 참여할 수 있고, 가져다 쓰는 것도 자유입니다. 이렇게 오픈 소스(Open source)가 탄생하게 되었습니다.
오픈소스를 추구하는 데 있어서 가장 중요한 마인드는 "여러 사람과 공유함으로써 함께 발전한다" 입니다.
흔히 소스코드는 곧 기술이기 때문에 외부에 공개하면 자신들의 기술이 유출되는 것이라고 부정적인 시선을 보내는 분들도 계십니다만, 오픈소스는 많은 사람들의 지지를 얻고 이미 대세가 되었습니다.
하루에도 몇개씩 새로운 오픈소스 프레임워크가 쏟아지고 있는 지금 "잘 만드는" 능력도 중요하지만 "잘 가져다 쓰는" 능력도 못지 않게 중요해지고 있습니다.
여러분들은 어쩌면 굉장히 폐쇄적이던 과거(선임 개발자도 코드를 잘 보여주지 않던)에 비해 축복받은 시대에 살고 있는지도 모릅니다. 그렇지만 쏟아지는 오픈 소스들을 다 살펴볼 수는 없기 때문에 자신의 상황에 맞는 오픈소스를 선별하는 능력도 키우시길 바랍니다.
지금까지 프로그래밍 세계에 존재하는 주요 용어들에 대해 최대한 풀어서 얘기해봤습니다.
다음 시간부터는 C 언어 기초부터 강좌를 시작하도록 하겠습니다.
여러분의 공감 및 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.
- Peter의 우아한 프로그래밍
'프로그래밍 > C' 카테고리의 다른 글
[C언어 강좌-5] 상수 (Constant) (0) | 2017.01.26 |
---|---|
[C언어 강좌-4] 자료형 (DataType) (0) | 2016.12.06 |
[C언어 강좌-3] 변수(Variable)의 이해 (0) | 2016.12.02 |
[C언어 강좌-2] C언어 컴파일 과정 (15) | 2016.11.21 |
[C언어 강좌-1] Welcome to Hello world (1) | 2016.11.11 |