컴퓨터는 기계가 직접 이해하는 명령만 실행할 수 있지만, 사람은 문제를 더 이해하기 쉬운 형태로 표현하기 위해 다양한 프로그래밍 언어를 사용합니다. 프로그래밍 언어는 하드웨어와 가까운 정도, 번역 방식, 사용 목적과 문제 해결 관점에 따라 여러 종류로 구분할 수 있습니다.
이 장에서는 프로그래밍 언어의 종류를 저급 언어와 고급 언어로 나누어 기계어·어셈블리어와 주요 고급 언어의 특징을 정리합니다. 이어서 객체지향 프로그래밍의 객체·클래스·메시지와 캡슐화·추상화·상속의 의미를 예시로 살펴봅니다.
이 장의 핵심 내용
- 저급 언어는 하드웨어의 명령 체계와 가깝고 기계 의존성이 높습니다.
- 기계어는 컴퓨터가 직접 실행하는 이진 명령이며 별도의 번역 과정이 필요하지 않습니다.
- 어셈블리어는 기계 명령을 기호와 니모닉으로 표현하며 어셈블러가 기계어로 번역합니다.
- 고급 언어는 사람이 문제와 알고리즘을 표현하기 쉽도록 추상화 수준을 높인 언어입니다.
- 고급 언어의 소스 코드는 컴파일러나 인터프리터 등의 번역 과정을 거쳐 실행됩니다.
- 고급 언어는 일반적으로 작성·이해·유지보수가 쉽고 다른 환경으로 옮기기 유리합니다.
- FORTRAN·COBOL·LISP·BASIC·Pascal·C·Java 등은 목적과 설계 철학이 서로 다릅니다.
- 객체지향 프로그래밍은 데이터와 동작을 객체 단위로 모델링합니다.
- 객체는 상태와 행동을 가지며, 클래스는 유사한 객체를 만들기 위한 공통 설계입니다.
- 객체지향의 주요 특징은 캡슐화·추상화·상속이며 재사용성과 유지보수성을 높이는 데 활용됩니다.
프로그래밍 언어는 어떤 기준으로 구분하는가?
프로그래밍 언어는 하나의 기준으로만 구분되지 않습니다. 시험에서는 주로 하드웨어와 가까운 정도에 따라 저급 언어와 고급 언어를 구분하고, 객체지향 언어의 구성요소와 특징을 함께 묻습니다.
| 분류 기준 | 대표 구분 | 핵심 질문 |
|---|---|---|
| 추상화 수준 | 저급 언어·고급 언어 | 하드웨어의 명령 체계와 얼마나 가까운가? |
| 실행 방식 | 컴파일 방식·인터프리트 방식·혼합 방식 | 소스 코드를 어떤 과정으로 실행하는가? |
| 프로그래밍 패러다임 | 절차적·객체지향·함수형·논리형 | 문제와 프로그램을 어떤 관점으로 구성하는가? |
| 사용 목적 | 범용 언어·특수 목적 언어 | 어떤 문제 영역을 주로 해결하는가? |
저급 언어는 왜 기계 중심 언어라고 하는가?
저급 언어(Low-Level Language)는 컴퓨터의 명령어 집합과 메모리 구조에 가까운 언어입니다. 하드웨어를 세밀하게 제어할 수 있고 번역 결과가 기계 명령과 밀접하지만, 특정 프로세서와 시스템 구조에 의존하는 정도가 큽니다.
- 하드웨어의 레지스터·메모리·명령어를 직접 다루기 쉽습니다.
- 기계 구조에 맞춰 세밀하게 최적화할 수 있습니다.
- 다른 명령어 집합을 사용하는 기계로 옮기려면 코드를 수정하거나 다시 작성해야 할 수 있습니다.
- 프로그램 작성과 오류 분석에 하드웨어 지식이 많이 필요합니다.
기계어
- 0과 1의 비트 패턴으로 구성됩니다.
- CPU가 직접 해석하고 실행합니다.
- 별도의 번역기가 필요하지 않습니다.
- 기종별 명령어 형식과 코드가 다릅니다.
- 사람이 작성하고 유지보수하기 어렵습니다.
어셈블리어
- 기계 명령을 ADD·MOV 같은 니모닉으로 표현합니다.
- 기계어와 밀접하게 대응합니다.
- 어셈블러가 기계어로 번역합니다.
- 기계어보다 읽기 쉽지만 기계 의존성이 높습니다.
- 장치 제어·부트 코드·성능 핵심 구간 등에 활용될 수 있습니다.
| 비교 항목 | 기계어 | 어셈블리어 |
|---|---|---|
| 표현 | 이진 비트 패턴 | 기호 명령과 니모닉 |
| 번역기 | 필요 없음 | 어셈블러 |
| CPU와의 관계 | 직접 실행 | 기계 명령으로 번역 후 실행 |
| 가독성 | 매우 낮음 | 기계어보다 높음 |
| 기계 의존성 | 매우 높음 | 높음 |
| 유지보수 | 매우 어려움 | 고급 언어보다 어려움 |
용어 주의: 어셈블리어는 기계어 그 자체가 아니라 기계 명령을 사람이 다루기 쉬운 기호로 표현한 언어입니다.
고급 언어는 왜 사람 중심 언어라고 하는가?
고급 언어(High-Level Language)는 특정 기계의 세부 명령보다 문제 해결 절차·자료 구조·업무 규칙을 표현하는 데 초점을 둔 언어입니다. 하나의 고급 언어 문장은 번역 과정에서 여러 기계 명령으로 변환될 수 있습니다.
- 영어 단어·수식·구조화된 문법을 사용하여 프로그램의 의미를 이해하기 쉽습니다.
- 복잡한 하드웨어 동작을 변수·함수·객체 등의 추상화로 표현합니다.
- 컴파일러·인터프리터 또는 가상 머신과 같은 실행 환경이 필요합니다.
- 같은 소스 코드를 여러 환경에서 사용할 가능성이 높지만 완전한 호환성이 자동으로 보장되는 것은 아닙니다.
- 작성·시험·수정·유지보수와 협업에 유리합니다.
| 비교 항목 | 고급 언어 | 저급 언어 |
|---|---|---|
| 중심 | 사람과 문제 해결 | 기계와 하드웨어 |
| 추상화 수준 | 높음 | 낮음 |
| 작성·이해 | 상대적으로 쉬움 | 상대적으로 어려움 |
| 기계 의존성 | 상대적으로 낮음 | 높음 |
| 이식성 | 실행 환경이 제공되면 비교적 높음 | 낮음 |
| 하드웨어 제어 | 간접적이거나 제한적 | 직접적이고 세밀함 |
| 실행 효율 | 번역기와 구현에 따라 달라짐 | 세밀한 최적화가 가능함 |
| 유지보수 | 상대적으로 쉬움 | 상대적으로 어려움 |
실행 속도 주의: 고급 언어가 항상 느리고 저급 언어가 항상 빠른 것은 아닙니다. 실제 성능은 알고리즘, 컴파일러 최적화, 실행 환경과 작성한 코드에 따라 달라집니다.
주요 고급 언어에는 어떤 것이 있는가?
고급 언어는 개발 시기와 목적에 따라 서로 다른 특징을 가집니다. 다음 표는 시험에서 구분할 수 있도록 대표 용도와 핵심 키워드로 정리한 것입니다.
| 언어 | 대표 성격·용도 | 시험에서 기억할 특징 |
|---|---|---|
| FORTRAN | 과학·공학·수치 계산 | 초기의 대표적인 고급 언어로 수치 계산과 과학 기술 분야에 널리 사용됨 |
| COBOL | 기업·행정 업무의 자료 처리 | 영어와 유사한 문장형 문법을 사용하며 업무용 데이터 처리에 강함 |
| ALGOL | 알고리즘 표현과 구조적 프로그래밍 | 현대 프로그래밍 언어의 블록 구조와 문법 발전에 큰 영향을 줌 |
| LISP | 리스트 처리·기호 처리 | 리스트 구조와 함수적 표현을 중심으로 하며 인공지능 연구에 역사적으로 활용됨 |
| APL | 배열 중심 수치 계산 | 간결한 기호를 사용해 배열과 수학 연산을 표현함 |
| PL/I | 과학 계산과 업무 처리를 아우르는 범용 언어 | FORTRAN과 COBOL 계열의 요구를 함께 다루려 한 언어 |
| BASIC | 교육과 입문 | 초보자가 쉽게 프로그래밍을 배우도록 설계됨 |
| SNOBOL | 문자열·패턴 처리 | 문자열 검색·대치·패턴 일치와 같은 문자 처리에 특화됨 |
| Pascal | 구조적 프로그래밍·교육 | 명확한 자료형과 구조를 강조하여 프로그래밍 교육에 널리 사용됨 |
| PROLOG | 논리 프로그래밍 | 사실과 규칙을 선언하고 논리적 추론으로 답을 구함 |
| Ada | 고신뢰성·실시간·임베디드 시스템 | 강한 자료형과 모듈화·동시성 기능을 제공하며 국방·항공 등에서 활용됨 |
| C | 범용·시스템 프로그래밍 | 고급 언어이지만 포인터와 메모리 접근 등 저수준 제어 기능을 제공함 |
| Java | 객체지향·플랫폼 독립 실행 환경 | 바이트코드와 JVM을 이용하며 클래스 중심 객체지향 프로그래밍을 지원함 |
수치·과학·공학
FORTRAN, APL, PL/I는 계산과 배열·수치 처리의 역사에서 중요한 언어입니다.
업무·자료 처리
COBOL은 기업과 행정의 대규모 업무 자료 처리 언어로 대표됩니다.
교육·구조적 프로그래밍
BASIC, Pascal, ALGOL은 입문 교육과 구조화된 알고리즘 표현에서 자주 언급됩니다.
기호·문자열·논리 처리
LISP, SNOBOL, PROLOG는 각각 리스트, 문자열 패턴, 논리 추론이라는 특징으로 구분합니다.
C 언어 분류: C는 공식적으로 고급 프로그래밍 언어로 분류되지만 하드웨어와 메모리를 세밀하게 다룰 수 있어 ‘중급 언어’처럼 설명되기도 합니다. 시험에서는 시스템 프로그래밍에 적합한 언어라는 특징을 함께 기억합니다.
객체지향 프로그래밍은 무엇인가?
객체지향 프로그래밍(Object-Oriented Programming)은 현실 세계나 문제 영역의 대상을 객체로 모델링하고, 각 객체의 상태와 행동 및 객체 사이의 상호작용으로 프로그램을 구성하는 방식입니다.
절차적 프로그래밍이 처리 순서와 함수를 중심으로 프로그램을 나누는 경향이 있다면, 객체지향 프로그래밍은 데이터와 그 데이터를 처리하는 동작을 객체 단위로 묶어 표현합니다.
| 비교 항목 | 절차적 관점 | 객체지향 관점 |
|---|---|---|
| 중심 요소 | 함수·프로시저와 처리 순서 | 객체와 객체 사이의 협력 |
| 데이터와 처리 | 데이터와 처리 절차를 분리하는 경향 | 상태와 행동을 객체 안에 함께 구성 |
| 설계 관점 | 작업을 어떤 순서로 수행하는가 | 어떤 객체가 어떤 책임을 가지는가 |
| 재사용 | 함수·모듈 단위 재사용 | 클래스·상속·구성 등을 통한 재사용 |
| 대표 언어 | C, Pascal 등 | Smalltalk, C++, Java, Ada 등 |
- 현실의 대상을 객체 단위로 나누어 이해하기 쉽습니다.
- 객체가 담당하는 책임을 분리하여 변경 범위를 줄일 수 있습니다.
- 검증된 클래스와 컴포넌트를 재사용할 수 있습니다.
- 대규모 프로그램의 구조화와 유지보수에 유리할 수 있습니다.
주의: 객체지향 언어를 사용한다고 해서 프로그램이 자동으로 이해하기 쉽거나 재사용 가능해지는 것은 아닙니다. 객체의 책임과 관계를 적절하게 설계해야 장점을 얻을 수 있습니다.
객체·클래스·메시지는 어떻게 연결되는가?
| 구성요소 | 의미 | 계좌 예시 |
|---|---|---|
| 객체 Object | 상태와 행동을 가지며 프로그램에서 구별되는 하나의 실체 | 특정 고객의 실제 계좌 객체 |
| 상태·속성 State·Attribute | 객체가 현재 가지고 있는 데이터 | 계좌번호, 예금주, 잔액 |
| 행동·메서드 Behavior·Method | 객체가 수행할 수 있는 연산 | 입금, 출금, 잔액 조회 |
| 클래스 Class | 유사한 객체가 공유하는 상태와 행동을 정의한 설계 | 계좌 객체를 만들기 위한 계좌 클래스 |
| 메시지 Message | 객체에 특정 행동을 요청하는 상호작용 | 계좌 객체에 출금 메서드 실행 요청 |
클래스: 계좌
- 공통 속성: 계좌번호, 예금주, 잔액
- 공통 메서드: 입금(), 출금(), 잔액조회()
- 여러 계좌 객체가 공유할 구조를 정의
객체: 김민수의 계좌
- 계좌번호: 100-01
- 예금주: 김민수
- 잔액: 500,000원
- 계좌 클래스의 구체적인 인스턴스
캡슐화·추상화·상속은 무엇인가?
객체지향 언어의 주요 특징으로 캡슐화, 추상화, 상속이 있습니다. 각 개념은 서로 관련되어 있지만 해결하려는 문제와 강조점이 다릅니다.
| 특징 | 핵심 의미 | 계좌 예시 | 주요 효과 |
|---|---|---|---|
| 캡슐화 Encapsulation | 데이터와 메서드를 하나의 객체로 묶고 내부 상태에 대한 직접 접근을 제한함 | 잔액을 외부에서 직접 바꾸지 못하게 하고 입금·출금 메서드로만 변경 | 정보 은닉, 무결성 보호, 변경 영향 감소 |
| 추상화 Abstraction | 불필요한 구현 세부사항은 숨기고 중요한 특성과 기능만 표현함 | 사용자는 은행 내부 처리 과정을 몰라도 입금·출금 기능을 사용 | 복잡성 감소, 핵심 역할에 집중 |
| 상속 Inheritance | 기존 클래스의 상태와 행동을 바탕으로 새로운 클래스를 정의함 | 계좌 클래스를 바탕으로 적금계좌·대출계좌 클래스를 정의 | 공통 기능 재사용, 계층적 분류와 확장 |
캡슐화는 무엇을 숨기는가?
객체 내부 데이터의 표현과 변경 방법을 감추고 공개된 메서드를 통해서만 안전하게 사용하도록 합니다.
추상화는 무엇을 남기는가?
대상을 사용하는 데 필요한 핵심 특징과 기능만 모델에 남기고 복잡한 구현 세부사항은 제거합니다.
상속은 무엇을 재사용하는가?
상위 클래스에 정의된 공통 상태와 행동을 하위 클래스가 이어받아 추가하거나 변경할 수 있게 합니다.
다형성은 어떻게 관련되는가?
객체지향에서는 같은 요청에 객체 종류별로 다른 동작을 수행하는 다형성도 함께 설명됩니다.
간단한 코드에서는 객체지향 특징이 어떻게 나타나는가?
다음 Java 예시는 계좌의 잔액을 외부에서 직접 바꾸지 못하게 하고 메서드를 통해서만 변경하도록 캡슐화한 뒤, 적금계좌가 계좌 클래스를 상속하도록 구성한 형태입니다.
class Account {
private int balance;
public void deposit(int amount) {
if (amount > 0) {
balance += amount;
}
}
public int getBalance() {
return balance;
}
}
class SavingsAccount extends Account {
private double interestRate;
}
balance를private으로 선언하여 외부의 직접 접근을 제한합니다.deposit()메서드가 잔액 변경 규칙을 담당합니다.SavingsAccount는Account를 상속하여 계좌의 공통 기능을 재사용합니다.- 실제 프로그램에서는 예외 처리와 금액 자료형, 동시성, 업무 규칙 등을 더 엄밀하게 설계해야 합니다.
시험에서 자주 혼동되는 개념
기계어와 어셈블리어
기계어는 CPU가 직접 실행하는 이진 명령이고, 어셈블리어는 이를 니모닉으로 표현하여 어셈블러로 번역하는 언어입니다.
저급 언어와 고급 언어
저급 언어는 하드웨어와 가깝고 기계 의존성이 높으며, 고급 언어는 사람과 문제 표현에 가깝고 추상화 수준이 높습니다.
객체와 클래스
클래스는 공통 구조와 행동을 정의한 설계이고, 객체는 해당 클래스를 바탕으로 생성된 구체적인 인스턴스입니다.
캡슐화와 추상화
캡슐화는 내부 데이터와 구현을 보호하는 방법이고, 추상화는 중요하지 않은 세부사항을 제거해 핵심만 표현하는 관점입니다.
C와 Java
C는 시스템 프로그래밍과 저수준 제어에 강한 고급 언어이고, Java는 JVM 기반의 클래스 중심 객체지향 언어입니다.
상속과 객체 재사용
상속은 기존 클래스의 공통 특성을 확장하는 방법이지만 모든 재사용을 상속으로 해결하는 것은 아니며 객체 구성도 활용됩니다.
이번 장 핵심 요약
- 프로그래밍 언어는 추상화 수준·실행 방식·패러다임·사용 목적에 따라 구분할 수 있습니다.
- 저급 언어는 하드웨어와 가까워 기계 의존성이 높고 세밀한 제어가 가능합니다.
- 기계어는 이진 명령으로 구성되어 CPU가 직접 실행합니다.
- 어셈블리어는 니모닉으로 명령을 표현하고 어셈블러가 기계어로 번역합니다.
- 고급 언어는 문제와 알고리즘을 사람이 이해하기 쉬운 형태로 표현합니다.
- 고급 언어는 컴파일러·인터프리터·가상 머신 등의 실행 환경을 필요로 합니다.
- 고급 언어의 이식성은 높을 수 있지만 운영체제·라이브러리·구현 차이에 영향을 받습니다.
- FORTRAN은 과학 계산, COBOL은 업무 처리, LISP는 리스트 처리, PROLOG는 논리 추론이 대표 특징입니다.
- C는 고급 언어이면서 시스템 프로그래밍에 필요한 저수준 접근 기능을 제공합니다.
- Java는 JVM 기반의 클래스 중심 객체지향 프로그래밍 언어입니다.
- 객체는 상태와 행동을 가지며 클래스는 객체의 공통 설계입니다.
- 메시지는 객체에 특정 행동을 요청하는 상호작용입니다.
- 캡슐화는 데이터와 메서드를 묶고 내부 접근을 제한합니다.
- 추상화는 불필요한 세부사항을 제거하고 핵심 특성과 기능에 집중합니다.
- 상속은 기존 클래스의 공통 상태와 행동을 이어받아 새로운 클래스를 정의합니다.
복습 문제
컴퓨터가 직접 이해하고 실행하는 0과 1의 명령으로 구성된 언어는?
기계어입니다.
기계 명령을 니모닉으로 표현하고 어셈블러로 번역하는 언어는?
어셈블리어입니다.
기계어와 어셈블리어를 함께 부르는 분류는?
저급 언어 또는 저수준 언어입니다.
사람이 이해하기 쉬운 표현을 사용하고 번역 과정을 거쳐 실행되는 언어는?
고급 언어입니다.
과학·공학의 수치 계산을 대표하는 초기 고급 언어는?
FORTRAN입니다.
기업과 행정의 업무 자료 처리를 대표하는 언어는?
COBOL입니다.
리스트 처리와 기호 처리에 강하고 인공지능 분야에서 역사적으로 활용된 언어는?
LISP입니다.
사실과 규칙을 기반으로 논리적 추론을 수행하는 언어는?
PROLOG입니다.
객체가 공통으로 가질 상태와 행동을 정의한 설계는?
클래스입니다.
클래스를 바탕으로 생성된 구체적인 실체는?
객체 또는 인스턴스입니다.
데이터와 메서드를 하나로 묶고 내부 구현에 대한 직접 접근을 제한하는 특징은?
캡슐화입니다.
불필요한 세부사항을 숨기고 중요한 특성과 기능만 표현하는 특징은?
추상화입니다.
상위 클래스의 상태와 행동을 하위 클래스가 이어받는 특징은?
상속입니다.
객체지향 언어에서 공통 속성과 행위의 집합을 의미하는 것은?
클래스입니다.
시스템 프로그래밍에 적합하고 포인터를 통해 저수준 메모리 접근을 지원하는 고급 언어는?
C 언어입니다.
참고자료
- 학습 범위 — 사무자동화산업기사 제2과목 프로그래밍 일반, 프로그래밍 언어의 종류·객체지향 프로그래밍
- Q-Net — 사무자동화산업기사 종목별 상세정보
- IEEE Std 610.12-1990 — Standard Glossary of Software Engineering Terminology
- GNU Binutils — GNU Assembler Statements
- Oracle Java Tutorials — Object-Oriented Programming Concepts
- Oracle Java Tutorials — What Is an Object?
- Oracle Java Tutorials — What Is a Class?
- Oracle Java Tutorials — What Is Inheritance?
- Ada Reference Manual — Introduction
이 글은 사무자동화산업기사 제2과목 프로그래밍 일반의 프로그래밍 언어 종류와 객체지향 프로그래밍 개념을 이해하고 복습할 수 있도록 재구성한 정리입니다. 언어의 분류와 활용 분야는 시대·구현·교재에 따라 다르게 설명될 수 있으며, 실제 시험에서는 문제에 제시된 정의와 최신 Q-Net 출제기준을 함께 확인해야 합니다.