논리 연산자 - 1

"안녕, 아미고!"

"이제 우리는 논리 연산자에 대한 작은 교훈을 얻을 것입니다."

"알고 있는 논리 연산자는 무엇입니까?"

— OR(||), AND(&&), NOT(!)

"그래. 잘했어. 어떻게 작동하는지 기억하니?"

"예."

"OR은 하나 이상의 피연산자가 참일 때 참을 산출합니다."

"AND는 두 피연산자가 모두 참일 때 참을 산출합니다."

"NOT는 true를 false로, false를 true로 변경하지 않습니다."

"그렇습니다. 그리고 이 표현식에서 연산자는 어떤 순서로 평가됩니까?"

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b || !c && b || !a;

"이것은 모두 매우 간단합니다."

"먼저 NOT(!), 그 다음 AND(&&), 그 다음 OR(||) 맨 끝에."

괄호를 추가하면 다음과 같이 됩니다.

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a && b) || ((!c) && b) || (!a);

"맞습니다. 잘하셨습니다. 결과는 어떻습니까?"

— 1) (a && b) == (참 && 거짓) == 거짓

2) ((!c) && b) == (거짓 && 거짓) == 거짓

3) (!a) == 거짓

4) 거짓 || 거짓 || 거짓 == 거짓

"결과는 거짓입니다."

"주제를 완벽하게 알고 있는 것 같군요. 그럼 몇 가지 작은 비밀을 알려드리겠습니다."

"첫째, 논리식은 왼쪽에서 오른쪽으로 평가됩니다."

"두 번째, 여기에서는 단락 평가가 사용됩니다(계산은 필요한 경우에만 수행됨). 표현식의 일부를 평가하여 최종 결과를 이미 알고 있는 경우 나머지 표현식은 평가하지 않습니다."

boolean result = (true && false) || (true && true) || (true && false);

"이 식은 OR(||) 연산자로 구분된 세 부분으로 나뉩니다."

"적어도 한 부분이 참이면 대답은 참이고 다른 것은 고려할 필요가 없습니다. 따라서 식은 다음과 같이 평가됩니다."

1)  첫 번째 부분 평가:  (true && false) == false

2)  두 번째 부분 평가:  (true && true) == true

3) 대답이 참일 것이라는 것이 이미 분명하기 때문에 세 번째 부분을 평가하지 않습니다 .

"이 접근 방식을 게으른 평가라고도 합니다."

"좋아요. 그리고 뭐가 그렇게 특별한가요?"

"아무것도 없습니다. 식 내에서 메서드 호출을 시작할 때까지입니다. 식의 일부를 건너뛰면 건너뛴 부분의 메서드가 호출되지 않습니다."

"하지만 이 접근 방식은 매우 보편화되었습니다. 그 이유는 다음과 같습니다."

예:
Job job = null;

if (job != null && job.isDone())
{}

"식을 평가할 때 작업이 null이면 job.isDone() 호출이 발생하지 않습니다!"

"실제로 식의 첫 번째 부분은 거짓이고 뒤에 AND(&&)가 옵니다. 따라서 전체 식은 거짓으로 알려지고 두 번째 부분은 필요하지 않습니다."

"맞아요. 좋은 기술이죠?"

"네."