1. 개요
1.1 문서 개요
이 문서는 C++ 프로그래밍에서 **식(Expression)**과 **문(Statement)**의 개념을 정리합니다. 식과 문은 모든 C++ 코드의 기본 구성 요소로, 프로그램의 논리 구조와 실행 흐름을 정의하는 데 사용됩니다.
C++을 포함한 대부분의 프로그래밍 언어에서 식은 값을 생성하는 구조, 문은 행동을 수행하는 구조로 구분됩니다. 본 문서는 이 둘의 차이점, 사용 사례, 그리고 언어 설계에서의 위치를 구조적으로 설명합니다.
2. 내용
2.1 식(Expression)
2.1.1 식의 정의
식(Expression)은 **값을 계산하거나 평가(evaluate)**하는 코드 조각입니다. 식은 항상 어떤 값을 반환합니다.
예를 들어, 다음은 모두 식입니다:
3 + 4
x * y
a = b + c
func(10)
2.1.2 식의 유형
2.1.2.1 산술 식
값들 사이의 산술 연산을 수행하여 결과를 계산합니다.
예시:
int x = 5 + 3; // '5 + 3'은 식이며, 그 결과가 8로 평가됩니다.
2.1.2.2 관계 식
두 값의 관계를 비교하여 논리 값을 반환합니다.
예시:
bool isEqual = (a == b); // 'a == b'는 식이며, true 또는 false로 평가됩니다.
2.1.2.3 논리 식
논리 연산자를 사용하여 참/거짓 값을 계산합니다.
예시:
bool result = (x > 0 && y < 10); // 전체 조건식이 평가되어 true 또는 false를 반환합니다.
2.1.2.4 할당 식
변수에 값을 할당하는 식도 값으로 평가됩니다. 이는 C++에서 할당문도 식이라는 점에서 특징적입니다.
int a;
int b;
a = b = 3; // b = 3이 먼저 평가되어 3을 반환하고, 그 결과가 a에 할당됨
2.2 문(Statement)
2.2.1 문의 정의
문(Statement)은 프로그램에서 어떤 동작을 수행하는 완전한 명령입니다. 문은 값을 반환하지 않을 수 있으며, 하나 이상의 식을 포함할 수 있습니다.
예시:
int x = 10; // 선언 및 초기화 문
if (x > 5) { // 조건문 (제어 흐름 문)
x = x - 1; // 할당문
}
2.2.2 문과 식의 관계
모든 문이 식을 포함할 수 있으나, 모든 식이 문이 되는 것은 아닙니다. 단독으로 사용된 식에 세미콜론(;)을 붙이면 **식 문(expression statement)**이 됩니다.
예시:
a + b; // 이 자체는 식 문이지만, 값은 사용되지 않음
2.2.3 주요 문 유형
2.2.3.1 선언문(Declaration Statement)
변수나 함수, 클래스 등을 선언하는 문입니다.
int count;
2.2.3.2 식문(Expression Statement)
단일 식으로 구성되며, 끝에 세미콜론이 붙은 형태입니다.
x = x + 1;
2.2.3.3 제어문(Control Statement)
조건문, 반복문, 분기문 등 흐름 제어를 위한 문입니다.
if (x > 0) {...}
while (true) {...}
switch (option) {...}
2.2.3.4 복합문(Compound Statement)
여러 문을 중괄호 {}
로 묶어 하나의 블록으로 구성하는 문입니다.
{
int a = 1;
int b = 2;
}
2.3 식과 문 구분의 실질적 의의
C++에서는 문이 프로그램 실행 흐름을 구성하고, 식이 데이터 흐름을 구성합니다.
식은 값을 중심으로 동작하고, 문은 제어 흐름과 구조를 중심으로 동작합니다.
또한, C++은 식을 문처럼 사용할 수 있는 유연한 문법을 허용하므로, 다음과 같은 패턴이 가능해집니다:
while ((line = readLine()) != "") {
process(line);
}
이 예시에서 (line = readLine()) != ""
은 하나의 복합 식이며, 그 자체가 while
문의 조건으로 사용됩니다.
3. 마무리
C++에서 식과 문은 프로그램의 기본 단위로, 각각 값과 동작이라는 측면에서 서로 다른 역할을 수행합니다.
식은 평가되어 값을 생성하고, 문은 프로그램의 실행 구조와 흐름을 구성합니다.
두 개념은 명확히 구분되면서도 C++의 문법 구조 안에서 유기적으로 결합되어 동작하며, 프로그래머가 다양한 방식으로 코드를 구성할 수 있도록 합니다.