Expressions

Apr 20, 2019


  • 계산을 표현하는 기본적인 수단

  • 연산자, 피연산자, 괄호, 함수 호출 등으로 구성

  • 연산자
    • 한 개의 피연산자를 갖는 단항 연산자
    • 두 개의 피연산자를 갖는 이항 연산자
    • 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)은 함수가 양방향 매개변수나 전역 변수 변경 시 발생
    • 함수의 부작용은 식에서 참조된 함수가 식의 다른 피연산자를 변경할 때 발생하고 피연산자 평가 순서에 영향을 미친다.
    • 함수의 부작용 예제
      • Example of Functional Side effect
    • 함수의 부작용 해결책
      • 양방향 매개변수, 비지역 변수 참조를 불허 -> 유연성 저하
      • 피연산자들의 평가 순서 고정 -> Java(왼쪽에서 오른쪽으로 평가 순서 고정)
  • 단락 회로 평가 (Short-circuit evaluation)

    • 모든 피연산자와 연산자를 평가하지 않고서도 식의 결과가 결정되는 것을 의미한다.
    • No Short-circuit evaluation problem
    • 부작용을 포함하는 식의 경우에는 단락 회로 평가를 주의해서 사용해야 한다.
    • 각 언어별 단락 회로 평가 지원 사항
      • Pascal의 and, or는 단락 회로 평가를 지원하지 않음
      • C, C++, Java의 &&,   는 단락 회로 평가를 지원
      • Ada는 단락 회로 평가를 지원하는 연산자와 지원하지 않는 연산자를 구분
  • 참조 투명성 (Referential Transparency)

    • 프로그램에서 동일한 값을 갖는 임의의 2개 식이 프로그램의 행동에 영향을 미치지 않으면서 프로그램의 임의의 위치에서 서로 대체 가능하면, 프로그램은 참조 투명성의 특징을 갖는다고 말한다.
    • 장점 : 함수는 수학적 함수와 의미가 동등하고 프로그램의 의미를 이해하는데 용이하다.
  • 중복 연산자 (Operator Overloading)

    • 하나의 기호가 두 가지 이상의 목적으로 사용되는 연산자
    • ex) 10 + 20, 1.2 + 3.14, “Hello” + “ World”
    • 사용자 정의 중복 연산자
      • C++과 Ada는 프로그래머가 중복 연산자를 직접 정의해서 사용한다.
        • 예를 들어 분수 곱셈을 하는 함수를 작성하고 함수의 이름을 *라고 지정하면 분수 곱셈 시 사용 가능하다.
      • 분별있게 사용되면 판독성 향상
      • 중복된 연산자의 의미를 파악하는 것이 필요