Home Statement와 Expression
Post
Cancel

Statement와 Expression

글을 작성하게 된 계기


문(Statement)과 식(Expression)의 차이를 정리하기 위해 글을 작성하게 되었습니다.





1. Statement


문(Statement)은 어떤 동작을 수행하도록 명령하는 최소 단위 입니다. 일반적으로 명령형 프로그래밍 언어에서는 프로그램 전체가 하나 이상의 문으로 구성되어 있으며, 각 문은 특정 작업을 수행합니다. 예를 들어 변수에 값을 대입하거나, 함수를 호출하거나, 조건을 검사하거나, 루프를 돌리는 등의 작업이 있습니다.

In computer programming, a statement is a syntactic unit of an imperative programming language that expresses some action to be carried out.



문은 어떤 작업을 수행하는 코드 단위이기 때문에 값 자체를 만들어내기보다는 명령을 실행합니다. 가장 흔한 문은 변수 선언, 조건문, 반복문, 함수 호출 등입니다. 예를 들어 val x = 10도 하나의 문이고, 이는 x라는 이름의 변수에 10을 할당하라는 명령을 수행하는 것입니다. 문은 크게 두 가지로 나뉩니다.

1
2
3
4
5
6
7
val x = 10

println("Hello")

if (x > 5) {
    println("X is greater than 5.")
}



1-1. 단순문

단순문(Simple statements)은 독립적으로 사용 되며, 다른 문을 포함하지 않습니다.

  • 변수 대입(x = y + 1), 함수 호출(print(“Hello”)), return, goto, assert, exit 등.
  • 언어에 따라 구문은 조금씩 다르지만, 기본적으로 하나의 동작만을 수행합니다.



1-2. 복합문

복합문(Compound statements)은 여러 개의 문을 그룹으로 묶어서 제어 흐름을 구성하는 데 사용 됩니다. 예를 들어 { ... }, begin ...end 와 같이 블록 형태로 문을 묶어서 사용하고, 특정 조건에 따라 실행하거나 반복합니다.

  • if, while, for, switch, try/catch 등의 구조가 여기에 해당하며, 안에 다른 문들이 들어갈 수 있습니다.
  • 복합문은 여러 개의 단순문을 포함할 수 있으며, 블록 내에서 변수 선언이나 다른 문을 자유롭게 사용할 수 있습니다.







2. Expression


표현식(expression)은 값으로 평가될 수 있는 문법적 구조 를 의미합니다. 이는 상수, 변수, 연산자, 함수 등의 요소를 조합하여 구성되며, 프로그래밍 언어는 이러한 조합을 우선순위와 결합 규칙에 따라 해석하고 계산하여 새로운 값을 생성합니다. 이 과정을 평가(Evaluation) 라고 합니다.

In computer science, an expression is a syntactic entity in a programming language that may be evaluated to determine its value.



표현식의 예시는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
// 산술 표현식: 2 + 3 → 5
val result1 = 2 + 3

// 변수 y를 포함한 표현식: y + 6
val y = 4
val result2 = y + 6

// 관계 표현식: 4 != 4 → false
val comparison = 4 != 4

// print 전체는 문이지만, 그 안에 포함된 요소는 표현식 입니다.
println("4 != 4 = $comparison")  // 출력: 4 != 4 = false



C 언어와 그 파생 언어들에서는 반환형이 void인 함수 호출도 표현식으로 간주됩니다. 이런 표현식은 void 타입이며, 해당 값은 사용할 수 없기 때문에 결과는 항상 버려집니다. 예를 들어 아래는 표현식이지만, 아무런 값을 남기지 않습니다.

1
printHello();



함수 호출을 포함한 표현식은 부작용(Side Effect) 을 일으킬 수 있습니다. 이러한 표현식은 참조 투명성(Referential Transparency) 을 갖지 않으며, 결과가 외부 상태에 영향을 줄 수 있습니다. 예를 들어, x + 1; 과 같이 세미콜론을 붙이면, 해당 표현식은 결과를 무시하고 부작용만 실행하는 표현식 문(Expression Statement)이 됩니다. 반면, y = x + 1; 은 계산 결과를 변수에 저장하므로 의미 있는 실행이 됩니다.

1
2
x + 1 // x + 1은 표현식이지만, 결과를 사용하지 않음
val y = x + 1 // y는 x + 1의 결과값을 저장하는 표현식







3. 식과 문을 구분하는 기준


식과 문을 나누는 절대 기준은 존재하지 않지만 대략 다음과 같은 기준을 통해 구분할 수 있습니다.

  1. 값을 만들어내는가?
  2. 다른 문맥에서 사용할 수 있는가?



3-1. 값을 만들어 내는가

식은 항상 어떤 값을 생성합니다. 예를 들어 3 + 5는 계산 결과 8이라는 값을 만들기 때문에 식입니다. 반대로 문은 어떤 동작을 수행하는 것이 목적입니다. 예를 들어 val x = 10은 10이라는 값을 생성하는 식을 포함하고 있지만, 전체 문장은 변수에 값을 저장하는 명령이므로 문입니다.

1
2
3 + 5       // 식
val x = 10  // 문



3-2. 다른 문맥에서 사용할 수 있는가

식은 다른 식의 일부로 사용될 수 있습니다. 예를 들어 greet(“Hello” + name)에서는 “Hello” + name이라는 식이 함수 호출의 인자로 사용되고 있습니다.

1
2
3
4
5
6
7
8
fun greet(message: String) {
    println(message)
}

fun main() {
    val name = "Jun"
    greet("Hello, " + name)  // "Hello, " + name은 문자열 결합 식
}



하지만 val x = 10 같은 문은 다른 문맥에서 사용할 수 없습니다. 즉, 식은 조합이 가능하지만, 문은 독립적으로만 존재합니다.

1
2
3
4
5
6
7
8
fun printValue(value: Int) {
    println("Value: $value")
}

fun main() {
    // val x = 10은 문이므로 식 자리에 쓸 수 없음
    // printValue(val x = 10) ← 컴파일 오류
}







4. 정리


식과 문에 대해 살펴보았는데요, 식은 값을 생성하고 다른 문맥에서 사용될 수 있는 반면, 문은 특정 동작을 수행하는 명령입니다. 조금 더 요약해보면 문 = 동작, 식 = 값 처럼 생각할 수 있는데, 언어마다 다른 경우가 있으니 잘 확인해보세요. 🚀


This post is licensed under CC BY 4.0 by the author.

3개월 간의 수습기간을 돌아보며

MySQL에서 특정 칼럼이 어느 테이블에 있는지 어떻게 찾을 수 있을까?