[Java] 자바 쇼트 서킷 (short-circuit)

2021. 11. 17. 16:21☕️ Java

들어가기에 앞서, 

  • && 와 & 의 차이를 구분할 수 있는가? 이 둘은 같은 기능을 수행하는가?
  • 마찬가치로 || 와 | 에서도 위의 질문을 적용해보자. 
  • 본 포스팅에서는 위의 질문을 베이스로 자바 쇼트서킷을 풀어보겠다.

 

자바 쇼트 서킷

  • 쇼트 서킷이란, 논리연산자 AND, OR 을 나타내기 위해 부호 &&,  || 을 사용하는 것을 의미한다.
  • &&, ||&, | 를 비교할 때, 둘은 최종적으로 같은 결과를 내지만 다른 과정을 거친다.
  •  & ,  | : 연산자의 앞 조건식과 뒤 조건식을 둘 다 실행 시킨다.
  • && ,  ||  : 연산자의 앞 조건식의 결과에 따라 뒤 조건식의 실행 여부를 결정한다. 이러한 논리연산자를 특별히 『쇼트-서킷』이라 한다.
  • 쇼트 서킷에서는 &&  앞의 boolean 값이 false 일 때, && 뒤를 굳이 실행하지 않음으로 불필요한 연산을 생략하고
  • 마찬가지로 || 앞의 boolean 값이 false 일 때만 뒤를 실행한다. (|| 앞쪽이 True 라면 뒤를 굳이 연산하지 않는다.)

 

아래에서 코드로 확인해보자.

 

 

And 논리 연산자 쇼트 서킷

class ShortCircuit {

    int x = 0;
    int y = 0;
    
    public void shortCircuitForAnd() {
        if ((5 < 1) && (x++ > y)) {
            y++; // 여기 못들어온다.
        }
        System.out.println("x = " + x + ", y = " + y);

        if ((5 < 1) & (x++ > y)) {
            y++; // 여기 못들어온다.
        }
        System.out.println("x = " + x + ", y = " + y);
    }


    public static void main(String[] args) {
        ShortCircuit shortCircuit = new ShortCircuit();
        shortCircuit.shortCircuitForAnd();
    }
}

첫번째 if 문의 && 앞쪽이 false 이기에 뒤쪽 연산은 진행될 수 없다.

즉 x++ 라는 연산은 수행되지 않기 때문에, 첫번째 출력문에서 x 는 그대로 0이 나온다.

 

두번째 if 문에서도 & 앞쪽은 false 이지만 쇼트 서킷과 달리, & 뒤쪽의 x++ 연산이 수행된다.

때문에 두번째 출력문에서 x 값은 1이 된다.

// shortCircuitForAnd 결과
x = 0, y = 0
x = 1, y = 0

 

 

OR 논리 연산자  쇼트 서킷 

class ShortCircuit {

    int a = 0;
    int b = 0;


    public void shortCircuitForOR() {
        if ((5 > 1) || (a++ > b)) {
            b++; // 여기 들어온다.
        }
        System.out.println("a = " + a + ", b = " + b);

        if ((5 > 1) | (a++ > b)) {
            b++; // 여기 들어온다.
        }
        System.out.println("a = " + a + ", b = " + b);
    }

    public static void main(String[] args) {
        ShortCircuit shortCircuit = new ShortCircuit();
        shortCircuit.shortCircuitForOR();
    }
}

OR 쇼트 서킷 연산에서 || 앞쪽의 결과가 true 이기 때문에, || 뒤쪽의 조건식은 수행되지 않는다. 

(만약 앞쪽의 조건식이 (5 < 1) 로 false 였다면, || 뒤쪽 조건식은 그대로 수행된다) 

첫번째 if 문은 True이기 때문에 if 내부 연산이 진행되어 b 값은 1이 추가된다.

 

두번째 if 문의 || 연산자도 앞 조건식은 true 지만, 쇼트서킷과 달리 || 뒤쪽의 조건식을 수행한다. 

때문에 a++ 와 b++ 모두 연산이 진행되어, 두번째 출력문에서는 a 와 b 모두 1씩 추가된 결과가 나온다.

// shortCircuitForOr 결과
a = 0, b = 1
a = 1, b = 2

 

 

정리하자면,

  • 쇼트 서킷의 장점1) 불필요한 코드 실행을 막음으로 작업의 연산 속도를 높일 수 있고, 
  • 2) 앞 조건의 결과에 따라 뒷쪽 조건 식의 실행 여부를 결정할 경우에도 사용할수있다.