기본 콘텐츠로 건너뛰기

방송대 프로그래밍언어론 1강: 프로그래밍 언어의 기능과 구성요소

0-썸네일-요약노트-프로그래밍언어론-1강

방송대 프로그래밍언어론 1강: 프로그래밍 언어의 기능과 구성요소

프로그램은 컴퓨터에 내리는 명령이면서 사람이 읽고 고치는 표현이기도 하다. 그래서 프로그래밍 언어는 실행만 되면 충분하지 않다. 의도를 쓰기 쉬워야 하고, 다른 사람이 이해할 수 있어야 하며, 기계가 정확히 처리할 수 있어야 한다. 이 글은 이 세 요구에서 출발해 언어의 구성요소와 학습 방법을 하나의 흐름으로 연결한다.

프로그래밍 언어는 두 독자를 동시에 만족시킨다

자연언어는 사람이 생각을 주고받는 의사소통 수단이다. 같은 문장도 상황과 억양에 따라 뜻이 달라질 수 있고, 일부가 생략되어도 상대가 맥락으로 보충한다. 반면 컴퓨터는 그러한 맥락을 임의로 짐작할 수 없다. 프로그램에 쓰인 표현은 정해진 규칙에 맞아야 하며, 실행할 동작도 분명해야 한다.

프로그램은 컴퓨터가 순서대로 실행할 명령을 컴퓨터가 이해할 수 있는 형태로 나타낸 것이다. 프로그래밍 언어는 계산 과정을 컴퓨터가 실행할 수 있고 사람이 읽을 수 있는 형태로 기술하는 방법이다. 이 정의에는 서로 다른 두 독자가 숨어 있다.

독자필요한 정보표현이 실패하는 경우
사람무엇을 계산하며 왜 그렇게 작성했는지 파악할 단서실행은 되지만 구조와 이름이 불명확해 수정하기 어려움
컴퓨터규칙에 맞는 형식과 모호하지 않은 실행 지시사람은 의도를 짐작하지만 문법이나 의미 규칙에 맞지 않아 실행할 수 없음

핵심 관점: 프로그래밍 언어는 사람의 의도를 프로그램이라는 표현으로 바꾸고, 그 표현을 컴퓨터의 실행으로 이어 주는 의사소통 수단이다. 사람과 컴퓨터 가운데 한쪽만 고려해서는 좋은 언어 표현이 되기 어렵다.

언어의 세 기능은 쓰기·읽기·실행으로 점검한다

강의에서 제시한 프로그래밍 언어의 주된 기능은 작성력, 가독성, 실행 가능성이다. 세 기능은 서로 대신할 수 있는 선택지가 아니라, 프로그램이 실제로 쓰이는 전 과정에서 함께 요구되는 기준이다.

기능점검 질문의미
작성력프로그래머가 계산 의도를 자연스럽게 표현할 수 있는가?문제 해결 절차를 지나치게 우회하지 않고 프로그램으로 옮길 수 있는 능력
가독성작성자와 다른 사람도 표현의 뜻과 구조를 이해할 수 있는가?검토·수정·협업 과정에서 프로그램을 읽고 추론하기 쉬운 정도
실행 가능성표현된 명령을 컴퓨터가 실제 동작으로 옮길 수 있는가?언어 규칙에 따라 프로그램이 기계에서 처리될 수 있는 성질

짧은 코드가 반드시 가독성이 높은 것은 아니다. 여러 동작을 한 줄에 압축하면 작성량은 줄어도 실행 순서를 파악하기 어려울 수 있다. 반대로 설명이 길다고 작성력이 높은 것도 아니다. 핵심은 문제의 구조가 언어의 표현 안에 얼마나 분명하게 드러나는가이다.

오개념 교정: ‘컴파일되거나 실행되면 좋은 프로그램’이라는 판단은 실행 가능성만 확인한 것이다. 유지보수와 협업을 고려하면 작성력과 가독성도 별도로 점검해야 한다.

