논리 연산자

자바 멀티스레딩
레벨 10, 레슨 5
사용 가능
논리 연산자 - 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(&&)가 옵니다. 따라서 전체 식은 거짓으로 알려지고 두 번째 부분은 필요하지 않습니다."

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

"네."

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION