콘텐츠로 건너뛰기

자바 논리연산의 단축평가(short-circuit)

단축평가(short-circuit)란 무엇인가?

Short-circuit은 단락 이라는 뜻도 있네요
Short-circuit은 단락 이라는 뜻도 있네요

우선 간단한 예제를 봅시다.

public class ShortCircuit {

    public static void main(String[] args) {
        int a = 6;
        int b = 6;

        if ((a++ < 6) && (++b < 6)) {
            a = 10;
        }
        System.out.println("a의 값 : " + a + " b의 값 : " + b);
    }
}

설명을 위해 급조한 엉성한 예제입니다. 그래도 설명은 되니까 일단 봅시다. 위의 자바 코드를 컴파일해서 실행하게 되었을 때 최종적으로 변수 a와 b의 값은 각각 무엇이 될까요?

소스 코드에는 무시무시한 함정이 숨어있습니다. 조건문의 논리연산 조건으로 들어있는 “++”의 위치에 따른 전위연산, 후위 연산을 따지려 하는 것일까요?

제가 확인해 본 바로는 자바와 함께 C, 자바스크립트, VB 등의 언어의 논리연산에서 단축평가가 행해집니다. 일단 눈으로 확인한 건 나열한 언어들이지만 대부분의 언어가 그렇지 않을까 생각됩니다.

우선 위 문제의 답은 a는 7, b는 6입니다.

논리연산에서 논리표현 식은 왼쪽에서 오른쪽의 방향으로 평가됩니다. &&연산의 경우에 왼쪽의 논리값이 false일 경우엔 오른쪽이 true이든 false이든 관계없이 false가 되므로 오른쪽의 값은 확인해 보지 않습니다. 따라서 위 코드의 if 문은 속의 논리연산은 “(a++ <6)”부분만을 수행하며 값이 false이기 때문에 우측의 “(++b <6)”는 평가하지 않고 전체를 false로 평가하게 됩니다. 그러므로 a의 값은 1이 증가하여 최종적으로 7이 되는 것이고 b의 변수가 있는 부분은 수행되지 않으므로 6의 값이 남게 됩니다.

동일하게 ||연산에서도 단축평가가 적용됩니다. &&과 ||은 이렇게 됩니다.

  • (false) && (아무개) 는 “아무개”부분을 수행하지 않고 false로 평가
  • (true) || (아무개)는  “아무개”부분을 수행하지 않고 true로 평가

하게 됩니다. 이것이 단축평가(short-circuit)인 것이지요.

하지만 이것과 다르게 &, |가 비트연산이 아닌 boolean을 가지고 논리연산을 하게 될 경우에는 &&, ||과 다르게 단축평가를 하지 않습니다. &, |이 논리연산을 하게 되는 경우에는 좌측과 우측 모두 수행하게 됩니다.

“String 변수의 동일한 문자열에 대해서 하나의 참조”와 같이 눈여겨 봐두지 않으면 그냥 넘어가기 쉬운 그런 원리 중에 하나입니다. 근래에 읽은 “임백준의 소프트웨어 산책”이라는 책에서 책 속의 주인공이 면접을 볼 때 자바의 String에 관한 문제가 나오고 주인공은 손쉽게 그 문제를 푸는 짤막한 한 줄의 내용이 있는데 그 부분을 읽을 때 괜히 가슴이 두근두근 뛰는 거 있죠? 사실 String 객체에 관해서는 “다음 개발자 네트워크”의 “개발자가 놓치기 쉬운 자바의 기본원리”라는 글을 통해서 알게 되었고 좀 살펴본 게 있어서 저도 정답을 알고 있었거든요^^ㅋ

단축평가라는 것도 알게 된 김에 블로그에 이렇게 한번 정리해 봅니다. “임백준의 소프트웨어 산책”은 책을 다 읽고 2번째 읽기에 들어가고 있습니다. 처음 볼 때 잘 이해되지 않던 부분들이 지금 제가 공부하는 것들과 맞물려 조금씩 이해가 되고 있거든요. 잘 이해가 되지 않았던 여러 가지 것들… C++과는 다르게 단일상속만을 지원하는 자바에서의 인터페이스를 이용한 다중상속을 구현(코드를 짤 때 사용은 했었지만 세세한 부분은 지금에서야 이해, 상속과는 다르지만), 다형성(폴리모피즘)에서 파라메트릭 폴리모피즘과 자바 1.5버전에서의 generics 등에 대해서 처음 읽을 때보다 머릿속에 좀 더 구체화 되어서 이해가 됩니다. XML에 대해서는 공부를 진행하면서 탄생과 발전, 현재를 섞어서 머리에 정리해 봐야겠습니다. XML을 제대로 다뤄보고 알지 못하고선 탄생과정과 발전 과정, 과도기의 모습 이런 걸 읽어도 직접적으로 와닿지 않아서요. XML을 만지작거려보긴 했지만 뭘 알고 만졌어야 머릿속에 남아있죠^^ㅋ 소프트웨어 산책 책에 XML에 관련된 부분이 나올 땐  그냥 감만 잡고 읽었답니다…;;

좋아하는 것을 공부할 수 있는 것이 가장 행복해요.


8 개의 댓글

    1. 실수하게되면 찾아내기 참 애매한 문제같아요^^ㅋ

      처음엔 자바만 단축평가를 하는줄 알았는데 대부분의 언어가 똑같더라구요.

    1. 정보 감사합니다^^ㅋ

      므히힛~ 라온수카이님께서 댓글을 달아주시기 얼마전에 신청을 했답니다^^ㅋ

      그런데.. 수신확인이 안되네요..;;; 제 메일만 안읽는 것일까요??;;;

  1. 그리고 보니 올해 초에 저거에 당했었죠 ㅎㅎ
    곰곰히 생각해보니 나중에 단축평가에 대해 생각이나서 디버깅을 ㅋㅋ

    1. 이미 단축평가에 대해서 알고 계셨군요..;;
      저는 이 글을 쓰기 바로 전날 처음 알았답니다..;;;

      항상 저보다 한발작 앞서나가시네요..ㅎ

  2. 마지막 문장, 정말 부럽습니다.

    좋아하는 것을 공부할 수 있는 행운!
    (위에 전문적인 내용들은 전혀 이해할 수 없지만요)

    화이삼^^

    1. 공부도 때가 있다는게 사실 인가봐요. 예전엔 그렇게도 싫어했던 공부가 요즘엔 왜 이렇게 좋은지 모르겠어요.

      흰우유님도 여름에 지치시지 말고 화이팅이에요^^ㅋ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다