Backend/☕️ Java
[Java] 자바 쇼트 서킷 (short-circuit)
Hugehoo
2021. 11. 17. 16:21
들어가기에 앞서,
- && 와 & 의 차이를 구분할 수 있는가? 이 둘은 같은 기능을 수행하는가?
- 마찬가치로 || 와 | 에서도 위의 질문을 적용해보자.
- 본 포스팅에서는 위의 질문을 베이스로 자바 쇼트서킷을 풀어보겠다.
자바 쇼트 서킷
- 쇼트 서킷이란, 논리연산자 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) 앞 조건의 결과에 따라 뒷쪽 조건 식의 실행 여부를 결정할 경우에도 사용할수있다.