Java/Java

Java - Short Circuit

Dlise 2023. 12. 4. 17:48

Short Circuit(쇼트서킷)에 대해 알아보자.

 

Short Circuit

Short Circuit(쇼트서킷)은 짧은 순회라는 의미로

여러 개의 조건을 검색할 때 앞에서 답이 정해졌으면 뒤의 조건을 확인하지 않는 것이다.

 

아래는 Short Circuit 동작을 알 수 있는 예시이다.

if문 조건으로 a == 0 이거나 ++a == 1인 경우 a의 값을 출력하도록 했다.

public class Main {
    public static void main(String[] args) {
        int a = 0;
        if(a == 0 || ++a == 1) {
            System.out.println("result : " + a);
        }
    }
}

++a 코드가 있음에도 불구하고 결과는 1이 아닌 0이다.

 

그 이유는 a == 0이 이미 true이므로 뒤의 조건을 탐색하지 않았기 때문이다.

이로써 Short Circuit이 있다는 것을 알았다.

 

Short Circuit 동작을 하는 경우

Short Circuit 동작을 하는 경우는 아래와 같다

 

1. OR(논리합) 연산 시 true가 나온 경우

위의 예제와 같은 경우로 앞에서 true가 나왔다면 이후의 조건 결과와 상관없이 최종 결과는 true이다.

따라서 이후의 조건은 확인하지 않는다.

 

2. AND(논리곱) 연산 시 false가 나온 경우

앞에서 false가 나왔다면 이후의 조건 결과와 상관없이 최종 결과는 false이다.

따라서 이후의 조건은 확인하지 않는다.

 

 

Short Circuit의 장점

Short Circuit의 장점은 아래와 같다.

 

1. 리소스와 시간 낭비를 줄일 수 있다.

경우에 따라 뒤의 조건을 확인하지 않으므로 낭비를 줄인다.

 

이를 활용하면 조금이라도 더 효율적인 코드를 작성할 수 있다. 예를 들어

AND(논리곱) 연산이라면 false일 가능성이 높은 조건을 앞에 두고

OR(논리합) 연산이라면 true일 가능성이 높은 조건을 앞에 두는 것이다.

 

이처럼 작성하면 리소스를 아낄 수 있다.

 

2. 조건 순서에 따라 다르게 동작하므로 코드를 유연하게 구현할 수 있다.

아래는 2번 장점의 한 예로 코딩테스트 문제에서 배열 이동을 할 때 유용하게 사용할 수 있다.

    public void method(int N, int x, int y) {
        int[][] board = new int[N][N];

        int[] dx = {0, 1, 0, -1};
        int[] dy = {-1, 0, 1, 0};
        int dir = 0;
        
        for(int i = 0; i < N; i++) {
            int xx = x + dx[dir];
            int yy = x + dy[dir];

            // Short Circuit
            if(xx < 0 || x >= N || yy < 0 || yy >= N || board[xx][yy] != 0)
                continue;

            /* ... */
        }
    }

 

위의 예제와 같이 if문을 활용하는 것이다.

 

if(xx < 0 || x >= N || yy < 0 || yy >= N || board[xx][yy] != 0)

먼저 앞에서 배열의 범위를 벗어나는지 검사하고 벗어나지 않는다면 배열 내부의 값을 검사한다.

 

이런 식으로 활용하면 java.lang.ArrayIndexOutOfBoundsException을 예방할 수 있다.