컴퓨터 사이언스 (CS)/자료구조 및 알고리즘

01. 프로그래밍 언어 이해하기

한소희DE 2021. 6. 2. 00:18
무엇이든, 기본이 제일 중요하다. 기본 개념을 제대로 숙지하고 있어야, 새로운 개념을 소화하는 데에 어려움이 없다고 믿는다.

따라서 CS기초지식부터 심화개념까지, 다시 한 번 되짚어보고자 한다. 오늘은 기본적인 프로그래밍 언어를 이해해보고, 분류 기준은 어떻게 정의할 수 있을지 탐색해 볼 것이다.

 

 

목차

프로그램과 프로그래밍 언어

프로그래밍 언어의 분류 기준

프로그래밍 언어의 흐름

 


 

01. 프로그램과 프로그래밍 언어

 

음식점을 갔을 때를 떠올려보자. 우리가 키오스크를 통해 주문을 했을 때, 주문서는 주방장에게로 향한다. 주방장은 그 주문서를 읽고 '내가 명령한 주문서'대로 조리를 행한다.

 

여기에서, 컴퓨터는 주방장을 / 프로그램은 키오스크 주문서를 / 프로그래밍언어는 주문서에 적힌 언어종류를 뜻한다.

즉, 프로그램은 '컴퓨터가 할 일을 순서대로 보여주는 일종의 설명서'이며, 그 설명서에 적힌 '언어'가 바로 프로그래밍 언어다.

 

프로그래밍 언어는 루비, 자바, C++, 파이썬 등 매우 다양하다. 이러한 언어들은 일종의 분류기준을 통해 범주화가 가능하다고 한다.

 

따라서 오늘은 '어떤 기준을 통해 프로그래밍 언어가 분류되는지' 살펴볼 것이다.

 

 


 

02. 프로그래밍 언어의 분류 기준

 

2-1. 객체 지향 여부

 

* 객체지향 언어: 루비 / 파이썬/ C# / 자바 등
* 비객체지향 언어: C언어 등

 

객체 지향 여부에 따라, 프로그램밍 언어가 구분된다.

이를 정확히 이해하기 위해, 객체지향이 무엇인지 살펴보자.

 

객체 지향이란?

컴퓨터 프로그래밍 패러다임 중 하나로, 로직을 상태와 행위로 이뤄진 객체로 만드는 방법이다.

 

객체지향이 나오기 전, 보편적 개발 환경은 탑다운(Top-Down, 큰 업무를 쪼개어 각자 업무를 처리) 방식으로 이뤄졌다. 즉, 기능(함수) 별로 개발을 분담했다는 의미다. 따라서, 각 기능마다 중첩되는 데이터가 존재하는 병렬적 구조였기 때문에, 하나의 실수로 서비스 오류가 발생할 우려가 있었다.

 

따라서 이 복잡성을 해결하기 위해, '함수와 데이터를 하나로 묶어 업무를 쪼갠 것'이 바로 객체 지향이다.

※ 객체: 함수와 데이터가 쪼개진 단위

 

 

 

예를 들어, SNS를 만든다고 가정해보자.

 

이때 객체지향으로 역할을 분담할 땐, 사용자 객체를 맡은 사람이 '로그인 기능:ID PW 데이터, 친구추가 기능:자기소개 데이터' 등을 한 번에 관리/구현하게 된다.

 

이 방법은, 코드 이해, 오류 수정 및 테스트에 매우 강력하다.

 

왜냐하면 조금 더 의미있는 단위로 나눠졌기 때문이다. 그러나, 코드를 잘 나누기 위해 설계하는 과정이 복잡하며 시간이 많이 소요되기 때문에, 프로젝트 규모와 데이터의 양에 따라 객체지향 언어 사용 유무를 판단하는 것이 좋다.

 

또한 컴퓨터적 구조가 생략돼 실행속도가 낮고 저장 공간도 상대적으로 많이 차지하므로, 이는 임베디드 시스템에 적용하기 부적합하다.

 

 

 

2-2. 변수의 자료형 정의

프로그래밍 언어에서 변수의 자료형은, Dynamic(자료형을 미리 정하지 않고 실행될 때 지정되는 방법)Static(코드에서 미리 자료형을 정의하는 방법)으로 자료형 정의가 이뤄진다. 이 두 가지의 정의 방법에 따라, 우리는 언어를 범주화할 수 있다.

 

