프로그래밍에서 식(Expression) 과 문(Statement) 은 코드의 기본적인 구성 요소이다. 이 둘은 종종 혼동되지만, 역할과 특징이 다르다.
- 식(Expression)
- 값을 생성하는 코드 조각
- 반드시 값(결과)을 반환해야 하며, 변수에 저장할 수 있다.
- 연산(2 + 3), 변수(x * 5), 함수 호출(GetValue()) 등 값이 되는 코드들이 식이다.
- 예제: int a = 5 + 3;, bool check = a > 2;, string text = "Hello" + "World";
- 5 + 3은 값 8을 생성하므로 식 이다.
- a > 2는 true 또는 false를 반환하므로 식 이다.
- 함수 호출 GetValue()가 값을 반환하면 식 이다.
- 문(Statement)
- 어떤 동작을 수행하는 코드 조각
- 값이 아니라 실행을 목적으로 하며, 변수에 저장할 수 없다.
- 예제: int a = 5;, if (a > 3) {}, for (int i = 0; i < 5; i++) {}
- if (a > 3) {}는 조건에 따라 실행만 될 뿐 값이 없으므로 문 이다.
- for (...) {} 반복문은 실행을 위한 구조일 뿐 값이 없으므로 문 이다.
- 식과 문이 혼합된 경우
- int x = (5 + 3) * 2;
- (5 + 3) * 2는 값 16을 생성하는 식 이지만, int x = 전체는 문 이다.
- int result = (a > 5) ? 100 : 0;
- (a > 5) ? 100 : 0 삼항 연산자는 식 이므로 변수에 저장 가능하다.
- int x = (5 + 3) * 2;
식(Expression)의 이점
- 조합 가능성 (Composability)
- 식끼리 결합하여 더 복잡한 연산을 구성할 수 있다.
- 예제: (a * 2) + (b / 2)
- 두 개의 식 (a * 2)와 (b / 2)를 결합하여 하나의 더 큰 식을 만든다.
- 하지만 if 문 같은 문(Statement) 은 결합할 수 없다.
- 변수에 저장 가능 (Reusability)
- 식은 값이므로 변수에 저장하여 재사용할 수 있다.
- 예제: int square = 5 * 5; // 25
- 하지만 if 문 같은 문(Statement)은 값이 아니므로 변수에 저장할 수 없다.
- 함수형 프로그래밍 (Functional Programming) 지원
- 함수형 스타일의 코드 작성을 쉽게 할 수 있다.
- 예제: Func<int, int> square = x => x * x;
- 람다 표현식에서 x * x가 값이므로 가능하다.
- 순수 함수(Pure Function) 작성 가능
- 외부 상태를 변경하지 않고 연산만 수행하는 순수 함수 작성이 가능하다.
- 예제: int Add(int a, int b) => a + b;
- 입력이 같으면 언제나 같은 결과를 반환한다.
- 코드 간결화 (Conciseness)
- 불필요한 코드 없이 한 줄로 표현 가능하다.
- if-else 문보다 식을 사용하면 코드가 더 간결해진다.
int GetMax(int a, int b) => (a > b) ? a : b;
6. Lazy Evaluation과 결합 가능
- 필요할 때만 연산을 수행하여 성능 최적화가 가능하다.
- 처음 사용할 때만 계산되고 이후에는 캐싱된 값을 반환한다.
클래스(Class)는 식(Expression)인가 문(Statement)인가??
- 클래스 선언은 문(Statement)
- class Player { ... } 선언 자체는 값이 아니므로 문 이다.
- Player myPlayer = class Player { ... }; // 오류 발생
- 클래스를 변수에 할당할 수 없으므로 문(Statement)이다.
- 객체 생성은 식(Expression)
- new Player()는 값이므로 식 이다.
- Player player = new Player();
- new Player()는 인스턴스를 반환하므로 식 이다.
- 클래스 내부 멤버와 식
class Example
{
public int Value = 10; // 식
public int GetValue() => Value * 2; // 식
public void Print() { Console.WriteLine("Hello"); } // 문
}
- 필드와 프로퍼티: 값이므로 식
- 메서드 중 반환값이 있는 것은 식
- void 메서드는 값을 반환하지 않으므로 문
| 개념 | 식 (Expression) | 문(Statement) |
| 클래스 | 생성 | 선언 |
| 필드, 프로퍼티 | 할당 | 선언 |
| 메서드 (반환값 O) | 반환값 O | 반환값 X |
'★철학으로 보는 코딩' 카테고리의 다른 글
| 유한상태머신의 확장성 제한과 한계 (0) | 2025.04.14 |
|---|---|
| 상태 패턴과 전략 패턴의 고찰 (0) | 2025.03.14 |
| 객체지향 맥락잡기 (0) | 2025.02.14 |
| 명령형? 선언형? 언제 어떻게 쓰는거지? (0) | 2025.01.31 |
| 통합 다중 패러다임 (0) | 2025.01.26 |