프로그래밍 언어는 프로그램을 적는 방식에 따라 절차적·객체지향·스크립트·선언형 언어로 나뉩니다. 처리 순서를 적는지, 데이터와 처리를 객체로 묶는지, 컴파일 없이 바로 돌리는지, 원하는 결과만 적는지가 갈래를 가릅니다.
빠르게 돌아야 하는 프로그램, 여럿이 오래 고치는 큰 프로그램, 웹 페이지에 붙이는 짧은 코드, 데이터에서 필요한 것만 꺼내는 질의는 맞는 언어가 다릅니다. 아래 그림은 학번 101의 점수 85·75·80을 더하는 같은 일을 갈래마다 다르게 적는 장면이고, 끝에서 언어 이름 카드를 갈래 바구니에 직접 나눠 봅니다.
1순서를 적는 언어: 절차적과 객체지향
절차적 프로그래밍 언어(procedural programming language)는 처리할 일을 순서대로 적습니다. 그림의 C 코드는 합을 0으로 두고 점수를 하나씩 더하는 차례를 위에서 아래로 적었습니다.
객체지향 프로그래밍 언어(object-oriented programming language)는 데이터와 그 데이터를 다루는 처리를 객체 하나로 묶습니다.
그림의 Java 코드는 점수 셋과 합계를 내는 메서드 sum()을 Student 클래스에 함께 두고, 그 틀로 만든 객체에게 합계를 부탁했습니다.
| 가르는 기준 | 절차적 | 객체지향 |
|---|---|---|
| 프로그램을 나누는 단위 | 함수 | 객체(틀은 클래스) |
| 데이터와 처리 | 따로 둔다 | 객체 안에 함께 둔다 |
| 강점 | 컴퓨터가 일하는 차례와 닮아 빠르다 | 부품처럼 다시 쓰고 고치기 쉽다 |
| 대표 언어 | C · FORTRAN · COBOL | Java · C++(C에 객체를 더함) |
- 두 갈래 모두 '어떻게' 할지를 차례로 적어, 묶어 명령형 언어(imperative language)라고 부릅니다.
- 캡슐화·상속 같은 특징은 '객체지향의 기본 개념' 레슨에서 다룹니다.
2바로 읽어 돌리는 언어: 스크립트 언어
C는 소스를 미리 기계어로 번역(컴파일)해 실행 파일을 만든 뒤 그 파일을 돌립니다. 스크립트 언어(scripting language)는 실행 파일을 따로 만들지 않고, 번역기(인터프리터)가 소스를 읽으며 바로 돌립니다. 고친 뒤 곧바로 돌려 볼 수 있지만, 돌릴 때마다 읽어 해석하므로 대체로 느립니다.
웹에서는 코드가 어디서 도는지로 한 번 더 나눕니다.
| 가르는 기준 | 클라이언트 쪽 | 서버 쪽 |
|---|---|---|
| 도는 곳 | 사용자의 웹 브라우저 | 웹 서버 |
| 브라우저가 받는 것 | 코드 그 자체 | 서버가 돌려 만든 웹 페이지(HTML) |
| 대표 언어 | JavaScript | PHP · Python · JSP · ASP |
- JavaScript는 Node.js로 서버에서도 돌지만, 브라우저가 바로 돌리는 대표 언어입니다.
- Python처럼 스크립트 언어이면서 객체지향 언어인 것도 있습니다. 한 언어가 여러 갈래에 걸칩니다.
3결과를 적는 언어: 선언형 — 함수형과 논리형
선언형 언어(declarative language)는 처리 순서 대신 원하는 결과를 적습니다. 그림의 SQL에는 점수를 하나씩 더하는 반복이 없고, 구하는 차례는 DBMS가 정합니다. 선언형 안에는 함수형 언어(functional language)와 논리형 언어(logic language)가 있습니다.
| 가르는 기준 | 함수형 | 논리형 |
|---|---|---|
| 적는 것 | 값을 받아 값을 돌려주는 함수 | 사실과 규칙 |
| 답을 얻는 법 | 함수에 값을 넣는다 | ?- 질문을 던져 참이 되는 값을 찾는다 |
| 대표 언어 | LISP · Haskell | PROLOG |
- 함수형은 변수 값을 바꾸지 않고, 되풀이는 반복문보다 재귀로 합니다. 논리형은 기호 논리에 바탕을 둡니다.
예제
그림의 코드를 돌려 본 결과입니다. 폰 화면에 맞추려고 Java의 main 머리를 두 줄로 나눴습니다. 한 줄로 쓴 것과 같습니다.
C — 절차적
#include <stdio.h>
int main(void) {
int scores[] = {85, 75, 80};
int i, sum = 0;
for (i = 0; i < 3; i++) {
sum += scores[i];
}
printf("%d\n", sum);
return 0;
}
240Java — 객체지향
public class Student {
int ds = 85, os = 75, nw = 80;
int sum() {
return ds + os + nw;
}
public static void main(
String[] args) {
Student s = new Student();
System.out.println(s.sum());
}
}
240Python — 스크립트
print(sum([85, 75, 80]))
240SQL — 선언형
SELECT SUM(점수) AS 합계
FROM 수강
WHERE 학번 = 101;
| 합계 |
|---|
| 240 |
함수형·논리형 언어로는 같은 일을 이렇게 적습니다.
| 언어 | 같은 합계 | 답 |
|---|---|---|
| LISP | (+ 85 75 80) | 240 |
| Haskell | sum [85, 75, 80] | 240 |
| PROLOG | ?- sum_list([85, 75, 80], S). | S = 240. |
시험 포인트
- 필기: 언어 이름을 주고 갈래를 고르게 합니다(C — 절차적 · Java·C++ — 객체지향 · JavaScript·PHP·Python — 스크립트 · SQL·LISP·Haskell·PROLOG — 선언형). C++을 절차적으로, 브라우저에서 도는 JavaScript를 서버 쪽으로 고르는 보기를 조심합니다. 스크립트는 컴파일 없이 바로 돌아 고치기 빠르지만 느립니다. 명령형(절차적·객체지향)은 '어떻게'를, 선언형(함수형·논리형)은 '무엇을' 적습니다.
- 실기: 특징을 보고 갈래 이름을 씁니다. 절차적 프로그래밍 언어(Procedural Programming Language)·객체지향 프로그래밍 언어(Object-Oriented Programming Language)·스크립트 언어(Scripting Language)·선언형 언어(Declarative Language)·함수형 언어(Functional Language)·논리형 언어(Logic Language).
확인 문제
1. 온라인 서점 화면입니다. (가) 수량 단추를 누르면 페이지를 다시 받지 않고 브라우저 안에서 금액이 바로 바뀝니다. (나) 주문 단추를 누르면 서버가 재고를 확인하고 결과 페이지를 만들어 보냅니다. (가)·(나)를 맡을 스크립트 언어의 짝으로 알맞은 것을 고르세요.
- ① (가) PHP · (나) JavaScript
- ② (가) JavaScript · (나) PHP
- ③ (가) Python · (나) PHP
- ④ (가) JavaScript · (나) C
정답
②입니다. 브라우저 안에서 바로 도는 (가)는 클라이언트 쪽인 JavaScript이고, 서버에서 돌아 결과 페이지만 보내는 (나)는 서버 쪽인 PHP입니다.
- ① (가)가 틀렸습니다. PHP는 서버에서 돌아 만든 HTML만 브라우저로 보냅니다. 브라우저 안에서는 돌지 않습니다.
- ③ (가)가 틀렸습니다. Python도 서버 쪽에서 돕니다. 웹 브라우저가 바로 돌리는 언어는 JavaScript입니다.
- ④ (나)가 틀렸습니다. C는 컴파일해 실행 파일을 만드는 언어라 스크립트 언어가 아닙니다.
2. 다음 (가)~(라)에 맞는 언어 갈래의 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 처리할 일을 1번, 2번, 3번 차례로 적고, 자주 쓰는 차례는 함수로 묶어 부릅니다. 컴퓨터가 일하는 차례와 닮아 빠르지만, 프로그램이 커지면 고치기 어렵습니다.
- (나) 주문 프로그램에 '장바구니' 틀을 만들고, 담긴 상품 목록과 담기·빼기 기능을 그 틀에 함께 둡니다. 틀로 만든 장바구니에게 '담아 줘'라고 부탁합니다.
- (다) 실행 파일을 따로 만들지 않고 번역기가 소스를 읽으며 바로 돌립니다. 고쳐서 곧바로 돌려 볼 수 있지만 대체로 느립니다.
- (라) '3학년 학생의 이름'처럼 원하는 결과만 적고, 어떤 차례로 찾을지는 처리기가 정합니다.
정답
받는 답: (가) 절차적 프로그래밍 언어(Procedural Programming Language) · (나) 객체지향 프로그래밍 언어(Object-Oriented Programming Language) · (다) 스크립트 언어(Scripting Language) · (라) 선언형 언어(Declarative Language)
(가)의 실마리는 '차례로 적고 함수로 묶는다', (나)는 '목록과 기능을 한 틀에 두고 그 틀로 만든 것에게 부탁한다', (다)는 '실행 파일 없이 번역기가 바로 돌린다', (라)는 '결과만 적고 차례는 처리기가 정한다'입니다.
- 같은 이름의 다른 꼴: Procedural Programming Language처럼 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다.
- 틀리는 꼴 명령형 언어 — (가)에: 절차적과 객체지향을 함께 묶는 이름입니다. 차례를 적고 함수로 묶는 갈래 하나의 이름은 절차적입니다.
- 틀리는 꼴 함수형 언어 — (라)에: 선언형 안의 한 갈래입니다. 원하는 결과만 적는 갈래 전체의 이름은 선언형입니다.
3. 다음 (가)·(나)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 둘 다 2번 (라)의 갈래 안에 듭니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 대입으로 변수 값을 바꾸지 않고, 값을 받아 값을 돌려주는 것들을 겹쳐 결과를 만듭니다. 되풀이는 반복문 대신 자기 자신을 다시 부르는 꼴로 합니다.
- (나) '부모의 부모는 조부모다' 같은 규칙과 사실을 적어 두고, 질문을 던지면 규칙에 맞는 답을 찾아 줍니다.
정답
받는 답: (가) 함수형 언어(Functional Language) · (나) 논리형 언어(Logic Language)
(가)의 실마리는 '값을 받아 값을 돌려주는 것들을 겹친다'와 '되풀이는 재귀', (나)는 '규칙과 사실을 두고 질문으로 답을 찾는다'입니다.
- 틀리는 꼴 절차적 프로그래밍 언어 — (가)에: 함수로 묶기는 하지만 변수 값을 바꿔 가며 차례를 적습니다. (가)는 값을 바꾸지 않습니다.
- 틀리는 꼴 선언형 언어 — (나)에: (가)·(나)를 함께 품는 큰 갈래입니다. 규칙과 질문으로 답을 찾는 갈래의 이름은 논리형입니다.
4. 다음 코드 조각 여섯을 '명령형'과 '선언형' 두 바구니로 나누고, 바구니마다 기호를 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) C의
for (i = 0; i < n; i++) total += a[i]; - (나) SQL의
SELECT AVG(점수) FROM 수강; - (다) Java의
account.deposit(500);— 계좌 객체에게 입금을 부탁한다 - (라) Haskell의
map (* 2) [1, 2, 3]— 두 배 하는 함수를 목록에 건다 - (마) PROLOG의
?- parent(X, minsu).— minsu의 부모 X를 묻는다 - (바) Python의
while n > 0:다음 줄n -= 1
정답
받는 답: 명령형 — (가)·(다)·(바) · 선언형 — (나)·(라)·(마)
바구니를 가르는 기준은 '어떻게'를 차례로 적었는가, '무엇을' 원하는지만 적었는가입니다.
- (가) 하나씩 더하는 차례를 적은 절차적 코드입니다.
- (나) 평균을 구하는 차례 없이 원하는 결과만 적었습니다.
- (다) 객체에게 일을 부탁하는 객체지향 코드도 일의 차례를 적는 명령형입니다.
- (라) 함수에 값을 거는 함수형입니다. 반복도 대입도 없습니다.
- (마) 질문을 던지는 논리형입니다. 답을 찾는 차례는 처리기가 정합니다.
- (바) Python은 스크립트 언어지만, 이 조각은 n을 하나씩 줄이는 차례를 적었으니 명령형입니다. 스크립트는 돌리는 방식으로 가른 이름이라 이 두 바구니와 따로 봅니다.