Dynamic typing Static typing
파이썬 / 루비 / JS / PHP 등 C / 자바 / C++ 등

 

우선적으로 Dynamic typing(이하 DT)에 대해 알아보자.

DT는 자료형을 미리 정하지 않고 실행되는 방법으로, run할 경우 컴퓨터가 자체적으로 자료형을 생각/판단한다.

 

따라서, 코드 자체가 비교적 간결하여 배우기 쉽고 코드를 짜는 속도가 비교적 빠르다. 그러나 컴퓨터적 구조가 생략되어 컴퓨터에 할당된 업무가 많아졌기 때문에, 실행속도가 비교적 느리다. 따라서 이는 소규모 프로젝트를 빠르게 구축해야 할 경우 사용하면 좋다.

 

 

그렇다면 Static typing(이하 ST)는 무엇일까?

ST는 코드를 짤 때 자료형을 일일이 미리 지정하는 것을 말한다. (DT의 반대개념이라고 생각하면 쉽다.)

 

이는 명확하고 정교하기 때문에 코딩 구조의 가시성이 높으며, 제약을 일일이 걸기 때문에 실수를 미연에 방지할 수 있다.

 

그러나, 상대적으로 코드를 많이 짜야 해서 코딩 속도는 느릴 수 밖에 없다. 또한 배우기가 어렵다. 그럼에도 불구하고 코드가 체계적이어 실행 속도가 비교적 빠르기 때문에, 여러사람이 협업하는 대규모(or 대용량) 프로젝트 시 적합하다는 특징이 있다.

 

 

 

2-3. 언어의 수준

프로그래밍 언어는 '인간에게 가까울수록' 고수준 언어(High Level), '컴퓨터에 가까울수록' 저수준 언어(Low Level)로 일컫는다.

 

고수준언어 저수준언어
루비 / 파이썬 등 자바 / C 등

고수준 언어일 수록, 추상화의 정도는 높아진다. 여기에서의 추상화란, 몰라도 되는 것 혹은 직관적으로 알 수 있는 것은 코드에 드러내지 않는다는 것을 의미한다. (예: 자료형, 시작점(main) 등)

 

고수준 언어는 (컴퓨터적 구조가 생략되었기 때문에) 컴퓨터가 생각하고 행동해야 하는 경우가 존재한다. 따라서 컴퓨터성능의 영향을 받으며 대용량 실시간 데이터를 활용하는 프로젝트의 경우 부적합할 수 있다.

 

그러나 저수준 언어는, 임베디드 시스템에 적용이 가능하며 각종 실시간 데이터 처리 시스템 등에서도 유용히 사용된다고 한다.

 

 


 

 

03. 프로그래밍 언어의 흐름

위의 기준 중 보통 1번(객체지향)과 2번(자료형)을 중심으로 언어를 3가지로 분류한다. 언어는 크게 '자세한 언어 / 체계적인 언어 / 쉬운 언어' 세 가지 언어로 분리된다.

 

  • 자세한 언어: 객체지향 프로그래밍이 아닌 언어. 코드 작성은 매우 힘들지만 성능이 안 좋은 PC나 임베디드 시스템에서 용이
  • 체계적인 언어: '자세한 언어' 와는 달리, 객체지향 적용.
  • 쉬운 언어: 진입장벽이 비교적 낮고, 수행 자체가 간편. 비교적 느린 PC 실행 속도

 

구분객체지향 여부 Typing 종류언어

자세한 언어 객체지향 X Static Typing 어셈블리 언어, C 언어
체계적인 언어 객체지향 O Static Typing 자바, C++
쉬 언어 객체지향 O Dynamic Typing 파이썬, 루비

 

이처럼, 언어는 어떠한 기준들에 의해 분류가 되며, 프로젝트의 규모 & 데이터의 특성 & 협업의 정도 & 기기의 성능 & 임베디드 여부 등 다양한 조건을 고려하여 언어를 택해야 한다.

 

 

 

프로그래밍 언어를 공부해보며 -

배움은 끝이 없다는 것을 다시 한 번 느꼈다... 더욱 효과적인 협업 프로젝트 수행을 위해서, 체계적인 언어도 익혀야 할 필요성을 느꼈다.

얼른 파이썬 마스터하고, 자바도 공부해야겠다.