boolean bool1 = true;
boolean bool2 = false;
boolean bool3 = !true;
boolean bool4 = !false;
boolean bool5 = !!bool3;
boolean bool6 = !!!bool3;
boolean bool7 = !(1 > 2); // true
boolean bool8 = !((5 / 2) == 2.5); // true
boolean bool9 = !((3f + 4.0 == 7) != ('A' < 'B')); // true
true, false 가 표시됨a
&&b (AND): a와 b가 모두 true일때만 true 반환
a||b (OR): a와 b 중 하나만 true면 true 반환
boolean bool1 = true && true;
boolean bool2 = true && false;
boolean bool3 = false && true;
boolean bool4 = false && false;
boolean bool5 = true || true;
boolean bool6 = true || false;
boolean bool7 = false || true;
boolean bool8 = false || false;
int num = 4;
boolean isPositiveAndOdd = num >= 0 && num % 2 == 1; // false
boolean isPositiveOrOdd = num >= 0 || num % 2 == 1; // true
boolean isPositiveAndEven = num >= 0 && num % 2 == 0; // true
boolean isPositiveOrEven = num >= 0 || num % 2 == 0; // true
num = 6;
// 💡 &&가 ||보다 우선순위 높음
boolean boolA = (num % 3 == 0) && (num % 2 == 0) || (num > 0) && (num > 10); // true
boolean boolB = (num % 3 == 0) && ((num % 2 == 0) || (num > 0)) && (num > 10); // false
연산자의 우선순위를 다 알아두면 당연히 좋겠지만, 그렇게 하는 것보다는 괄호를 잘 활용해주는게 개발을 조금 더 손쉽게 할 수 있는 길일 것이다.
&&: 앞에 것이 false 면 뒤의 것을 평가할 필요가 없음|| : 앞에 것이 true 면 뒤의 것을 평가할 필요가 없음 단축평가는 다른 언어에서도 존재하는 개념이다. 당연한 개념이지만, 조건의 평가가 반복되는 것은 컴퓨터로서는 자원의 낭비이다. 만약 AND나 OR 뒤에 오는 코드가 단순히 boolean을 반환할 뿐만 아니라 어떠한 변수의 값을 변경하거나 하는 부수효과 를 일으키는 코드라면 그 값의 변경이 앞에 코드에 영향을 받는 것이다.
int a = 1, b = 2, c = 0, d = 0, e = 0, f = 0;
boolean bool1 = a < b && c++ < (d += 3);
boolean bool2 = a < b || e++ < (f += 3);
boolean bool3 = a > b && c++ < (d += 3); // 🔴
boolean bool4 = a > b || e++ < (f += 3);
디버깅 포인트를 찍고 디버깅을 해보면 c와 d의 값은 변경되는 것을 볼 수 있지만 e와 f의 값은 변경되지 않는 것을 볼 수 있다. 왜냐하면 이미 bool1의 경우에는 a<b 가 true이고 AND연산이므로 뒤에 코드까지 진행하지만, bool2의 경우에는 OR 연산이고, a<b 가 확인된 순간에 코드의 진행이 끝나기 때문이다. 다시한번 말하지만 OR 연산은 앞에가 true면 뒤에 것을 굳이 확인하지 않는다.
위의 사항을 명심하고 다시 bool3 과 bool4 를 확인해보자. 이번에는 위와 반대 현상이 나타난다. c와 d의 값은 변경되지 않지만, e와 f 의 값은 변경된다. 이유는 위와 반대인데, 이미 a>b 가 false로 확인된 순간 bool3 의 코드 진행은 끝난다. 왜냐하면 AND 연산은 앞에가 false로 확인되면 뒤의 코드를 진행하지 않기 때문이다. bool4 는 OR 연산이기 때문에 앞에가 false여도 뒤의 코드를 진행시켜서 e와 f 의 값은 변경된다.
? b : c int num1 = 3, num2 = 4;
char num1OE = num1 % 2 == 1 ? '홀' : '짝';
char num2OE = num2 % 2 == 1 ? '홀' : '짝';
int num = 3;
// 아래 값들을 바꿔가며 실행해 볼 것
boolean mult2 = true;
//mult2 = false;
boolean plus5 = true;
//plus5 = false;
System.out.println(
(!mult2 && !plus5) ? num
: (mult2 && plus5) ? num * 2 + 5
: mult2 ? num * 2
: num + 5 // 11이 출력
);
int x = 1, y = 2;
// 💡 단축평가 적용됨
int changed1 = x < y ? (x += 2) : (y += 2);
int changed2 = x < y ? (x += 2) : (y += 2); // 🔴
int changed3 = x < y ? (x += 2) : (y += 2);
int changed4 = x < y ? (x += 2) : (y += 2);
int changed5 = x < y ? (x += 2) : (y += 2);
삼항연산자 역시 단축평가가 적용된다. a ? b : c 라는 식은 만약 a가 true이면 b가 반환되고 false이면 c가 반환된다. 이 때, 만약 b가 반환되면 c에 있는 부분은 실행되지 않고, c가 반환되면 b에 있는 부분은 실행되지 않는다.