프로그래밍 언어 이해하기

타키탸키·2020년 12월 29일
0

컴퓨터 개론

목록 보기
2/9
post-thumbnail

프로그래밍 공부를 시작하고 싶을 때, 뭐부터 해야할 지 모르겠다면? 프로그래밍을 시작하는 대부분의 사람들은 언어의 선택을 가장 먼저 하곤 합니다. 우리가 외국어를 배울 때, 그 나라의 문화도 함께 배울 수 있듯이 프로그래밍 언어를 배우다 보면 프로그래밍 세계를 함께 알 수 있습니다. 이번 시간에는 여러 프로그래밍 언어의 특징에 대해 알아보고 내게 맞는 언어가 무엇인지 한 번 찾아봅시다! :)

📝 프로그래밍 언어란?

프로그래밍 언어에 대해 배우기 전에 컴퓨터, 프로그램, 프로그래밍 언어 이 세 가지 개념을 구분해 봅시다.

쉽게 말해 컴퓨터는 일을 대신 해주는 기계, 프로그램은 컴퓨터가 어떤 일을 해야할지 알려주는 설명서, 프로그래밍 언어는 설명서를 적기 위해 사용하는 언어라고 말할 수 있습니다.

패스트푸드점에 있는 키오스크를 떠올려 봅시다. 키오스크 기계 자체는 카운트 직원의 일을 대신해주는 컴퓨터입니다. 키오스크 내부에는 키오스크가 해야할 일들에 대한 설명이 담긴 프로그램이 있고 그 프로그램은 프로그래밍 언어로 작성되었습니다.

우리가 흔히 사용하는 MS office tool이나 카카오톡 같은 앱도 모두 프로그램이며 우리 눈에는 보이지 않지만 그 내부에는 컴퓨터가 할 일이 프로그래밍 언어로 적혀있습니다. 카카오톡의 채팅방 버튼을 누르면 '채팅방을 열어라' 같은 설명이 적혀 있는 것이죠.

📝 프로그래밍 언어의 발전

컴퓨터가 발전함에 따라 프로그래밍 언어도 함께 발전해왔습니다.

초창기의 컴퓨터는 성능이 좋지 않아 수학 연산만 가능했습니다. 톱니바퀴로 덧셈과 뺄셈을 하는 기계, 파스칼 계산기가 바로 그 예인데요. 앞서 컴퓨터, 프로그램, 프로그래밍 언어로 나눴던 개념을 적용해보면 파스칼 계산기는 컴퓨터, 덧셈과 뺄셈의 수행은 프로그램, 연산을 위해 톱니바퀴를 돌리는 행위는 프로그래밍 언어라고 할 수 있습니다.

이보다 조금 더 발전한 것이 종이에 구멍을 뚫어 컴퓨터에게 연산 결과를 알려주는 기술이었습니다. 이 경우에는 종이에 구멍을 뚫는 행위를 프로그래밍 언어라고 할 수 있습니다. 원하는 숫자에 구멍을 뚫으며 오늘날 프로그래머들이 하는 코드를 작성한 셈이죠. 재활용이 가능하다는 관점에서 파스칼 계산기에서 진보된 기술이라고 볼 수 있습니다.

기술이 발전하면서 사람들은 컴퓨터가 간단한 수학 연산을 넘어 다양한 일을 수행하길 바랐습니다. 이에 따라 다양한 기능이 가능한 컴퓨터와 프로그래밍 언어가 탄생한 것이죠. 숫자만 있었던 기존의 언어와 달리 영어와 숫자, 기호, 심지어 주석을 넣으면 한글도 작성이 가능합니다. 사람이 좀 더 이해하기 편한 언어가 된 것입니다.

보급형 컴퓨터와 사람이 이해하기 쉬운 언어의 탄생으로 현대에는 누구나 자신이 원하는 프로그램을 만들 수 있는 시대가 되었습니다 👍👍👍

📝 프로그래밍 언어 분류하기

프로그래밍 언어의 기본 구성 요소에는 영어, 숫자, 괄호, 따옴표, 점, 세미콜론이 있습니다. 얼핏 보면 서로 다른 프로그래밍 언어들이 비슷해보이기도 합니다. 하지만 자세히 보면 모습이 많이 다른 걸 알 수 있습니다.

Python

name = "James"
age = 23

Java

String name = "James";
int age = 23;

C

char name[6] = "James";
int age = 23;

이 세 가지 모두 같은 의미를 가지고 있지만 코드가 서로 다릅니다. 지난 시간에 배웠던 자료형, 변수, 함수, 파라미터를 기억하시나요? 위의 사례에서 네 개의 개념이 모두 활용된 경우도 있지만 단 한 가지만 사용된 경우도 있습니다.