추상화와 모듈화는 복잡성을 다루는 보조 기능이다

추상화는 세부 내용을 모두 드러내지 않고 지금 필요한 핵심만 나타내는 기능이다. 예를 들어 값을 출력할 때 화면 장치를 직접 제어하는 모든 절차를 작성하지 않고, 출력 기능의 이름을 호출할 수 있다. 사용자는 ‘무엇을 할지’에 집중하고 내부의 세부 구현은 감출 수 있다.

모듈화는 복잡한 대상을 독립적으로 다룰 수 있는 부분으로 나누는 기능이다. 입력, 계산, 출력 기능을 분리하면 각 부분을 따로 이해하고 시험하거나 교체하기 쉬워진다. 추상화가 세부를 감추어 관점을 단순화한다면, 모듈화는 전체를 경계가 있는 부분으로 나누어 관리한다.

  • 추상화 질문: 이 기능을 사용하는 사람이 반드시 알아야 할 정보는 무엇인가?
  • 모듈화 질문: 서로 독립적으로 이해하고 변경할 수 있도록 어디에서 경계를 나눌 것인가?

언어의 추상화 수준은 사람의 요구와 기계의 제약 사이에 놓인다

프로그래머는 문제에 가까운 표현을 원하고, 컴퓨터는 자신의 구조에 맞는 동작을 요구한다. 프로그래밍 언어는 이 두 요구 사이의 언어 스펙트럼에 놓인다. 추상화 수준이 낮을수록 기계 구조와 가깝고, 높을수록 사람이 다루는 문제와 가까운 표현을 제공한다.

구분기계 의존성실행 조건강의의 예
저급 언어특정 기계의 구조와 밀접함기계가 직접 처리하거나 기계 명령으로 옮김기계어, 어셈블리어
고급 언어기계의 세부 구조에서 비교적 독립적임번역 과정을 거쳐 실행함C, Java, Python

‘고급’은 무조건 우수하고 ‘저급’은 열등하다는 평가가 아니다. 추상화 수준과 기계 의존성이 다르다는 분류다. 하드웨어를 세밀하게 제어해야 하는지, 문제의 개념을 빠르게 표현해야 하는지에 따라 필요한 위치가 달라진다.

여섯 구성요소는 값에서 프로그램 경계까지 확장된다

프로그래밍 언어의 구성요소는 서로 떨어진 암기 항목이 아니다. 값을 준비하고, 값을 처리하고, 처리 순서를 표현하며, 반복되는 처리를 이름 붙이고, 허용되는 연산을 제한하고, 관련 요소를 독립된 단위로 묶는 단계로 연결된다.

구성요소역할확인할 질문
데이터수, 문자, 멀티미디어 등 프로그램이 다룰 값을 표현함무엇을 저장하고 처리하는가?
연산입력 데이터를 처리하여 새로운 결과를 만듦값을 어떻게 바꾸거나 결합하는가?
명령어조건 판단이나 반복처럼 수행할 동작을 지시함어떤 순서와 조건으로 처리하는가?
서브프로그램작은 코드 묶음에 이름을 붙여 호출하게 함재사용할 처리를 어떤 단위로 묶는가?
타입데이터의 집합과 그 데이터에 허용되는 연산을 함께 정함이 값에 이 연산을 적용해도 안전한가?
모듈데이터·함수·타입 등을 독립된 이름공간과 경계로 묶음프로그램의 어느 부분을 독립적으로 관리할 것인가?

연산은 언어가 기본으로 제공하는 원시 연산자, 프로그래머가 작성한 사용자 정의 연산자, 자주 쓰는 연산을 미리 모아 둔 라이브러리로 살펴볼 수 있다. 서브프로그램 가운데 함수는 입력을 받아 결과를 돌려주는 계산으로 이해할 수 있고, 프로시저는 결과값 반환을 중심으로 하지 않는 수행 단위로 구분할 수 있다.

하나의 코드를 세 번 읽으면 구성요소의 연결이 보인다

다음은 학습을 위해 직접 구성한 짧은 예다. 점수가 60 이상인지에 따라 결과 문자열을 반환한다.

def classify(score):
    if score >= 60:
        return "pass"
    return "retry"

result = classify(72)
print(result)
  1. 값과 연산으로 읽기: 72, 60, 문자열은 데이터이고, >= 비교와 대입은 값을 처리하는 연산이다.
  2. 제어와 묶음으로 읽기: ifreturn은 처리 방향을 나타내며, classify는 관련 코드를 이름 붙인 서브프로그램이다.
  3. 사람과 기계의 관점으로 읽기: 함수 이름과 들여쓰기는 사람이 구조를 파악하도록 돕고, 정해진 형식의 명령은 실행 과정으로 이어진다.

이 예 하나에 모든 구성요소가 완전히 드러나는 것은 아니다. 문자열과 수에 허용되는 연산의 차이에는 타입 개념이 관여하고, 여러 함수와 타입을 독립된 파일이나 이름공간으로 묶을 때 모듈 개념이 더 분명해진다. 작은 코드에서 보이지 않는 항목을 억지로 찾기보다, 각 요소가 필요한 규모와 경계를 구분하는 편이 정확하다.

타입은 데이터 집합과 안전한 연산의 범위를 함께 정한다

타입은 단순히 변수 앞에 붙이는 이름이 아니다. 어떤 데이터가 그 타입에 속하는지와 그 데이터에 어떤 연산을 적용할 수 있는지를 함께 나타낸다. 함수 F가 A 타입의 값을 받아 B 타입의 결과를 만든다면 F:A→B로 표현할 수 있다. A에 속하는 올바른 입력에는 B에 속하는 결과가 나와야 한다.

타입 안전성은 데이터의 타입에 맞는 안전한 연산이 이루어지도록 보장하는 프로그램의 성질이다. 숫자 덧셈을 기대한 곳에 처리할 수 없는 값을 넣거나, 결과 타입에 맞지 않는 값을 돌려주는 오류를 발견하는 기준이 된다.

강의의 분류타입 오류 처리 관점
강타입 언어타입 오류를 모두 검출하는 방향을 강조함
약타입 언어타입 오류를 검출하더라도 일부 오류를 허용할 수 있음
무타입 언어타입 선언문이 없으며 어떤 대상의 타입이 계속 변경될 수 있는 언어로 소개됨

학습 경계: 위 표는 1강에서 제시한 분류 기준을 정리한 것이다. 실제 언어를 평가할 때는 ‘강하다’와 ‘약하다’라는 말만 외우지 말고, 어느 시점에 어떤 오류를 검출하며 어떤 변환을 허용하는지 확인해야 한다.

모듈은 큰 프로그램에 독립된 이름과 경계를 만든다

서브프로그램이 하나의 작은 처리 절차에 이름을 붙인다면, 모듈은 관련 데이터, 함수, 타입 등을 더 큰 독립 단위로 묶는다. 모듈 내부에서만 쓰는 요소와 외부에 제공하는 요소를 구분할 수 있고, 독립된 이름공간을 사용하여 같은 이름의 충돌도 줄일 수 있다.

예를 들어 성적 처리 프로그램을 입력 모듈, 판정 모듈, 출력 모듈로 나누면 판정 규칙을 바꿀 때 출력 형식까지 모두 뒤질 필요가 줄어든다. 다만 파일을 여러 개로 쪼갰다는 사실만으로 모듈화가 완성되는 것은 아니다. 각 부분의 책임이 분명하고, 필요한 정보만 경계를 통해 주고받아야 한다.

구분 기준: 서브프로그램은 ‘반복해서 호출할 처리’에, 모듈은 ‘독립적으로 관리할 프로그램 부분’에 초점을 둔다. 모듈 안에는 여러 서브프로그램과 데이터, 타입이 함께 들어갈 수 있다.

문법은 프로그램의 형태이고 의미는 실행 과정이다

