IDL/Math

증가 및 감소 연산자 (Increment and Decrement Operator)

이상우_idl 2023. 11. 20. 14:02
728x90
반응형

증가 연산자(Increment Operator) 및 감소 연산자(Decrement Operator)는 원래 C나 자바 같은 프로그래밍 언어들에서 지원되는 연산자들인데, IDL에서도 6.0 버전부터 이러한 증감 연산자들이 지원되어오고 있습니다. 기호로는 ++ 및 --로 표기합니다. IDL에서 이러한 연산자들의 기본적인 개념은 타 언어에서와 거의 비슷합니다. 그러면 IDL에서 증가 및 감소 연산자들의 사용 방법 및 예제들을 살펴보기로 하겠습니다.

 

증가 및 감소 연산자는 변수 또는 배열에 대하여 적용이 가능합니다. 예를 들어 a라는 변수에 적용한다고 하면 그 방식은 a++, ++a, a--, --a 등과 같습니다. 다만 숫자값 자체에는 적용이 불가능하다는 것을 유의해야 합니다. 즉 23++과 같은 방식의 사용은 불가능합니다. 이 연산자들의 역할은 대상 항목의 값을 1씩 증가 또는 감소시키는 것입니다. IDL의 커맨드 프롬프트 상에서 간단히 테스트를 해본 예제는 다음과 같습니다.

 

IDL> a = 23
IDL> a++
IDL> PRINT, a
      24

 

IDL> a = 23
IDL> a--
IDL> PRINT, a
      22

 

그런데 위의 예제에서는 이러한 연산자들을 대상 항목의 뒷부분에 표기하였는데요. 대상 항목의 앞부분에 표기하는 방식도 가능합니다. 즉 다음과 같은 방식입니다.

 

IDL> a = 23
IDL> ++a
IDL> PRINT, a
      24

 

IDL> a = 23
IDL> --a
IDL> PRINT, a
      22

 

이 예제들만 보면 앞부분 및 뒷부분 표기 방식 사이의 차이가 전혀 없는 것처럼 보일 수도 있습니다. 하지만 두 방식은 엄연히 차이가 있는데, 특히 이러한 연산자가 더 큰 수식의 한 부분으로 사용될 경우에 그 차이가 극명하게 드러납니다. 그러면 이번에는 그러한 예제를 살펴봅시다.

 

IDL> b = 23
IDL> a = b++
IDL> PRINT, a, b
      23      24

 

이 예제는 기본적으로는 23이라는 값을 담은 변수 b를 a에 대입하는 내용처럼 보이지만, 대입하는 대상이 그냥 b가 아니고 b++입니다. 만약 그냥 b였다면 최종 결과는 당연히 a, b 모두 23이 될 것입니다. 하지만 위와 같이 b++가 사용될 경우에는 최종 결과는 a, b가 각각 23, 24가 됩니다. 그 이유는 ++ 연산자는 a = b라는 연산이 먼저 수행된 직후에나 적용되기 때문입니다. 즉 b가 23인 상태에서 그 값이 a에 대입되고, 그 과정이 진행된 이후에 b는 ++ 연산자에 의하여 24로 증가하기 때문입니다. 이와 같이 후행 연산자(postfix)는 주변 수식의 내용이 먼저 진행된 이후에 그 효력이 발동되는 특성이 있습니다. 그와 반대로 선행 연산자(prefix)는 주변 수식의 내용이 진행되기 전에 먼저 그 효력이 발동되는 특성이 있습니다. 따라서 만약 다음과 같이 처리할 경우에는 결과가 달라집니다.

 

IDL> b = 23
IDL> a = ++b
IDL> PRINT, a, b
      24      24

 

여기서는 ++ 연산자가 선행 연산자로 사용되었기 때문에 ++ 연산이 먼저 적용된 후 a = b라는 연산이 진행된 것입니다. 따라서 b가 23에서 24로 증가한 이후 그 값이 변수 a에 대입됩니다. 그렇기 때문에 a, b는 24, 24가 됩니다. 따라서 증가 및 감소 연산자는 선행 또는 후행 연산자의 형태로 사용 가능하며 그 차이가 분명히 존재한다는 것을 유념해야 합니다. 그러면 이번에는 다음과 같이 반복형 구문과 함께 사용하는 예제를 살펴봅시다.

 

IDL> a = 23
IDL> FOR j = 0, 9 DO a++
IDL> PRINT, a
      33

 

이와 같이 초기값이 23인 a에 대하여 ++ 연산을 10회 수행하여 33이란 결과는 얻을 수 있습니다. 만약 a++를 a=a+1로 대체해도 결과는 같을 것입니다. 이번에는 다음 예제를 봅시다.

 

IDL> a = 0
IDL> b = 0
IDL> FOR j = 0, 9 DO b = b + ++a
IDL> PRINT, a, b
      10      55

 

이 예제에서는 초기값이 0인 a를 1씩 증가시켜가면서 그 총합을 b에 누적시키는 작업을 10회에 걸쳐 반복합니다. 즉 1부터 10까지의 총합을 계산하는 작업이라고 볼 수 있습니다. 다만 여기서는 a에 대하여 ++ 연산자를 선행 연산 방식으로 적용함으로써 처음부터 0이 아닌 1로 증가한 상태로 총합의 누적 계산이 진행되도록 한 것을 유의하면 됩니다. 따라서 b의 최종값은 55가 됩니다. 만약 위의 내용에서 ++a를 a++로 바꾸면 어떻게 될까요? 그 결과는 다음과 같습니다.

 

IDL> a = 0
IDL> b = 0
IDL> FOR j = 0, 9 DO b = b + a++
IDL> PRINT, a, b
      10      45

 

여기서는 a에 대하여 ++ 연산자를 후행 연산 방식으로 적용함으로써 a의 초기값이 0인 상태부터 총합의 누적이 진행됩니다. 즉 1부터 10까지가 아니고 0부터 9까지의 총합이 계산된 경우입니다. 따라서 b의 최종값은 45가 됩니다. 그리고 a의 최종값은 10이 됩니다. 어차피 a++ 연산이 마지막으로 수행된 상태의 값이 10이 되기 때문입니다.

 

그 외에도 증가 및 감소 연산자를 단일값 변수 뿐만 아니라 배열에 대하여 적용하는 것도 가능합니다. 예를 들면 다음과 같습니다.

 

IDL> a = INDGEN(5)
IDL> PRINT, a
       0       1       2       3       4
IDL> a++
IDL> PRINT, a
       1       2       3       4       5

 

지금까지 IDL에서 증가 및 감소 연산자를 사용하는 방법 및 예제를 살펴보았습니다. 각 연산자의 적용 방식 및 특성을 이해하고 사용하면 좀 더 효율적인 코딩이 가능할 것입니다. 다만 증가 또는 감소 연산자의 대상이 하나의 수식 내에 중복으로 존재하도록 하는 것은 가급적이면 피하는 것이 좋습니다. 예를 들면 다음과 같은 경우입니다.

 

IDL> b = 23
IDL> a = b++ + b

 

이런 경우에도 물론 결과를 얻을 수는 있지만, 연산 과정 및 결과가 모호해지는 문제가 있습니다. 아마 다른 프로그래밍 언어에서도 마찬가지인 것으로 알고 있는데, 위와 같은 방식으로 처리할 경우의 결과는 그 언어의 버전이나 시스템에 따라 달라질 수도 있습니다. 따라서 위와 같이 혼란을 야기할 수 있는 방식으로 증감 연산자를 사용하는 것은 가급적이면 삼가하는 것이 바람직하다는 것만 유의하면 됩니다.

 

 

반응형