[2025_10_20]statement와 expression

2025. 10. 20. 20:08TIL

Statement (문)

Statement는 실행 가능한 최소 단위로, 동작(action)을 수행하지만 값을 반환하지 않는다.

특징

  • 프로그램의 실행 흐름을 제어
  • 세미콜론(;)으로 종료
  • 값으로 평가되지 않음

예시

 
 
csharp
// 변수 선언 statement
int x = 10;

// 조건문 statement
if (x > 5)
{
    Console.WriteLine("x는 5보다 크다");
}

// 반복문 statement
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

// 메서드 호출 statement
Console.WriteLine("Hello");

Expression (식)

Expression은 값으로 평가되는 코드 조각이다.

특징

  • 항상 어떤 값을 생성/반환
  • 다른 expression의 일부가 될 수 있음
  • 변수에 할당 가능

예시

 
 
csharp
// 산술 expression
5 + 3  // 8로 평가

// 논리 expression
x > 10  // true 또는 false로 평가

// 메서드 호출 expression (값을 반환하는 경우)
Math.Max(5, 10)  // 10으로 평가

// 삼항 연산자 expression
int result = x > 5 ? 100 : 200;  // 100 또는 200으로 평가

 

Expression 뒤에 세미콜론을 붙이면 statement가 된다.

 

csharp
x + 5;        // expression statement (계산만 하고 결과를 사용하지 않음)
x = x + 5;    // assignment statement
Console.WriteLine(x);  // method call statement

C#의 특별한 경우

Expression-bodied Members

C# 6.0부터 메서드, 속성 등을 expression으로 간결하게 표현할 수 있다.

 
 
csharp
// 기존 statement 방식
public int GetDouble(int x)
{
    return x * 2;
}

// expression-bodied member
public int GetDouble(int x) => x * 2;

Switch Expression (C# 8.0+)

기존 switch statement와 달리, switch expression은 값을 반환한다.

 
 
csharp
// Switch statement
string result;
switch (dayOfWeek)
{
    case "Monday":
        result = "월요일";
        break;
    case "Tuesday":
        result = "화요일";
        break;
    default:
        result = "기타";
        break;
}

// Switch expression
string result = dayOfWeek switch
{
    "Monday" => "월요일",
    "Tuesday" => "화요일",
    _ => "기타"
};

Evaluation (평가)

Evaluation은 expression을 실행하여 값을 계산하는 과정이다.

평가 순서

C#에서 expression은 정해진 규칙에 따라 평가된다.

 
 
csharp
int result = 2 + 3 * 4;  // result = 14
// 평가 순서: 3 * 4 → 12, 2 + 12 → 14

연산자 우선순위

 
csharp
// 괄호 > 곱셈/나눗셈 > 덧셈/뺄셈
int a = (2 + 3) * 4;  // 20
int b = 2 + 3 * 4;    // 14

// 논리 연산자
bool result = true || false && false;  // true
// && 가 || 보다 우선순위가 높음
// false && false → false, true || false → true

평가 방향 (Associativity)

 
 
csharp
// 대부분의 연산자는 왼쪽에서 오른쪽으로 평가
int x = 10 - 5 - 2;  // (10 - 5) - 2 = 3

// 할당 연산자는 오른쪽에서 왼쪽으로 평가
int a, b, c;
a = b = c = 5;  // c = 5, b = 5, a = 5

Short-circuit Evaluation (단락 평가)

논리 연산자 &&와 ||는 단락 평가를 수행한다.

 
 
csharp
// && 연산: 첫 번째 조건이 false면 두 번째 조건을 평가하지 않음
bool result = false && ExpensiveOperation();  
// ExpensiveOperation()은 실행되지 않음

// || 연산: 첫 번째 조건이 true면 두 번째 조건을 평가하지 않음
bool result2 = true || ExpensiveOperation();  
// ExpensiveOperation()은 실행되지 않음

// 실용적인 예시
if (user != null && user.Age > 18)
{
    // user가 null이면 user.Age는 평가되지 않음 (NullReferenceException 방지)
}

Eager Evaluation vs Lazy Evaluation

 
 
csharp
// Eager evaluation: 즉시 평가
int result = 5 + CalculateValue();  // CalculateValue()가 바로 실행됨

// Lazy evaluation: 필요할 때 평가 (LINQ 등)
var query = numbers.Where(x => x > 5);  // 아직 실행되지 않음
var list = query.ToList();  // 이 시점에 실제로 평가됨

// Func를 이용한 지연 평가
Func<int> lazyValue = () => ExpensiveCalculation();
// ExpensiveCalculation()은 아직 실행되지 않음
int value = lazyValue();  // 이 시점에 실행

Side Effects (부작용)

Expression 평가 중 프로그램의 상태를 변경하는 것을 side effect라고 한다.

 
 
csharp
int x = 0;

// side effect가 있는 expression
int result = x++;  // x의 값이 변경됨 (side effect)
Console.WriteLine(x);  // 1

// side effect가 없는 pure expression
int result2 = x + 1;  // x는 변경되지 않음
Console.WriteLine(x);  // 여전히 1

// 메서드 호출도 side effect를 가질 수 있음
list.Add(5);  // list의 상태가 변경됨 (side effect)

평가 시점

 
 
csharp
// 즉시 평가
int immediate = 5 + 3;  // 즉시 8로 평가됨

// 지연 평가 (람다 expression)
Func<int> deferred = () => 5 + 3;  // 평가되지 않음
int value = deferred();  // 호출 시점에 평가됨

// 조건부 평가
int result = condition ? value1 : value2;  // condition에 따라 하나만 평가됨

핵심 정리

  • Statement는 "무엇을 할 것인가" (동작)
  • Expression은 "어떤 값인가" (값)
  • Evaluation은 expression을 실행하여 값을 계산하는 과정
  • 모든 expression은 statement가 될 수 있지만, 모든 statement가 expression은 아니다
  • 단락 평가를 이용하면 불필요한 연산을 피하고 안전한 코드를 작성할 수 있다


모두 사용하고 있지만 모두가 자세하게 파고들며 Statement,Expression,Evaluation등을 구분하여 사용하고 있지는 않는다고 생각하고 코딩의 가장 기본이 되는 구분이기에 다시 한번 정리 하였다.