본문 바로가기
카테고리 없음

정보처리기사 필기 - 프로그래밍 언어 활용

by kik328288 2026. 5. 2.

프로그래밍 언어 분류와 패러다임 정리

오늘날 사용되는 프로그래밍 언어는 그 수만 해도 수백 가지에 이르며, 각각이 서로 다른 철학과 강점을 가지고 있다. 한 개발자가 모든 언어를 능숙하게 다룰 수는 없지만, 언어들을 어떤 기준으로 분류하고 어떤 패러다임으로 묶을 수 있는지를 이해하면 새로운 언어를 학습하는 속도가 비약적으로 빨라진다. 정보처리기사 필기 4과목 프로그래밍 언어 활용에서도 언어의 세대 구분, 패러다임 분류, 그리고 실행 방식인 컴파일러와 인터프리터의 차이는 매회 출제되는 핵심 주제이다. 본 글에서는 이 세 가지 기본 골격을 중심으로 프로그래밍 언어 전체를 조망할 수 있는 사고의 틀을 정리한다.

 

프로그래밍 언어의 분류와 세대

프로그래밍 언어는 추상화 수준에 따라 크게 저급 언어(Low-level Language)와 고급 언어(High-level Language)로 구분된다. 저급 언어는 컴퓨터가 직접 이해할 수 있는 형태에 가까운 언어를 의미하며, 기계어와 어셈블리어가 여기에 속한다. 반대로 고급 언어는 인간이 이해하기 쉬운 자연어에 가까운 형태로 작성되며, C·Java·Python처럼 우리가 일상적으로 만나는 대부분의 언어가 이에 해당한다. 추상화 수준이 높아질수록 작성과 유지보수가 쉬워지지만, 그만큼 컴파일러나 인터프리터를 통한 변환 과정이 필요해진다.

세대별 분류는 언어의 발전 흐름을 시간 순서로 정리한 분류 체계이다. 1세대(1GL)는 0과 1로만 구성된 기계어로, CPU가 직접 실행할 수 있지만 인간이 작성하기에는 거의 불가능에 가깝다. 2세대(2GL)는 어셈블리어로, 기계어의 명령을 사람이 읽을 수 있는 단어인 니모닉(MOV, ADD, JMP 등)으로 대체한 형태이다. 하드웨어와의 직접적 상호작용이 필요한 임베디드 영역이나 운영체제 커널의 일부에서 여전히 사용된다. 3세대(3GL)는 C·C++·Java·Python처럼 우리가 흔히 떠올리는 범용 고급 언어들이다. 절차형, 객체지향, 함수형 등 다양한 패러다임을 표현할 수 있으며, 현대 소프트웨어 개발의 주류이다.

4세대(4GL)는 특정 도메인에 특화된 비절차적 언어로, 무엇을 할 것인지를 선언하는 형태에 가깝다. 데이터베이스 조회를 위한 SQL, 통계 분석을 위한 R, 수치 계산을 위한 MATLAB이 대표적이다. 사용자가 알고리즘을 직접 기술하지 않아도 도메인의 문제를 효율적으로 해결할 수 있다는 점이 특징이다. 5세대(5GL)는 인공지능 분야에서 등장한 언어들로, 논리 프로그래밍 기반의 Prolog와 LISP, 그리고 시각적 프로그래밍 도구들이 포함된다. 사용자는 풀고자 하는 문제와 제약 조건만 명시하면, 시스템이 추론을 통해 해를 찾아내는 방식으로 동작한다. 다만 5세대 언어는 범용성보다는 전문 영역에 집중되어 있어 일반 개발 현장에서는 비교적 드물게 사용된다.

프로그래밍 패러다임 4가지

프로그래밍 패러다임이란 프로그램을 작성하는 근본적인 사고방식과 스타일을 의미한다. 같은 문제라도 어떤 패러다임을 채택하느냐에 따라 코드의 구조와 표현 방식이 완전히 달라지며, 현대의 주요 패러다임은 크게 절차형, 객체지향, 함수형, 선언형의 네 가지로 정리된다. 각 패러다임은 서로 배타적이지 않으며, 최근의 언어들은 여러 패러다임을 동시에 지원하는 멀티패러다임 형태로 진화하고 있다.

절차형 프로그래밍(Procedural Programming)은 프로그램을 일련의 절차, 즉 함수와 프로시저의 호출로 구성하는 패러다임이다. 명령형 프로그래밍의 한 형태이며, C 언어가 가장 대표적인 예시이다. 위에서 아래로 흐르는 명령의 실행 순서가 명확하기 때문에 학습이 쉽고 성능도 우수하지만, 프로그램 규모가 커지면 코드가 복잡해지고 데이터와 로직이 분리되어 유지보수가 어려워진다는 단점이 있다. 객체지향 프로그래밍(Object-Oriented Programming)은 데이터와 그 데이터를 다루는 함수를 객체라는 단위로 묶어 관리하는 패러다임이다. 캡슐화, 상속, 다형성, 추상화라는 네 가지 핵심 특성을 통해 코드의 재사용성과 확장성을 극적으로 향상시킨다. Java, C++, Python, C#이 대표적이며, 대규모 시스템 개발에서 사실상의 표준으로 자리 잡고 있다.

