Groovy 1.x에서부터 as나 cast 연산자의 우선순위가 잘못되는 문제가 있었던 모양입니다. 프로그래밍 중 우연히 발견하고 찾아보니 관련 이슈 GROOVY-5185가 존재하네요. 2011년에 제기된 문제인데 해결이 쉽지 않은지 아직까지 계속되고 있습니다.
(int) (-1 / 3) + 1가 원래는 ((int) (-1 / 3)) + 1로 동작해서 1이 나와야 정상인데 현재는 (int) ((-1 / 3) + 1)로 동작하여 0이 나옵니다.
유사한 as 연산자를 이용하여 (-1 / 3) as int + 1을 시도할 경우 파서가 int + 1을 파싱 시도하다가 문법 오류가 발생합니다.
임시방편으로 번거롭지만 프로그램의 예상치 못한 버그로 이어지지 않도록 두 연산자 사용 시 괄호를 확실히 적어주는 것이 좋습니다.
(int) (-1 / 3) + 1가 원래는 ((int) (-1 / 3)) + 1로 동작해서 1이 나와야 정상인데 현재는 (int) ((-1 / 3) + 1)로 동작하여 0이 나옵니다.
유사한 as 연산자를 이용하여 (-1 / 3) as int + 1을 시도할 경우 파서가 int + 1을 파싱 시도하다가 문법 오류가 발생합니다.
임시방편으로 번거롭지만 프로그램의 예상치 못한 버그로 이어지지 않도록 두 연산자 사용 시 괄호를 확실히 적어주는 것이 좋습니다.
- ((int) (-1 / 3)) + 1
- ((-1 / 3) as int) + 1
위 식의 경우 Groovy에서 기본 제공하는 intdiv 메소드를 이용하는 방법도 있습니다.
- (-1).intdiv(3) + 1




덧글