[2025_10_20]statement와 expression
2025. 10. 20. 20:08ㆍTIL
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등을 구분하여 사용하고 있지는 않는다고 생각하고 코딩의 가장 기본이 되는 구분이기에 다시 한번 정리 하였다.
'TIL' 카테고리의 다른 글
| [2025_10_22]DDD아키텍쳐 (0) | 2025.10.22 |
|---|---|
| [2025_10_21]발표 정리 및 발표 (0) | 2025.10.21 |
| [2025_10_17]Dirty Flag패턴과 지연평가(Lazy Evaluation) (0) | 2025.10.17 |
| [2025_10_16]Json-2 (0) | 2025.10.16 |
| [2025_10_15]아이템 장착 및 포션사용 (0) | 2025.10.15 |