AndreaSmalltalkLecture:QnA 12

From 흡혈양파의 인터넷工房
Jump to: navigation, search
질문과 답변-12
:전치와 후치 연산자

전치와 후치 연산자

안녕하세요? 김찬홍입니다. 전치 연산자와 후치 연산자는 원어로 적으면 prefix operator, postfix operator입니다. 대부분 이를 '전위 표기식 연산자', '후위 표기식 연산자'라 하고, 제가 즐겨 쓰는 한글 언어에서는 '앞가지 연산자', '뒷가지 연산자'라 부르고 있습니다. 어찌되었건 이는 연산자와 연산수의 위치 관계를 나타낼 때 사용하는 말입니다.


우리가 흔히 쓰는 연산자는 중치 연산자, 중위 표기식 연산자, 속가지 연산자, infix operator라고 부릅니다.

3 + 4
(2 + 5) / 7


등과 같이 연산수와 연산수 사이에, 즉 연산수 중간에 연산자가 배치되어 있습니다.중위 표기식 여산자는 우리가 수학에서 가장 즐겨쓰는 표현이기 때문에 이해하기가 가장 쉽다는 장점이 있습니다. 그러나..

3 + 4 * 5


의 경우에 "+"를 먼저 계산해야 할지, "*"를 먼저 계산해야 할지를 결정해야 합니다. 즉 어떤 연산자를 먼저 연산수와 결합할지를 결정해야 하는데, 이것이 '연산의 우선순위'(operator's precedence)입니다. 보통 중위 표기식 연산자를 컴퓨터에서 처리하려면 연산자의 우선 순위를 담고 있는 사전이 필요합니다. 그래서 이 사전에서 연산자를 찾아보고 이것이 어떤 우선권을 갖는지를 검사해서 그대로 명령을 실행하는 것입니다. 만약 연산의 우선순위를 바꾸려면 괄호를 사용하면 됩니다.


전위 표기식 연산자는 연산자가 연산수 앞에 옵니다.

+ 3 5


위는 3과 5를 더라하는 말입니다. 그런데 여러 개의 연산자가 올 때에는 혼동을 피하기 위해서 괄호를 반드시 붙여주어야 합니다.

(+ (* 2 5) 8)


위의 식을 중위 표기식으로 바꾸면

(2 * 5) + 8


이 될 것입니다. 전위 표기식 연산자는 LISP 계통의 언어에서 사용합니다. 괄호가 많아서 이해하기가 어려울 수 있지만, 컴퓨터 입장에서는 중위표기 연산자보다 처리하기가 단순하다는 이점이 있습니다.


후위 표기식 연산자는 연산자가 연산수 뒤에 옵니다.

3 5 +


위의 식은 3과 5를 더한다는 의미입니다. 후위 표기식 연산자는 우리말을 닮았습니다.

3 4 * 2 / 10 - 5 +


위의 식을 우리말로 풀어보면

"3에 4를 곱하고 2로 나눠서 10 을고 5를 더한다"


로 읽을 수 있습니다. 또한

3 4 5 + *


의 경우는

"3에, 4와 5를 더해서, 곱한다"


로 읽으면 됩니다.

2 5 4 7 * + -


이것은

2에, 5에, 4와 칠을 곱하고, 더한 뒤, 빼라"


로 읽으 수 있습니다. 후치 연산자는 연산의 우선순위도 없고 괄호를 쓸 필요도 없어서 매우 편리하지만, 역시 중위표기식보다는 낯설기 때문에 어려워 보입니다. 후위 표기식 연산자의 경우는 주로 Forth와 같은 Stack 기반 언어에서 사용합니다.


보통 전위, 후위 연산자라고 말하면 이와 같이 말할 수 있겠는데, C/C++ 언어에 한정해서 말하는 경우가 있습니다. C++에 있는 ++/-- 연산자는 전위 표기와 후위 표기를 모두 할 수 있기 때문입니다.

i++


이나

++i


나 똑같이 변수 i에서 1을 더합니다. 또한

i--


--i


나 똑같이 변수에서 1을 뺍니다. 그러나 결과는 다릅니다.

a = 3;
b = a++;		// a = 4, b = 3


의 경우 b에는 3이 남습니다. 왜냐하면 a를 먼저 b에 넣은 다음 ++를 하기 때문입니다.

a = 3;
b = ++a;		// a = 4, b = 4


위의 경우는 a, b 모두 4가 됩니다. 즉 b에 a를 넣기 전에 ++을 수행했기 때문입니다. 이와 같이 ++/-- 연산자는 전치, 후치에 따라서 값이 달라지기 때문에 매우 신중하게 써야 합니다. 잘못 쓰면 바탕글을 읽기 어렵게 만들기 때문에 간단하개 사용하는 것이 좋습니다.


요약하면, 일반적인 의미에서는 연산자와 연산수의 관계를 설명하고, C/C++언어에서는 증감 연산자(++ --)의 위치에 따른 값의 변화를 나타낼 때 사용합니다.


참고로 임인건님이 쓰신 Turbo C 정복 이라는 책을 권합니다.


Notes