++x, --x, +x, -x, !x
x+y, x-y, x*y, x/y, x%y
(x>y) ? a: b
&&와 &는 산출 결과는 같지만 연산 과정이 조금 다릅니다. &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false라는 산출 결과를 냅니다. 왜냐하면 하나라도 false라면 전체 연산식은 false이기 때문입니다. 그러나 &는 두 피연산자 모두를 평가해서 산출 결과를 냅니다. 따라서 &보다는 &&가 더 효율적으로 동작합니다.
- 신용권, 혼자 공부하는 자바, 한빛미디어(2022), p122
논리연산자를 쉽게 이해할 수 있는 부분이다. 하지만 '&'를 논리 연산자로써 바라본 적이 없었기에 처음 글을 읽을 때는 어색했다. 그래도 논리 연산자로써의 '&'가 아닌 비트 연산자로써의 '&'를 들여다보면 인용문의 내용이 왜 그런지 알 수 있게 된다.
public static void main(String args[]){
int x = 9;
int y = 12;
...
if(x > 10 && y > 10){ // x = 9이므로 'x > 10' 논리식의 값은 false
return true; // 'y > 10' 논리식의 결과는 보지 않아도 됨.
}
else{
return false; // false return
}
}
public static void main(String args[]){
int x = 11;
int y = 9;
...
if(x > 10 || y >10){ // x = 11아므로 'x > 10' 논리식의 값은 true
return true; // 'y > 10' 논리식의 결과는 보지 않아도 됨
} // true return
else{
return false;
}
}
논리 연산자 '&&'는 위의 코드에서 보이는 것처럼 앞선 논리식의 결과에 따라 결과가 나온다면 뒤의 논리식은 살펴보지 않아도 된다.
public static void main(String args[]){
int num1 = 0b0010;
int num2 = 0b0011;
System.out.println(num1 & num2); // 0b0010
System.out.println(num1 | num2); // 0b0011
}
나는 연산의 결과가 더 빨라서 '&&'를 사용하기보단 나에게 논리연산자는 '&&'와 '||'이였기에 논리식에 해당 연산자들을 사용해왔다. '&'와 '|'를 논리식에 사용할 수 있다는 것을 새롭게 알게 되었고 왜 2가지 연산자는 앞 뒤 조건을 모두 따지는지 생각해 보았다.
흔히 'bitmasking'이라 불리는 알고리즘에서 '&'와 '|'을 사용한다.
컴퓨터는 내부적으로 10진수가 아닌 모든 데이터와 자료들을 2진수로 표현한다. 이러한 특성을 고려해 'bitmasking'을 사용해 수행 시간 단축, 메모리 효율성 증가 등의 효과를 얻는다.
위의 코드를 보면 2진수 '0b0010'과 '0b0011'을 비트 연산한다.
모든 비트를 'AND', 'OR'을 한 결과를 도출한다. 연산자를 중심으로 양쪽의 값들을 모두 비교하는 특성이 논리 연산자로 사용될 때도 적용된다고 생각해도 무방할 듯하다.
public static void main(String args[]){
int x = 9;
int y = 12;
...
if(x > 10 & y > 10){ // x = 9이므로 'x > 10' 논리식의 값은 false
return true; // 앞의 논리식의 결과로 인해 이미 false를
// return하는 것이 결정되었지만 뒤의 'y >10' 논리식도 점검한다.
}
else{
return false; // false return
}
}
public static void main(String args[]){
int x = 11;
int y = 9;
...
if(x > 10 | y >10){ // x = 11아므로 'x > 10' 논리식의 값은 true
return true; // 앞의 논리식의 결과로 인해 true를
// return하는 것이 결정되었지만 뒤의 'y>10' 논리식도 점검한다.
// true return
}
else{
return false;
}
}