잠시만요! 표현식(expression)과 명령문(statement)은 달라요

잠시만요! 표현식(expression)과 명령문(statement)은 달라요

들어가며

대학교에서 컴퓨터를 전공한 사람과 흥미로 시작한 컴퓨터 프로그래밍이 직업이 된 사람도 있을거에요. 그 중 표현식(expression)과 명령문(statement, 때로는 그냥 구문이라고 함)의 차이를 알고 구별할 줄 아는 분도 계실텐데요. 팀에서 프로그래밍할 때 그리고 강의할 때 그 차이를 모르는 분이 상당히 많았어요.

특히 코드를 작성할 때 '표현식'과 '명령문'을 구분 없이 사용하는 경우가 많습니다. 이미 손에 익어서 그 개념을 매번 구별하지 않고 글 쓰듯 코드를 작성하는 경지에 올랐기 때문일 겁니다. '아침이 밝았습니다.' 라는 문장을 쓸 때 '아침'은 '주어'다 라고 굳이 매번 따져 묻지 않는 것 처럼요. 하지만 글의 요소에 대해 구별할 줄 알고 개념을 잘 익혀 쓴 글은 읽기에 쉽고 전달하고자 하는 뜻도 제대로 전달 할 수 있습니다. 프로그래밍 언어의 표현식과 명령문도 이에 해당합니다.

이 글을 읽으면 컴퓨터 프로그래밍 언어에서 말하는 표현식과 명령문 차이를 분명히 알게 될 겁니다. 익힌 개념 차이를 현장과 업무에 적용하세요. 수준 높은 프로그래밍을 구현하게 되고 의견을 나누거나 대화할 때 혼란이 줄어들 거에요.

개념 정리

표현식(expression)

적어도 하나의 값(value)를 반드시 산출(produce)하면 그것은 표현식(expression)이다.

정말 가장 중요한 것은 값을 산출한다는 것입니다. 그 코드의 실행 결과로 하나나 그 이상의 값이 나와야 '표현식'입니다. 어떠한 값도 나오지 않으면 그것은 표현식이라 하지 않습니다.

명령문(statement)

무언가를 수행(action)하면 그것은 명령문(statement)이다.

명령문이 실행되어도 어떠한 값이 산출되지 않습니다. 어떠한 값도 나오지 않아요. 단지 어떤 수행을 하는 것이죠. 예를 들면 여러 회차로 반복하는 흐름을 제어하는 코드가 명령문에 속합니다.

비교하기

if else 는 표현식인가, 명령문인가?

프로그래밍 언어마다 다르기도 하고 한 프로그래밍 언어에서 상황에 따라 다르기도 합니다.

새로운 프로그래밍 언어를 익힐 때 튜토리얼로 시작하는 방법은 정말 좋은 방법입니다. 그 뒤로 반드시 프로그래밍 언어 명세같은 공식 문서를 꼭 읽으세요. 이유는 프로그래밍 언어 마다 추구하는 패러다임이 달라서 읽을 필요가 있습니다. 심지어 if 키워드를 표현식이나 명령문으로 사용하는 언어도 많습니다. 하스켈과 파이썬 코드를 예로 들어볼게요.

if 가 표현식인 코드

아래 코드에 변수 x와 y가 있죠. 그 두 변수 x 또는 y 중 하나를 조건에 따라 하나를 결정해서 결과(값, value)로 돌려주는 코드입니다. 그래서 표현식에 해당합니다.

x = 1
y = 2
z = if x < y then x else y
putStrLn $ show z
-- 1

순수 함수형 언어인 하스켈은 if-then-else 로 완전한 형태를 갖춰야 합니다. 다른 프로그래밍 언어는 else 키워드 없이 코드를 작성할 수 있지만 하스켈은 반드시 else키워드를 사용해야 돼요.

아래 하스켈 코드는 표준 출력으로 문자열을 보냅니다. 조건이 어떻더라도 반드시 하나의 값이 선택되어 표준 출력으로 보내게 돼요. 그래서 하스켈에서 if-then-else 는 표현식에 해당합니다. 또 하스켈 프로그래밍 언어 설계자들이 if-then-else를 표현식으로 설계했습니다.

main :: IO ()
main = do
x = 1 
if x < 0
    then putStrLn "Negative"
    else if x == 0
        then putStrLn "Zero"
        else putStrLn "Positive"
-- Positive

파이썬은 삼항 연산자(ternary operator) 라고 하는 x if condition else y 형태의 표현식을 갖고 있습니다. 이 코드도 else 키워드 없이 사용할 수 없어 반드시 하나의 값을 생성하므로 표현식에 해당합니다.

x = 1
y = 2
z = x if x < y else y
print(z)
# 1

파이썬의 조건 표현식을 자세히 알아보려면 Conditional expressions 를 참고하세요.

if가 명령문인 코드

대부분의 명령형 프로그래밍 언어나 객체지향 언어에서 if 는 명령문에 해당합니다. 예를 들어 파이썬 코드가 if ... elif ... else ... 형태를 갖추고 있더라도 조건에 따라 코드 분기를 해서 표준 출력으로 특정 문자열을 출력할 명령을 실행합니다. 특정 값을 생성하지 않아요.

x = 1
if x < 0:
    print('Negative')
elif x == 0:
    print('Zero')
else:
    print('Positive')
# Positive

위 코드가 하스켈 코드와 비슷하여 표현식이 아니냐는 의문이 들 수 있습니다. 그러나 else 키워드 없이 코드 작성이 가능합니다. 즉 표현식이 아니라 명령문이라는 것을 확인 할 수 있어요. 어떠한 조건에도 해당하지 않으니 값도 생성되지 않고 아무런 것도 실행하지 않죠.

x = 1
if x < 0:
    print('Negative')
elif x == 0:
    print('Zero')

파이썬의 제어 흐름을 자세히 알아보려면 More Control Flow Tools 를 참고하세요.

마무리

아무런 생각없이 사용하는 단어가 누구에게는 큰 혼란을 줄 수 있습니다. 제각각 해당 단어를 듣고 세상에 적용하며 살아온 삶이 달랐기 때문이겠죠. 다른 사람과 함께 일하며 특정 결과를 만들 때는 사용하는 말과 단어의 의미가 똑같아야 혼란이 줄고 제대로 된 결과를 만들 수 있습니다.