프로그래밍 언어를 배울 때는 프로그램의 겉모양과 실행 중 벌어지는 일을 나누어 보아야 한다. 구문론은 데이터, 연산, 명령을 어떤 형태와 순서로 적을 수 있는지 다룬다. 의미론은 그 표현이 실행될 때 메모리의 값과 실행 흐름이 어떻게 달라지는지 다룬다.

앞의 예에서 if score >= 60:처럼 콜론과 들여쓰기 규칙을 지키는지는 구문의 문제다. score가 72일 때 조건식이 참이 되어 "pass"가 반환되고, 그 값이 result에 저장되는 과정은 의미의 문제다.

관점관찰 대상학습 질문
구문론코드의 기호, 순서, 구조이 표현은 언어 규칙에 맞게 작성되었는가?
의미론실행 흐름, 메모리, 계산 결과이 표현을 실행하면 상태가 어떻게 변하는가?

구문이 맞아도 의도와 다른 결과가 나올 수 있다. 그러므로 괄호나 키워드의 모양만 외우는 학습으로는 부족하다. 각 명령을 실행한 뒤 값과 제어 흐름을 직접 추적해야 한다.

새 언어는 읽기·실행·시각화·작은 변경으로 익힌다

좋은 프로그램을 읽고 직접 작성하며 실행 과정을 분석하는 것은 서로 분리된 활동이 아니다. 다음 학습 순환을 반복하면 구문과 의미를 함께 익힐 수 있다.

  1. 읽기: 짧고 분명한 프로그램에서 데이터, 연산, 명령, 함수의 경계를 표시한다.
  2. 타이핑과 실행: 예제를 직접 입력하고 예상 결과를 먼저 적은 뒤 실행 결과와 비교한다.
  3. 시각적 사고: 변수값, 자료구조, 실행 위치가 단계마다 어떻게 변하는지 표나 그림으로 나타낸다.
  4. 점진적 변경: 조건값이나 데이터 하나만 바꾸고 결과를 관찰한 다음, 작은 기능을 덧붙인다.
  5. 설명: 코드의 형태뿐 아니라 왜 그 결과가 나오는지 자신의 말로 설명한다.

처음 배우는 사람은 사용하기 쉽고 자연스러우며, 원하는 프로그램 분야와 관련되고, 널리 알려져 참고할 자료가 있는 언어를 고려할 수 있다. 이미 여러 언어에 익숙하다면 업무에서 쓰이는지와 기존에 아는 언어와 어떤 공통점·차이가 있는지를 판단 기준으로 삼을 수 있다.

프로그래밍 언어론은 낯선 언어를 해석할 공통 질문을 준다

특정 언어의 문법만 암기하면 그 언어가 바뀌거나 새로운 언어를 만났을 때 다시 처음부터 시작하기 쉽다. 프로그래밍 언어론은 여러 언어에 반복해서 나타나는 데이터, 연산, 제어, 타입, 추상화, 모듈 같은 개념을 비교할 틀을 제공한다.

새 언어를 만났을 때 다음 순서로 질문해 보자.

  1. 어떤 종류의 데이터를 표현하며, 어떤 연산을 기본으로 제공하는가?
  2. 조건과 반복, 함수 호출의 실행 흐름을 어떻게 적는가?
  3. 타입 오류는 언제 발견하며 어떤 변환을 허용하는가?
  4. 세부 구현을 감추고 프로그램을 나누는 추상화·모듈화 수단은 무엇인가?
  5. 작성력, 가독성, 실행 가능성 가운데 어떤 요구를 특히 강조하는가?

이 질문을 사용하면 낯선 언어의 기능을 이미 아는 개념과 연결할 수 있고, 문제에 맞는 언어를 선택하거나 언어 기능을 설계할 때도 근거를 세울 수 있다.

