1. 비교연산 종류
2. 비교연산 실습
3. 논리연산 종류
4. 논리연산 실습
1. 비교연산 종류
비교연산이란 두 항의 관계를 나타내는 연산자로 크기를 비교하거나 같은지 여부를 비교하는 연산입니다.
연산식 | 설명 |
A > B | A항이 B항보다 큰지 비교 |
A >= B | A항이 B항보다 크거나 같은지(이상) 비교 |
A < B | A항이 B항보다 작은지 비교 |
A <= B | A항이 B항보다 작거나 같은지(이하) 비교 |
A == B | A항과 B항이 같은지 비교 |
A != B | A항과 B항이 다른지 비교 |
2. 비교연산 실습
비교연산 기호를 기준으로 왼쪽항과 오른쪽항을 비교하게 되며, 모든 비교연산은 결과값이 true / false 둘 중 하나로만 나오게 됩니다. 두 항을 비교한 결과가 맞는지(참), 맞지 않는지(거짓)를 비교하는 것인데요. 6종류 연산자 중 크기를 비교하는 4가지 연산(>, >=, <, <= : 숫자 데이터만 사용 가능)과 같은지(==) 다른지(!=)를 비교하는 연산자로 이루어져 있습니다. 대입연산과는 다르게 같다라는 비교는 = 기호가 하나가 아니라 두 개라는 것을 꼭 기억하세요. 그리고 ! 기호는 반대라는 뜻이되어 != 연산자는 ‘같지 않다’ 라는 의미를 가지게 됩니다. ==, != 연산자는 모든 종류의 데이터에 사용이 가능합니다. 예제를 보며 결과를 출력해보겠습니다.
public class OperationSample4 {
public static void main(String[] args) {
int a = 10;
int b = 5;
System.out.println(a > b); // true
System.out.println(a >= b); // true
System.out.println(a < b); // false
System.out.println(a <= b); // false
System.out.println(a == b); // false
System.out.println(a != b); // true
}
}
위 예제는 변수 a는 10을, 변수 b는 5를 대입하고, 이 두 변수를 비교연산하여 출력한 코드입니다. a가 b보다 크므로, a > b, a >= b 모두 true이고, a < b, a <= b의 결과는 false를 출력합니다. 같은지 비교하는 == 연산결과는 10과 5는 같지 않으므로 false를 출력하고, != 연산은 같지 않은지 비교하는 연산자이므로 true를 출력합니다. 이렇게 모두 true 아니면 false의 결과로만 출력되며 이는 boolean 연산자 이므로 이 연산의 결과 역시 boolean 자료형 변수에 대입할 수 있습니다.
boolean c = a == b; // c 변수에 결과값 대입
System.out.println("c = "+c);
boolean d = c == false ; // d 변수에 결과값 대입
System.out.println("d = "+d);
실행결과
c = false
d = true
이 예제에서 c라는 boolean 자료형 변수에 a와 b의 == 연산결과 10과 5가 같은지 비교연산의 결과 (false)가 대입되어, c변수를 출력하면 false가 출력되고, 변수 d는 앞의 c변수가 false이므로 false == false 는 값이 같으므로 true가 대입된다.
비교연산의 결과는 항상 boolean 값이며, 그래서 이 값 역시 boolean 자료형에 대입될 수 있는 것입니다.
3. 논리연산 종류
논리연산의 개념은 수학에서 논리연산과 동일합니다. 논리곱(AND), 논리합(OR), 배타적 논리합(XOR), 논리부정(NOT) 4가지가 있으며, 연산의 대상이 되는 피연산자, 연산의 결과 모두 boolean 자료형만 가능합니다. 아래 표를 확인해보겠습니다.
종류 | A항 | 연산자 | B항 | 결과 | 설명 |
AND | true | && (&) | true | true | 양쪽 항 모두 true인 경우만 결과값 true |
true | false | false | |||
false | true | false | |||
false | false | false | |||
OR | true | || ( | ) | true | true | 두 항 중 하나 이상의 항이 true인 경우 결과값 true |
true | false | true | |||
false | true | true | |||
false | false | false | |||
XOR | true | ^ | true | false | 두 항 중 하나의 항만 true인 경우 결과값 true |
true | false | true | |||
false | true | true | |||
false | false | false | |||
NOT | ! | true | false | 반대 값 | |
false | true |
4. 논리연산 실습
먼저 and 연산은 연산자를 기준으로 왼쪽항과 오른쪽항이 모두 true인 경우 결과값이 true가 됩니다. and는 ‘그리고’ 라는 의미가 있으므로, A항도 true이고, 그리고 B항도 true이면 결과는 true 입니다. 연산자 기호는 &&나 &를 사용합니다.
or 연산은 ‘또는’ 이라는 의미인데요. A항 또는 B항이 true인 경우 결과값이 true가 됩니다. 즉 두 항 중 하나 이상이 true이면 결과는 true인 것이죠. 하나 이상인 경우이기 때문에 양쪽항 모두 true인 경우도 결과는 true가 됩니다. or 연산자는 ||나 |를 사용합니다.
xor 연산은 양쪽 항 중 하나의 항이 true인 경우인데, 다르게 표현하면, 두 항의 값이 다르면 true 입니다. 한쪽은 true, 한쪽은 false 인 경우입니다. 연산자는 ^기호를 사용합니다.
그리고 NOT은 우리말로 반대라는 뜻을 가지고 있고, 연산기호 역시 비교연산에서도 봤던 반대의 의미를 가지고 있는 !기호를 사용합니다. 값이 true이면 false를 값이 false이면 true를 나타낸다. 즉, 가지고 있는 값의 반대 값으로 나타낸다고 생각하시면 됩니다. &&, ||, ! 연산자는 boolean 타입의 데이터에만 사용해야 하고 결과도 boolean 타입이지만 &, ^, | 연산자는 boolean 타입의 데이터와 정수 타입의 데이터 모두 사용 가능한데, boolean 타입의 데이터의 경우는 boolean 타입으로 결과가 리턴되고 정수 타입 데이터의 경우는 정수를 2진수로 변환해서 1은 true로 0은 false로 간주하고 각 비트별로 연산한 후 10진수로 결과를 리턴합니다.
public class OperationSample5 {
public static void main(String[] args) {
int a = 10;
int b = 5;
// AND 연산
System.out.println(a > b && a == 10); // true
System.out.println(a > b && a == b); // false
// OR 연산
System.out.println(a > b || a == b); // true
System.out.println(a < b || a == b); // false
// XOR 연산
System.out.println(a > b ^ a == 10); // false
System.out.println(a > b ^ a == b); // true
// NOT 연산
System.out.println(!(a > b)); // false
System.out.println(!(a < b)); // true
}
}
실행결과
true
false
true
false
false
true
false
true
위 예제 코드를 위에서부터 차례대로 살펴보면 변수 a는 10, 변수 b는 5가 대입되어 있고, 왼쪽, 오른쪽항이 모두 true인 경우 출력된 결과도 true가 출력됩니다. 두번째 출력문에서 a == b는 false 이므로 논리연산의 결과는 false가 됩니다. OR 연산은 두 항 중 하나 이상의 항이 true인 경우 결과가 true인데 a < b와 a == b 이 두 항 모두 false이므로 false가 출력되었고, XOR 연산은 양쪽 항이 모두 true일 때 결과값은 false, 둘 중 하나만 true인 경우 true값이 출력되었습니다. 마지막 NOT 연산은 반대의 뜻이며 !(a > b)처럼 괄호로 감싼 이유는 ! 부정 연산 전에 a > b라는 비교연산을 먼저 실행하기 위해 우선순위를 적용한 것입이다. 이 비교연산의 결과는 true이며 true의 반대는 false가 됩니다.
그런데, AND연산과 OR연산을 보면 &기호가 두 개, |기호가 두 개씩 사용된걸 알 수 있는데요, && 연산자와 &연산은 아래 예제와 같이 동일한 결과를 나타냅니다.
int a = 10;
int b = 5;
// 모두 false
System.out.println(a == b && a > b);
System.out.println(a == b & a > b);
위 예제를 실행해 보면 모두 false가 출력됩니다. 그럼 &&와 &는 어떤 차이가 있는 것일까요? 최종 결과는 양쪽 항이 모두 true일때만 결과도 true라는 연산결과를 나타낸다는 것은 같지만 && 연산은 만약 왼쪽항이 false라면 오른쪽항은 확인을 하지 않습니다. 위 예제처럼 a == b라는 비교연산의 결과값은 false가 됩니다. 따라서 a > b의 결과가 true인지, false인지 여부와 상관없이 이미 왼쪽항이 false 이므로 최종 논리연산의 결과는 무조건 false가 되는것이죠. 따라서 왼쪽 항 a가 b보다 큰지 확인하지 않게 됩니다.
반대로 OR연산에서 ||를 사용하는 경우 왼쪽항이 true라면 오른쪽항의 여부(true인지 false인지)와 상관없이 무조건 true이므로 오른쪽항은 확인하지 않습니다. 그림으로 확인해 보겠습니다.
이렇게, AND연산과 OR연산에서 왼쪽항의 결과에 따라 오른쪽항의 여부에 상관없이 이미 결과값이 정해졌다면 오른쪽항을 확인하지 않는 것을 숏컷(shortcut)연산이라고 부릅니다. 이 숏컷연산이 사용되는 경우를 예제를 통해 살펴보겠습니다.
public class OperationSample5_2 {
public static void main(String[] args) {
int a = 10;
int b = 5;
// & 연산
System.out.println(a == b & test());
// && 연산
System.out.println(a == b && test());
}
public static boolean test() {
System.out.println("test()메서드 실행됨");
return true;
}
}
실행 결과
false
false
아직 메서드를 배우지 않았지만 우선은 "test()메서드 실행됨"이라고 출력하고 true값을 돌려주는 기능을 하는 것이라고 일단 알아두시고 나머지 코드를 보겠습니다. a == b 와 test()의 결과값 true를 &연산을 한것인데, &를 기준으로 왼쪽항 a == b는 false이고, 오른쪽항 test()는 true값을 돌려주고 있기 때문에 이 메서드는의 결과값은 true 입니다. 따라서 false & true 논리연산식이 되어 전체 논리연산식의 결과값은 false가 출력되는데, 실행 결과를 보면 false라고 출력되기전 “test()메서드 실행됨”이라고 출력된 것을 볼 수 있습니다. test() 메서드가 실행된 것이죠. 다음 && 연산을 보면 논리연산 자체는 동일하지만 false만 출력되고 test() 메서드가 실행되지 않았습니다. "test() 메서드 실행됨" 이라는 구문이 출력되지 않았죠?
즉, a == b가 이미 false이므로 &&를 기준으로 오른쪽항이 true이던, false이던 이미 이 논리연산의 결과값이 false라고 결정이 되어 오른쪽항을 확인하지 않는 것입니다. 그럼 이러한 차이를 어떤 경우에 사용하는 것일까요? 첫 번째는 프로그램의 실행속도를 높일 수 있습니다. 미세한 차이지만 복잡한 프로그램일수록 오른쪽 항을 실행해보지 않는다면 약간의 속도를 높일 수 있으며, 두 번째는 방어코드를 작성할 수 있습니다. 방어코드란 에러를 사전에 예측해서 프로그램이 중단되는 현상을 막을 수 있는 것입니다. 여기서는 이해가 필요한 부분이니 아래 코드를 보고 꼭 이해하고 넘어가세요.
public class OperationSample5_3 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// & 연산
System.out.println(b > 0 & (a / b > 0));
}
}
눈으로 보면 정상적인 코드로 보이지만 실행해 보시면 에러가 발생합니다.
Exception in thread "main" java.lang.ArithmeticException: / by zero at test/chapter04.OperationSample5_3.main(OperationSample5_3.java:11)
위 예제에서 변수 b의 값에 어떤값이 올지 알수 없는 사용자 입력값이나 데이터베이스의 값이라고 가정하고 나누기 연산을 해야하는 프로그램이라고 생각해보겠습니다. 만약 0값이 오는 경우 0으로 나누면 에러가 나게 되는데요. 논리연산에서 b > 0, b 변수가 0보다 크다라는 비교연산이 들어가긴 했지만, 오른쪽항에서 a / b, 변수 a를 0으로 나누는 연산에서 에러가 발생하게 됩니다. 이를 막기 위해 아래 예제처럼 & 대신 &&를 쓰게 됩니다.
public class OperationSample5_3 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// & 연산
System.out.println(b > 0 && (a / b > 0));
}
}
동일한 소스에 논리연산기호만 &에서 &&로 바꾼 것입니다. 그러면 (a / b > 0) 이 연산식은 실행되지 않기 때문에 실행 결과가 false가 나옵니다. 지금은 조금 어려운 개념일 수 있지만, &&와 &, ||와 |는 같은 결과를 나타낸다고 해서 혼용해서 사용하지 말고, 논리연산을 하는 경우 우선 습관적으로 and, or연산자 기호는 두 개를 사용하도록 하세요.