그렇다면 왜 이렇게 많은 프로그래밍 언어가 생겨났을까요? 처음에는 단 한 가지 언어만 존재했을 것입니다. 그러나 개발을 하던 도중 여러 불편함을 느꼈습니다. 예를 들어, 컴퓨터 프로그램을 만들기는 편했지만 휴대폰의 앱을 만들기에는 불편했던 것입니다. 따라서, 특정 개발 환경에서 더 유용히 쓸 수 있는 언어를 만들어 낸 것이죠. 혹은 언어 자체가 어려워 조금 더 간단히 쓸 수 있는 언어를 만들어 내기도 했습니다. 실행 속도를 높일 수 있는 언어도 고안했습니다.

이처럼 사회의 상황에 따라, 개발자의 필요에 따라 등 여러 가지 이유로 프로그래밍 언어는 발전해왔습니다. 더군다나 최근에는 여러 디바이스와 환경, 기능 등이 요구되면서 더 많은 프로그래밍 언어들이 등장하고 있습니다.

요약하자면 용도, 상황, 프로젝트 규모에 따라 프로그래밍 언어는 점점 발전해왔습니다. 수요에 따라 새롭게 생기기도, 또 사라지기도 하는 것이죠.

그렇다면 이 많은 프로그래밍 언어 중에서 내게 맞는 언어를 어떻게 고르면 좋을까요? 아마 가장 좋은 방법은 프로그래밍 언어의 특징을 알고 마음에 드는 것을 고르는 것이 좋을 것 같습니다. 하지만 프로그래밍 언어 수가 많은 만큼 그 특징을 일일히 아는 것도 쉬운 일은 아닙니다. 그래서 우선 비슷한 녀석들끼리 묶어보는 시도를 해봅시다.

📂 분류 기준1. 객체 지향 지원 유무

첫 번째 분류 기준은 객체 지향입니다. 프로그래밍 접근 방식에는 여러 가지가 존재하는데 이에 따라 코드 자체가 완전히 달라집니다. 객체 지향은 프로그래밍의 여러 접근 방법 중 하나로 가장 지배적으로 사용되는 방식입니다.

Python, Java, Ruby, c++, c# 등이 대표적인 객체 지향 언어들이 있습니다. 이들 언어는 객체 지향 방식으로 작성될 것을 전제하여 모든 문법과 도구를 만들었습니다. 따라서, 이들 언어를 사용하다 보면 객체 지향에 대해 알지 못해도 은연 중에 객체 지향 방식으로 코드를 작성하게 됩니다.

객체 지향 방식이 지배적이라면 다른 접근 방식을 지향하는 언어는 모두 나쁜 언어들일까요? 그렇지 않습니다. 절차 지향 방식의 경우 객체 지향 방식보다 실행 속도가 더 빠릅니다. 대표적으로 C언어 같은 경우 객체 지향 방식은 아니지만 반드시 필요한 경우가 있어 아직까지도 꾸준히 사용되고 있습니다.

이렇게 객체 지향 지원 여부에 따라 프로그래밍 언어를 분류하기도 합니다. 각자 장단점이 있어 만들고자 하는 프로그램과 일하고자 하는 분야에 따라 적합한 언어를 선택하면 됩니다.

객체 지향 프로그래밍은 어떻게 나타났을까요? 인스타그램의 사례로 알아보겠습니다. 기존의 개발 방식은 기능을 기준으로 분업하였습니다. 예컨대, 좋아요 기능 만드는 사람, 댓글 기능 만드는 사람, 사진 업로드 기능 만드는 사람이 따로 있었던 것이죠. 이렇게 전체를 부분으로 나누어 만든 다음 그 기능을 서로 모아 하나의 프로그램을 만들었습니다. 이러한 방식을 Top-down이라고 합니다.

그러나 이 방식에는 큰 문제가 있었습니다. 부분을 모아 전체를 만들어야 하기 때문에 미완성된 부분이 있으면 전체 프로그램을 실행할 수 없었습니다. 더 큰 문제는 모든 데이터에서 필요한 데이터를 파라미터로 추출해서 사용하기 때문에 하나의 기능에서 오류가 나서 이를 수정하려고 하면 전체적 관계에 의해 다른 기능들도 영향을 받는 것이었죠. 한 마디로 실수 하나가 매우 치명적인 방식이었습니다.

따라서, 개발자들은 좀 더 효율적인 방법을 고안해냈습니다. 모든 데이터를 활용하는 것이 아니라 함수를 나누고 그에 맞는 데이터를 나눈 뒤 이들을 서로 묶는 방식으로 일을 진행한 것입니다. 이때, 이 묶음은 하나의 의미 있는 단위 객체(Object)라고 부릅니다. 이 객체라는 개념을 적용해서 프로그램을 만든다 하여 객체 지향 프로그래밍이라고 하는 것입니다. 객체 지향 방식은 작은 것으로부터 큰 것을 만든다는 점에서 Bottom-Up 방식으로 불립니다.