핵심 개념 정리

  • 정의: 프로그래밍 언어는 계산을 컴퓨터가 실행할 수 있고 사람이 읽을 수 있는 형태로 기술하는 방법이다.
  • 주요 기능: 작성력은 의도의 표현, 가독성은 사람의 이해, 실행 가능성은 컴퓨터의 처리를 점검한다.
  • 복잡성 관리: 추상화는 불필요한 세부를 감추고, 모듈화는 전체를 독립된 부분으로 나눈다.
  • 언어 스펙트럼: 저급 언어는 기계 구조와 가깝고, 고급 언어는 문제 표현에 가까우며 번역을 거쳐 실행된다.
  • 구성요소: 데이터, 연산, 명령어, 서브프로그램, 타입, 모듈은 값에서 프로그램 경계까지 연결된다.
  • 두 관점: 구문론은 프로그램의 형태를, 의미론은 실행 중 상태와 흐름을 다룬다.
  • 학습법: 좋은 코드를 읽고 직접 실행하며, 상태 변화를 시각화하고 작은 변경을 반복한다.

프로그램을 볼 때 먼저 ‘어떤 값을 어떤 연산과 명령으로 바꾸는가’를 찾고, 다음으로 ‘그 처리를 어떤 서브프로그램과 모듈 경계에 묶었는가’를 살핀다. 마지막으로 타입이 연산을 안전하게 제한하는지, 코드의 구문이 실행 의미로 어떻게 이어지는지 추적한다. 이 읽기 순서를 익히면 특정 언어의 표면 문법을 넘어 새로운 언어의 설계 의도까지 비교할 수 있다.

예상문제 10선

1. 강의에서 설명한 프로그래밍 언어의 정의로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 프로그래밍 언어는 엄격한 규칙을 사용하며 모호한 표현을 기계가 임의로 추측하게 하지 않는다.
  • ② 오답: 컴퓨터의 실행뿐 아니라 사람이 프로그램을 읽을 수 있다는 조건도 정의에 포함된다.
  • ③ 정답: 사람의 가독성과 컴퓨터의 실행 가능성을 함께 담은 정의다.
  • ④ 오답: 프로그래밍 언어는 실행할 계산을 기술하며 단순한 문서 장식 형식이 아니다.

2. 실행은 되지만 이름과 구조가 불명확하여 다른 사람이 수정하기 어려운 프로그램에서 가장 직접적으로 부족한 기능은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 사람이 코드의 뜻과 구조를 이해하기 어렵다는 조건은 가독성의 문제다.
  • ② 오답: 문제에서 이미 실행된다고 했으므로 실행 가능성 자체가 직접적인 실패 원인은 아니다.
  • ③ 오답: 특정 기계와의 관련성에 대한 정보가 없고, 수정하기 어렵다는 문제를 바로 설명하지 못한다.
  • ④ 오답: 데이터가 이진인지 텍스트인지는 코드 구조를 이해하기 어렵다는 상황의 핵심이 아니다.

3. 추상화와 모듈화를 올바르게 구분한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 추상화는 세부를 감추며 모듈화도 무조건 모든 내부 정보를 공개하지 않는다.
  • ② 오답: 두 개념은 복잡성을 관리하는 기능이며 기계어 사용이나 번역 제거를 뜻하지 않는다.
  • ③ 오답: 두 기능은 프로그램을 이해하고 관리하기 쉽게 만들며 실행 방해가 목적이 아니다.
  • ④ 정답: 관점을 단순화하는 기능과 독립된 경계를 만드는 기능을 정확히 구분했다.

4. 고급 언어와 저급 언어에 대한 설명 중 수정이 필요한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 기계 구조와의 밀접성은 저급 언어의 특징을 올바르게 설명한다.
  • ② 정답: 고급과 저급은 추상화 수준과 기계 의존성의 구분이지 절대적 품질 순위가 아니다.
  • ③ 오답: 고급 언어가 기계 독립적인 표현을 제공한다는 강의 내용과 맞는다.
  • ④ 오답: 세 언어는 강의자료에서 고급 언어의 예로 제시되었다.

