문 (프로그래밍)
1. 개요
문(statement)은 프로그래밍 언어에서 수행될 작업을 지정하는 기본적인 구문 요소이다. 문은 단순문과 복합문으로 나뉘며, 단순문에는 할당, 서브루틴 호출, GOTO, return, stop/halt 등이 있다. 복합문은 여러 문을 묶거나 제어 흐름을 관리하며, 블록, 조건문(if, switch), 반복문(for, while, do-while) 등을 포함한다. 각 프로그래밍 언어는 고유한 구문과 예약어를 사용하여 문을 정의하며, BNF(바커스-나우르 표기법)와 같은 표기법으로 문법을 설명한다.
| 종류 | 명령형 프로그래밍 언어의 기본 요소 |
|---|---|
| 역할 | 프로그램의 실행 흐름 제어, 데이터 처리 |
| 구성 요소 | 표현식 키워드 연산자 |
| 예시 | 할당문: x = y + 2 조건문: if (x > 10) { ... } 반복문: for (i = 0; i < 10; i++) { ... } |
| 실행 순서 | 일반적으로 순차적으로 실행됨 |
|---|---|
| 제어 구조 | 조건문, 반복문 등을 통해 실행 흐름 변경 가능 |
| 부작용 | 상태를 변경할 수 있음 (변수 값 변경, 입출력 등) |
| C 언어 | 세미콜론(;)으로 문장 종료 |
|---|---|
| 파이썬 | 들여쓰기로 코드 블록 구분 |
| 자바 | 클래스 내에 포함되어야 함 |
| 관련 용어 | 표현식 제어 흐름 함수 |
|---|
2. 문의 종류
프로그래밍 언어에서 사용되는 문은 크게 단순문과 복합문으로 나뉜다.
2.1. 단순문 (Simple statements)
단순문은 그 자체로 완전한 하나의 명령을 나타내며, 더 이상 작은 단위로 나눌 수 없다. 여기에는 대입문, 함수 호출, 리턴문, GOTO문, 선언문 등이 포함된다.
할당, 호출, 어설션, goto, 반환, 정지/중단/종료 등이 단순문에 해당한다.
2.1.1. 할당문 (Assignment)
대입문은 변수에 값을 저장하는 문이다. 한국 정보 교육 과정에서 변수와 함께 가장 기본적으로 다루는 개념 중 하나이다. 다양한 프로그래밍 언어에서 사용되는 할당문의 예시는 다음과 같다.
| 언어 | 할당문 |
|---|---|
| 포트란 | 변수 = 표현식 |
| 파스칼, 알골 60, 에이다 | 변수 := 표현식; |
| C, C#, C++, PHP, Java | 변수 = 표현식; |
2.1.2. 호출문 (Call)
함수 또는 서브루틴을 실행하는 문이다.
| 프로그래밍 언어 | 호출문 |
|---|---|
| 포트란 | CALL 서브루틴 이름(매개변수) |
| C, C++, Java, PHP, 파스칼, 에이다 | 서브루틴 이름(매개변수); |
2.1.3. 선언문 (Declaration)
변수, 상수, 함수 등의 식별자를 정의하고 선언하는 문이다. 예를 들어 C에서 `int i;`는 정수형 변수 i를 선언하는 선언문이다.
2.1.5. GOTO문
GOTO문은 프로그램의 실행 흐름을 지정된 레이블(label) 위치로 이동시키는 문이다.
| 언어 | 코드 |
|---|---|
| 포트란 | `GOTO 숫자-레이블` |
| 알골 60 | `goto 레이블;` |
| C, C++, PHP, 파스칼 | `goto 레이블;` |
최근 한국의 소프트웨어 교육에서는 GOTO문의 사용을 지양하고 구조적 프로그래밍을 권장하는 추세이다. 이는 GOTO문이 프로그램의 가독성을 해치고 유지보수를 어렵게 만들기 때문이다.
2.1.6. 기타 단순문
* 어설션
* C, C++, PHP: assert(관계식);
* Java: assert 관계식;
* 정지/중단/종료
* 포트란: STOP 숫자
* C, C++: exit(표현식)
* PHP: exit 숫자;
2.2. 복합문 (Compound statements)
복합문은 여러 개의 문을 포함하거나, 다른 문들의 실행 흐름을 제어하는 문이다. 복합문은 중첩되어 사용될 수 있다.
많은 복합 문은 루프 명령 또는 선택 명령이다. 이론적으로는 각 유형의 명령 중 하나만 필요하지만, 실제로는 다양한 특수 사례가 존재하여 프로그래밍을 더 쉽게 만들고, 효율적으로 구현할 수 있게 한다.
일부 프로그래밍 언어는 문을 그룹화하는 방법을 제공한다. 예를 들어, Algol 60과 파스칼에서는 `begin
2.2.1. 블록 (Block)
블록은 여러 문을 하나의 단위로 묶어 순차적으로 실행하는 구조이다. 블록은 프로그래밍에서 코드를 구성하는 기본적인 요소 중 하나로, 다음과 같은 형태를 가진다.
* Algol 60, 파스칼(Pascal): `begin
* C, PHP, Java: `{
위 예제에서 `
2.2.2. 조건문 (Conditional statements)
조건문은 특정 조건이 참인지 거짓인지에 따라 다른 문을 실행하도록 하는 구문이다.
| 구분 | Algol 60 | 파스칼(Pascal) | C, Java | Ada | 포트란 77+ (Fortran 77+) |
|---|---|---|---|---|---|
| if-statement 단순 상황 | if test then | ||||
| if-statement 양방향 선택 | if test then | ||||
| case/switch 문 다중 방식 선택 |
2.2.3. 반복문 (Loops)
특정 조건이 만족될 때까지 문을 반복 실행한다.
* 카운트 제어 루프:
* Algol 60: `for index := 1 step 1 until limit do
* 파스칼(Pascal): `for index := 1 to limit do
* C, Java: `for ( index = 1; index <= limit; index += 1)
* Ada: `for index in 1..limit loop
* 포트란 90(Fortran 90):
```fortran
DO index = 1,limit
END DO
```
* 조건 제어 루프 (루프 시작 시 테스트):
* Algol 60: `for index := expression while test do
* 파스칼(Pascal): `while test do
* C, Java: `while (test)
* Ada: `while test loop
* 포트란 90(Fortran 90):
```fortran
DO WHILE (test)
END DO
```
* 조건 제어 루프 (루프 종료 시 테스트):
* 파스칼(Pascal): `repeat
* C, Java: `do {
* Ada: `loop
* 루프 중간에 테스트가 있는 조건 제어 루프:
* C: `do {
* Ada: `loop
2.2.4. 예외 처리 (Exception Handling)
프로그램 실행 중 발생하는 예외 상황을 처리하는 문이다.
* Ada:
```Ada
begin protected code except when exception specification => exception handler
```
* Java:
```java
try { protected code } catch (exception specification) { exception handler } finally { cleanup }
```
* 파이썬:
```python
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
3. 구문 (Syntax)
대부분의 프로그래밍 언어는 할당 및 서브루틴 호출 외에도 각 문장을 `goto`, `if`, `while` 등과 같은 특수 단어로 시작한다. 다양한 언어에서 문장의 형식을 설명하기 위해 여러 방법이 사용되었으며, 더 형식적인 방법이 더 정확한 경향이 있다.
* 알골 60은 언어 문법 사양의 새로운 수준을 설정한 바커스-나우르 표기법(BNF)을 사용했다.
* 포트란은 77 버전까지 예제와 함께 영어 산문으로 설명되었으나, 90 버전 이후부터는 BNF의 변형을 사용하여 언어를 설명했다.
* 코볼은 2차원 메타언어를 사용했다.
* 파스칼은 구문 다이어그램과 동등한 BNF를 모두 사용했다.
BNF는 반복을 표현하기 위해 재귀를 사용하므로, 반복을 직접 나타낼 수 있도록 다양한 확장이 제안되었다.
3.1. 예약어 (Reserved keywords)
프로그래밍 언어 문법은 예약어를 특별히 표시하거나 예약하며, 이를 식별자로 사용할 수 없도록 한다. 이는 종종 문법을 더 쉽게 구문 분석할 수 있게 하여, 더 적은 미리 보기를 필요로 한다.
특정 이름은 프로그래밍 언어의 일부로 예약되어 프로그래머가 정의한 이름으로 사용할 수 없다.
가장 널리 사용되는 프로그래밍 언어의 대부분은 예약 키워드를 사용한다. 초기 예로는 FLOW-MATIC (1953) 및 COBOL (1959)이 있다. 1970년 이후에는 Ada, C, C++, Java, Pascal 등이 있다. 예약어의 수는 언어에 따라 다르다. C에는 약 30개가 있는 반면 COBOL에는 약 400개가 있다.