인스타그램에 다시 한 번 적용해볼까요? 이번에는 기능이 아니라 사용자, 게시글 등으로 객체를 나누고 이와 관련된 데이터와 함수 아이디 데이터와 로그인 기능, 텍스트 내용 데이터와 게시글 업로드 기능 등으로 개발을 진행합니다. 이러한 방식으로 분류하게 되면 객체에 따라 필요한 데이터가 달라져 직관적으로 기능을 확인할 수 있고 하나하나 동작을 실험해 보기도 용이합니다. 당연히 오류를 수정하기에도 훨씬 편리하겠죠.

그렇다면 객체 지향 방식의 단점은 무엇일까요? 의미 있는 단위로 분류하는 것은 쉬운 일이 아닙니다. 사람에 따라 의미 있음에 대한 정의가 다르기 때문입니다. 따라서, 코드를 작성하기 전 설계 과정부터 어려움을 겪습니다. 또한, 사람이 이해하기 편한 방식은 늘 컴퓨터 입장에서는 불편함이 생깁니다. 컴퓨터가 이해하는 시간이 필요한 것이죠. 따라서, 실행 속도가 느려지거나 저장 공간을 많이 차지하기도 합니다.

객체 지향 언어를 사용하면 좋은 경우가 있습니다. 많은 데이터를 다루는 프로그램이나 규모가 큰 프로젝트는 객체 지향 방식의 장점이 부각됩니다. 반면, 극도로 빠른 실행 속도가 필요한 분야나 저장 장치가 협소한 분야, 대표적으로 스마트 가전에서 돌아가는 프로그램을 만들 때는 객체 지향 언어가 적합하지 않습니다.

📂 분류 기준2. 변수의 데이터 타입

앞서 Python, Java, C의 코드의 예시를 봤습니다. Python 코드에 비해 Java와 C의 코드가 조금 더 복잡했던 것이 기억나시나요? 이들이 좀 더 복잡해 보이는 이유는 변수명 앞에 있는 자료형 때문입니다. 자료형은 변수의 데이터 타입을 지정해주는 역할을 합니다. 만약 숫자 자료형을 지정해줬는데 문자열을 넣으면 오류가 납니다. Python의 경우 따로 자료형을 적지 않기 때문에 변수에 어떤 데이터 타입을 넣든 상관이 없습니다.

함수의 경우에도 차이가 납니다.

Python

def print_sum(a, b):

Java

public void print_sum(int a, int b) {}

Python과 Ruby 같은 언어는 간단함과 편리함을 추구합니다. 최대한 코드를 짧고 간편하게 만들었죠. 레고의 경우를 생각해 볼까요? 연결 부분이 모두 같기 때문에 어디에 붙여도 붙기는 붙습니다. 다만 이러한 특징 때문에 결과와 다른 모양이 되어도 우선 붙기는 했기 때문에 이상한 점을 알기 어렵습니다.

이에 비해 Java와 C는 복잡하고 불편해보입니다. 그럼에도 이들 언어가 이러한 복잡함을 유지하는 이유는 코드를 정밀하게 만들기 위해서입니다. 명품 시계를 떠올려 봅시다. 명품 시계의 톱니는 복잡하고 정교하게 얽혀있습니다. 복잡한 만큼 정확하게 기능하죠. 완벽한 조립을 전제하기 때문에 제약이 많으나 그 제약만큼 오류의 발생도 매우 적습니다. 일종의 안전 장치가 되는 셈이죠. 이러한 정확성 때문에 컴퓨터가 오류를 발견하는 것도 매우 쉽습니다. 따라서, 개발자는 프로그램이 잘 돌아가는 것만으로 코드에 오류가 없다고 확신할 수 있습니다.

Python과 Ruby 같은 언어를 Dynamic Typing 언어라고 합니다. 이 언어는 컴퓨터적 구조를 생략하여 문법이 간결하고 편리하며 어려운 표현이 적어서 코드의 내용과 로직이 잘 이해된다는 장점이 있습니다. 따라서, 비전공자들이 작은 사이즈의 프로그램을 만들기 위해서 자주 사용합니다. 하지만 컴퓨터적 구조가 생략된만큼 컴퓨터가 판단하는 시간이 필요해서 실행 속도가 느린 편이라 속도에 민감하지 않은 작업에 적합합니다. Java Script와 php 등도 Dynamic Typing에 속합니다.

반대로, Java와 C 같은 언어를 Static Typing 언어라고 합니다. 이 언어는 자료형을 먼저 지정해주는데 그만큼 컴퓨터의 입장을 좀 더 고려한다고 볼 수 있습니다. 명확하고 정교함을 추구합니다. 제약이 많지만 실수를 방지하고 더 체계적으로 코드를 작성할 수 있습니다. 따라서, 많은 사람이 협업하는 규모가 큰 프로젝트나 실행 속도가 민감한 분야에 적합합니다. 예를 들어, 임베디드, 실시간 투자, 인공지능 분야 등이 있겠네요. C++과 Kotlin 등도 Static Typing에 속합니다.

* 이 자료는 CODEIT의 컴퓨터 개론 강의를 참고하여 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글