함수형 프로그래밍(Functional Programming)은 순수 함수의 조합을 통해 프로그램을 구성하며, 부수 효과(Side Effect)와 변경 가능한 상태를 최소화하는 것을 핵심 원칙으로 삼는다. 같은 입력에 대해 항상 같은 출력을 보장하는 순수 함수의 특성은 병렬 처리와 테스트 용이성에서 큰 이점을 제공한다. Haskell·Erlang이 순수 함수형 언어이며, Scala·Kotlin·JavaScript도 함수형 스타일을 폭넓게 지원한다. 선언형 프로그래밍(Declarative Programming)은 무엇을 할 것인지를 기술하되 어떻게 할 것인지는 시스템에 위임하는 패러다임이다. SQL이 가장 친숙한 예시로, "어떤 데이터를 가져오라"라고 선언하면 데이터베이스 엔진이 실행 계획을 세워 실제 작업을 수행한다. 함수형 프로그래밍도 넓은 의미에서는 선언형의 한 갈래로 분류되기도 한다.

컴파일러와 인터프리터의 차이

소스 코드를 작성한 뒤에는 그것을 컴퓨터가 실제로 실행할 수 있는 형태로 변환해야 한다. 이때 사용하는 두 가지 핵심 도구가 컴파일러와 인터프리터이며, 두 방식은 작동 원리와 성능 특성에서 뚜렷한 차이를 보인다. 어떤 언어가 어떤 방식을 채택하는지에 따라 개발 경험과 실행 성능이 크게 달라지기 때문에, 두 개념을 정확히 구분해 이해하는 것이 매우 중요하다.

컴파일러(Compiler)는 작성된 소스 코드 전체를 한 번에 분석해 기계어 또는 그에 준하는 중간 코드로 변환하는 방식이다. C·C++·Go·Rust가 대표적인 컴파일 언어이며, 변환 과정에서 문법 오류와 타입 오류를 사전에 모두 검출한다는 장점이 있다. 컴파일이 완료된 결과물은 운영체제 위에서 직접 실행되기 때문에 실행 속도가 매우 빠르며, 같은 코드를 반복 실행할 때 추가적인 변환 비용이 들지 않는다. 다만 코드를 한 번 수정할 때마다 전체를 다시 컴파일해야 하므로 개발 사이클이 다소 느려지고, 운영체제나 CPU 아키텍처가 다르면 다시 컴파일해야 한다는 이식성의 제약이 존재한다.

인터프리터(Interpreter)는 소스 코드를 한 줄씩 해석하면서 즉시 실행하는 방식이다. Python·JavaScript·Ruby가 대표적인 인터프리터 언어이며, 별도의 빌드 단계 없이 바로 실행할 수 있어 개발 및 디버깅이 빠르고 직관적이다. 또한 인터프리터만 설치되어 있다면 어떤 운영체제에서도 동일한 코드를 실행할 수 있어 이식성이 뛰어나다. 그러나 매 실행마다 코드 해석을 반복하기 때문에 컴파일 언어에 비해 실행 속도가 느리고, 런타임에 도달해야만 발견되는 오류들이 존재한다는 단점이 있다.

최근에는 두 방식의 장점을 결합한 하이브리드 형태가 주류로 자리 잡고 있다. Java가 가장 대표적인 예시로, 소스 코드를 우선 자바 바이트코드(.class)로 컴파일한 뒤, 이 바이트코드를 자바 가상 머신(JVM) 위의 인터프리터가 실행하는 구조이다. 여기에 자주 실행되는 코드 영역은 JIT(Just-In-Time) 컴파일러가 실행 시점에 기계어로 변환해주기 때문에, 이식성과 성능이라는 두 마리 토끼를 동시에 잡는다. C#의 .NET 런타임, Python의 PyPy, JavaScript의 V8 엔진도 모두 유사한 JIT 기반 하이브리드 구조를 채택하고 있다. 이러한 흐름은 단일 방식에 갇히지 않고, 상황에 따라 최적의 변환 전략을 선택하는 현대 언어 설계의 보편적 경향을 잘 보여준다.


메타 디스크립션: 프로그래밍 언어의 세대별 분류(1GL~5GL), 4대 패러다임(절차형·객체지향·함수형·선언형), 그리고 컴파일러와 인터프리터의 작동 차이를 정보처리기사 출제 기준에 맞춰 정리합니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름