어떤 프로그래밍 언어를 배우던 간에 표현식이라는 단어를 접해본 적이 있을 것이다.

그다지 중요하지 않게 보고 넘어갈 수도 있겠지만, 표현식은 프로그래밍의 가장 기본적인 조각이다.

표현식(expression)이란?

일단 단어 자체의 뜻부터 파헤쳐 보자.

표현이란, "눈앞에 나타나 보이는 사물의 이러저러한 모양과 상태"를 뜻한다.
이 뜻을 참고하면 표현식은 모양과 상태를 나타내는 식이라고 볼 수 있다.
그렇다면 은 무엇인가?

  

사실 프로그래밍에서는 표현과 식은 비슷한 의미를 가진다.
''을 광의적으로 해석한다면 '표현'이며,
기본적인 구문 요소와 연산(operation)을 조합시킨 문법 단위를 가리킨다.

  

MDN에서는 표현식을 어떤 값으로 이행하는 임의의 유효한 코드 단위로 정의하고 있다.
결국 표현식이란 특정한 값을 나타내는 코드라고 볼 수 있다.
표현식인 코드를 해석하면 어떠한 값으로 이행하는 것이다.

더 쉽게 표현하자면, 표현식은 다음과 같이 표현할 수 있다.

결과가 하나의 값으로 표현되는 문장

1 + 1
'표현식'
true
isTrue ? 'yes' : 'no'

위의 코드가 바로 표현식이다.

최종적으로 하나의 값을 나타내는 문(state)이라면 모두 표현식이다.
숫자를 값으로 가지는 산술식 뿐만 아니라 다양한 것들이 표현식이 될 수 있다.

  • 산수: 숫자, 산술 연산자를 사용한다.
  • 문자열: 문자, 문자열 연산자를 사용한다.
  • 논리: 참이나 거짓, 논리 연산자를 포함한다.

추가적으로 특정한 값을 반환하는 함수들도 표현식이 될 수 있다.

표현식은 특정한 값이기 때문에 메모리에 저장될 수 있으며,
할당을 통해 다른 변수에 할당이 가능하다.

const two = 1 + 1
const expression = '표현식'
const isCorrect = True
const turOrFalse = isTrue ? 'yes' : 'no'

 

 

문(statement)과 표현식

표현식에 대해 자료를 찾다보면 자주 '문(statement)'와 함께 언급된다.
대부분 '표현식과 표현식이 아닌 문'으로 구분하여 설명한다.

표현식이 아닌 문

표현식은 위에서 알아 보았으니 이제 표현식이 아닌 문에 대해 정말 간단하게 알아보자.
표현식이 아닌 문은 값을 반환하지 않으며, 프로그램을 작성하거나 흐름을 제어하는 역할을 수행한다.
프로그래밍 언어에서 어떤 작업을 수행하는 명령이나 동작을 정의하는 코드 단위가 표현식이 아닌 문이다.
예를 들어 할당문(a = 1) 조건문(if), 반복문(for, while 등), 함수 정의문, 클래스 정의문, 예외 처리문, 단정문(assert) 등이 있다.
더 쉽게 표현하자면 변수에 할당할 수 없는 모든 문은 표현식이 아닌 문이다.

값과 표현식의 차이

결과가 하나의 값으로 표현되는 문장이 표현식이라면, 표현식은 값과 무슨 차이가 있는 것일까?
이는 간단하게 설명할 수 있다.
값은 데이터이지만, 표현식은 그 데이터를 나타내는 코드 조각을 의미한다.
즉, 5 + 5는 5와 5를 더하라는 표현식이자 10이라는 데이터를 나타내는 값이다.
또한 값은 코드에서 상수나 리터럴로 사용될 수 있다.

리터럴?

'소스 코드에서 고정된 값을 나타내는 표기법'이다.
코드 내에서 특정한 값을 표현하는 방법이며, 계산되거나 평가되지 않는 값을 생성하기 위한 약속이다.
즉, 리터럴은 값이라는 데이터를 표기하는 방법을 의미한다.
리터럴이 값이라는 것이 아니라, 숫자, 문자, 문자열 및 기타 값들을 나타내는 데 사용하는 것이 리터럴이다.

값, 표현식, 리터럴 정리

코드에 쓰여진 1은 값, 표현식 또는 리터럴이라고 해석할 수 있다.
하지만 엄밀하게 말하자면 "표현식"은 평가하여 값을 나타거나 생성하기 위해 (연산자와 )조합된 코드 구조를 가리키기 때문에, 이미 값을 표현하고 있는 1은 2라는 값을 생성하는1 + 1과는 달리 표현식이 아니라고 보아야 한다.
더불어 이 1은 그 자체로 (우리가 아는) 숫자 1이라는 데이터가 아니며, 숫자 1이라는 데이터를 컴퓨터가 알아들을 수 있게 약속한 표기법일 뿐이다.

 

다만, 이를 혼용해서 사용하는 것이 실제론 큰 오해나 착오를 불러일으키는 상황은 거의 없으므로, 모든 상황에서 엄격하게 구분할 필요는 없는것 같다.
그저, 배경지식정도로만 알고 있으면 될 것같다.

Python

블로그에 글을 쓰기위해 자료를 찾던 중 파이썬(3.8버전 이상)에서 흥미로운 문법을 발견하였다.

a = 1

  

a에 1을 할당하는 할당식, 여기서 3은 표현식이고 이를 a에 할당하였으므로 전체 코드는 더이상 값을 나타내지 않는다.
다시 말해 a = 1은 특정한 값이 아니므로 표현식이 아니며, 값이 없으므로 다른 변수에 할당할 수 없다.
파이썬에서는 a = b = 1과 같이 사용할 수 있지만,
a에 b=1을 할당하는 것이 아니라 a와 b 각각에 1을 할당한다.
따라서 a = (b = 1)과 같이 사용하지는 못한다.

  

하지만 파이썬(3.8버전 이상)에는 할당문인 동시에 표현식인 특이한 명령어인
"할당 표현식" 또는 "Walrus 연산자"불리는 것이 있다.
Walrus 연산자는 표현식을 변수에 할당하는 동시에 그 값을 반환한다.
따라서 다음과 같은 사용이 가능하다.

x = (y := 10)
print(x)  # 10
print(y)  # 10

numbers = [1, 2, 3, 4]
squared_numbers = [n ** 2 for n in numbers if (n % 2 == 0)]
print(squared_numbers)  # [4, 16]

if (x := sum(numbers)) != 0:
    print(x)

result = sum(a := [1, 2, 3], b := 1)
print(result, a, b)

while (x := len(numbers)) > 0:
    print(x)
    numbers.pop()

참고 자료

MDN Expressions and operators

freeCodeCamp Statement vs Expression – What's the Difference in Programming?

Promise Tochi All you need to know about Javascript's Expressions, Statements and Expression Statements

썸네일 이미지: katemangostar, Freepik

+ Recent posts