-
계산을 표현하는 기본적인 수단
-
연산자, 피연산자, 괄호, 함수 호출 등으로 구성
- 연산자
- 한 개의 피연산자를 갖는 단항 연산자
- 두 개의 피연산자를 갖는 이항 연산자
- C 기반 언어 삼항 연산자
- (i % 2) ? “odd” : “even”
- 대부분의 프로그래밍 언어에서 이항 연산자는 피연산자들 사이에 위치
- x + y
- LISP은 연산자가 피연산자들 앞에 위치
- (+ x y)
- 연산자 표기 방법
-
중위 표기법(infix notation) : 연산자가 피연산자들 사이에 위치하는 표기법
-
전위 표기법(prefix notation) : 연산자가 피연산자들 앞에 위치하는 표기법
ex) 함수 호출 표기 : add(1, mul(2, 3))
-
후위 표기법(postfix notation) : 연산자가 피연산자들 앞에 위치하는 표기법
-
-
연산자 평가 순서
- 여러 개의 연산자로 이루어진 식에서는 어떤 연산자가 먼저 평가되느냐에 따라서 연산 결과가 달라진다.
- 우선순위, 결합 규칙, 괄호에 의해 결정
- 연산자 우선순위
- 결합 규칙
- 좌 결합 규칙 : 왼쪽에서부터 오른쪽으로 평가
- 우 결합 규칙 : 오른쪽에서부터 왼쪽으로 평가
- ex) FORTRAN에서 지수 연산자는 우 결합 규칙을 적용
- Ada에서 지수 연산자는 결합 규칙을 갖지 않음 -> 괄호 사용 권장
- 괄호 사용
- 우선순위와 결합 규칙에 관계없이 괄호 안의 연산이 먼저 평가
- 순서를 명확히 정해야 함
- 장점 : 모든 연산자의 평가 순서를 괄호로 표현하면 우선순위나 결합 규칙을 기억할 필요가 없다.
- 단점 : 식의 작성을 지루하게 하고 판독성을 떨어뜨린다.
-
피연산자 평가 순서
- 피연산자 유형 : 변수, 상수, 괄호에 포함된 식, 함수 호출
- 연산자의 모든 피연산자가 부작용(Side effect)을 갖지 않으면, 피연산자의 평가 순서는 무관하다.
- 함수의 부작용(functional side effect)은 함수가 양방향 매개변수나 전역 변수 변경 시 발생
- 함수의 부작용은 식에서 참조된 함수가 식의 다른 피연산자를 변경할 때 발생하고 피연산자 평가 순서에 영향을 미친다.
- 함수의 부작용 예제
- 함수의 부작용 해결책
- 양방향 매개변수, 비지역 변수 참조를 불허 -> 유연성 저하
- 피연산자들의 평가 순서 고정 -> Java(왼쪽에서 오른쪽으로 평가 순서 고정)
-
단락 회로 평가 (Short-circuit evaluation)
- 모든 피연산자와 연산자를 평가하지 않고서도 식의 결과가 결정되는 것을 의미한다.
- 부작용을 포함하는 식의 경우에는 단락 회로 평가를 주의해서 사용해야 한다.
- 각 언어별 단락 회로 평가 지원 사항
- Pascal의 and, or는 단락 회로 평가를 지원하지 않음
-
C, C++, Java의 &&, 는 단락 회로 평가를 지원 - Ada는 단락 회로 평가를 지원하는 연산자와 지원하지 않는 연산자를 구분
-
참조 투명성 (Referential Transparency)
- 프로그램에서 동일한 값을 갖는 임의의 2개 식이 프로그램의 행동에 영향을 미치지 않으면서 프로그램의 임의의 위치에서 서로 대체 가능하면, 프로그램은 참조 투명성의 특징을 갖는다고 말한다.
- 장점 : 함수는 수학적 함수와 의미가 동등하고 프로그램의 의미를 이해하는데 용이하다.
-
중복 연산자 (Operator Overloading)
- 하나의 기호가 두 가지 이상의 목적으로 사용되는 연산자
- ex) 10 + 20, 1.2 + 3.14, “Hello” + “ World”
- 사용자 정의 중복 연산자
- C++과 Ada는 프로그래머가 중복 연산자를 직접 정의해서 사용한다.
- 예를 들어 분수 곱셈을 하는 함수를 작성하고 함수의 이름을 *라고 지정하면 분수 곱셈 시 사용 가능하다.
- 분별있게 사용되면 판독성 향상
- 중복된 연산자의 의미를 파악하는 것이 필요
- C++과 Ada는 프로그래머가 중복 연산자를 직접 정의해서 사용한다.
Expressions
Apr 20, 2019