5. ‘점수가 60 이상이면 통과를 반환한다’라는 작은 코드 묶음에 classify라는 이름을 붙여 여러 곳에서 호출했다. 가장 직접적으로 해당하는 구성요소는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 점수와 결과 문자열은 데이터이지만, 문제는 이름 붙인 코드 묶음 전체를 묻는다.
  • ② 정답: 프로그램의 작은 코드 묶음에 이름을 붙여 호출하는 단위가 서브프로그램이다.
  • ③ 오답: 값 하나가 아니라 조건 판단과 반환을 포함한 처리 단위에 관한 설명이다.
  • ④ 오답: 특정 하드웨어 구조와의 관계는 제시되지 않았다.

6. 타입에 대한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 서식은 화면 표현의 문제이며 타입은 값과 연산의 안전한 관계를 다룬다.
  • ② 오답: 타입은 오히려 값의 종류에 따라 허용할 연산을 구분한다.
  • ③ 오답: 파일과 이름공간의 구성은 모듈 개념에 더 가깝다.
  • ④ 정답: 어떤 값이 속하는지와 어떤 연산이 가능한지를 함께 보는 정의다.

7. 관련 데이터·함수·타입을 하나의 독립된 이름공간으로 묶고, 내부 요소와 외부 제공 요소를 나누려 한다. 가장 알맞은 구성요소는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 모듈은 관련 요소를 독립된 프로그램 부분과 이름공간으로 묶는다.
  • ② 오답: 데이터는 처리할 값이며 여러 요소를 관리하는 독립 경계가 아니다.
  • ③ 오답: 비교 연산자는 값을 비교하는 원시 연산의 예로, 이름공간을 만들지 않는다.
  • ④ 오답: 자연언어 문장은 프로그래밍 언어의 모듈 구성요소가 아니다.

8. 구문론과 의미론을 올바르게 연결한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 프로그램 형태와 실행 결과의 대응을 서로 뒤바꿨다.
  • ② 오답: 두 분야는 언어의 표현과 실행 의미를 다루며 전기 회로에만 한정되지 않는다.
  • ③ 정답: 코드의 형식 규칙과 실행 시 발생하는 상태 변화를 정확히 구분했다.
  • ④ 오답: 구문 규칙을 지킨 프로그램도 잘못된 계산 절차를 적으면 의도와 다른 결과를 낼 수 있다.

9. 강의에서 권한 프로그래밍 언어 학습 방법에 가장 가까운 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 철자만 외우면 표현이 실행 의미로 어떻게 이어지는지 확인할 수 없다.
  • ② 오답: 작은 프로그램에서 시작해 점진적으로 변경해야 오류 원인과 상태 변화를 분리하기 쉽다.
  • ③ 오답: 좋은 코드를 읽는 것과 함께 실행 과정을 분석해야 한다.
  • ④ 정답: 타이핑, 시각적 사고, 점진적 변경이라는 강의의 학습 요령을 모두 반영했다.

10. 낯선 프로그래밍 언어를 처음 분석할 때 가장 적절한 접근은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 인기도는 언어의 타입, 제어, 모듈 설계를 설명하지 못한다.
  • ② 정답: 여러 언어에 반복되는 구성요소와 구문·의미의 연결을 공통 기준으로 분석하는 방법이다.
  • ③ 오답: 표면 키워드는 달라도 데이터, 연산, 제어 같은 공통 개념을 공유할 수 있다.
  • ④ 오답: 프로그래밍 언어는 사람의 표현과 이해도 지원해야 하므로 세 기능을 함께 살펴야 한다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 코드 예제, 비교표, 학습 순환과 문제 해설은 핵심 개념의 관계를 확인할 수 있도록 독자적으로 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 컴퓨터과학과 「프로그래밍언어론」 1강 ‘프로그래밍 언어 소개’ 강의자료
  • 보충 자료: 별도의 외부 자료를 사용하지 않고 해당 차시 강의 범위 안에서 재구성
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-08-27

댓글