본문 바로가기

Java/Grammer

[Grammer] & vs &&, | vs ||

자바에는 AND 연산자에는 & 와 &&가 있다. OR 연산자 또한 | 와 || 가 있다.

이번에 해당 연산자들로 인해 서비스에 장애가 생기는 문제가 발생하였다.

&, &&, |, || 연산자의 차이를 간단하게 알아보고자 한다.

크게 & 와 | 는 비트 연산자이고 && 과 || 는 논리 연산자이다.

  • & 와 | 는 먼저 검증하는 결과의 결과와 무관하게 뒤에 검증하는 내용을 검증한다.
  • && 는 먼저 검증하는 결과가 거짓이라면 더 이상 뒤의 내용은 검증하지 않는다.
  • || 는 먼저 검증하는 결과가 참이라면 더 이상 뒤의 내용은 검증하지 않는다.

아래는 테스트를 위한 테스트 코드이다.

public class OperatorTrainingTest {

    private static boolean operate(String message, boolean result) {
        log.info("message: {}, result: {}", message, result);
        return result;
    }

    @Test
    void andOperatorTest() {
        log.info("& Test");
        if (operate("조건 1", Boolean.FALSE) & operate("조건 2", Boolean.FALSE)) {
            log.info("& Test Succeed");
        }
        log.info("&& Test");
        if (operate("조건 1", Boolean.FALSE) && operate("조건 2", Boolean.FALSE)) {
            log.info("&& Test Succeed");
        }
        log.info("| Test");
        if (operate("조건 1", Boolean.TRUE) | operate("조건 2", Boolean.TRUE)) {
            log.info("| Test Succeed");
        }
        if (operate("조건 1", Boolean.TRUE) || operate("조건 2", Boolean.TRUE)) {
            log.info("|| Test succeed");
        }
    }

}

출력 결과는 아래와 같다.
& Test
message: 조건 1, result: false
message: 조건 2, result: false
&& Test
message: 조건 1, result: false
| Test
message: 조건 1, result: true
message: 조건 2, result: true
| Test Succeed
message: 조건 1, result: true
|| Test succeed