프로그래밍 언어/JAVA

[JAVA] 자바의 비교&논리 연산자

Rateye 2021. 1. 18. 13:45
728x90
반응형

비교(관계) 연산자

  • 두 피연산자 간의 대소 관계 비교를 수행하는 연산자
  • 연산 수행 결과는 true 또는 false 값으로 나타냄
  • => 연산 결과를 출력문에서 출력하거나, boolean 타입 변수에 저장
  1. == (동등 비교 연산자) : 두 피연산자가 같은지 비교
  2. != (Not Equal) : 두 피연산자가 같지 않은지(다른지) 비교
  3. >, >=, <=, < : 두 피연산자의 대소 관계 비교
		int a = 10, b = 4;
		
		System.out.println(a == b); // a 와 b 가 같은지 판별 결과 출력
		// => a 와 b 는 같지 않으므로 false 가 리턴되어 출력됨
		
		System.out.println(a != b); // a 와 b 가 다른지 판별
		// => a 와 b 는 다르므로(같지 않으므로) true 가 리턴되어 출력됨
		
		System.out.println(a > b); // a 가 b 보다 큰지 판별
		// => a 가 b 보다 크므로 true 가 리턴되어 출력됨
		
		System.out.println(a >= b); // a 가 b 보다 크거나 같은지 판별
		// => a 가 b 보다 크거나 같으므로 true 가 리턴되어 출력됨
		
		System.out.println(a <= b); // a 가 b 보다 작거나 같은지 판별
		// => a 가 b 보다 작거나 같지 않으므로 false 가 리턴되어 출력됨
		
		System.out.println(a < b); // a 가 b 보다 작은지 판별
		// => a 가 b 보다 작으므로 false 가 리턴되어 출력됨
		
		// 대소 관계 비교 결과를 boolean 타입 변수에 저장할 수 있다!
		boolean result = a > b; // a > b 판별 결과가 result 에 저장됨
		System.out.println("result = " + result);
		
		// 산술 연산자 등과 결합하여 사용할 수 도 있다!
		// => 두 연산 결과를 비교연산자로 비교 가능
		//		boolean result2 = a + b > a - b;
		// => 산술연산자가 비교연산자보다 우선순위가 높으므로
		//    별도의 괄호를 표시하지 않아도 산술연산을 먼저 수행함
		
		// 만약, 명확하게 산술연산을 먼저 수행하도록 하려면 괄호 표시!
		boolean result2 = (a + b) > (a - b); // 위의 코드와 결과 동일
		System.out.println(result2);
		
		
		// char 타입도 정수이므로 비교연산자 사용 가능
		char ch = 'C';
		System.out.println("ch 가 대문자 A 보다 큰가? " + (ch > 65));
		System.out.println("ch 가 대문자 A 보다 큰가? " + (ch > 'A'));
		
		
		// 비교연산자도 피연산자 타입이 다르면 일치시킨 후 연산 수행
		System.out.println(10 == 10.0);
		// => int == double => double == double 로 변환 후 수행(10.0 == 10.0)
		
		
		// 주의사항!
		// 실수(특히 double) 0.1 의 유효자릿수 문제때문에 
		// float 0.1f 와 double 0.1 비교 시 문제 발생! (= 부정확)
		System.out.println(0.1 == 0.1f); // false 출력됨
		
		float f = 0.1f;
		double d = 0.1;
		System.out.println(f == d); // false 출력됨
		
		// => float, double 타입 비교 시 반드시 float 타입으로 일치시킨후
		//    비교 연산을 수행해야한다!
		System.out.println(f == (float)d);

논리 연산자(&&, ||, !, ^)

  • 두 피연산자 간의 논리적인 판별을 수행하는 연산자
  • 피연산자는 모두 boolean 타입 데이터만 사용 가능하며, 결과값도 boolean 타입으로 리턴
  • 주로 비교(관계)연산자 등과 결합하여 사용
    1. AND : 두 비교 연산의 관계를 ~이고, ~이면서, 그리고 로 정의
    ex) A 가 B 보다 크고, C 보다 작거나 같을 경우
    1. OR : 두 비교 연산의 관계를 ~이거나, 또는 으로 정의
    ex) A 가 B 보다 크거나, C 보다 클 경우
  • Short Circuit Operation 을 위한 && 또는 || 연산자를 통해 연산 과정을 짧게 줄일 수도 있음

AND 연산자(& 또는 &&) - 논리곱

  • 두 피연산자가 모두 true 일 경우에만 결과값이 true 이고, 하나라도 false 일 경우 결과값이 false
  • F AND F = F, F AND T = F, T AND F = F, T AND T = T
  • &&& 의 차이점뒤의 피연산자 검사를 생략하고 결과를 바로 false 로 리턴
  • 즉, 연산 과정이 짧아짐
  • && 연산자는 두 피연산자 중 앞의 피연산자가 false 일 경우

OR 연산자(| 또는 ||) - 논리합

  • 두 피연산자 중 하나라도 true 일 경우 결과값이 true 이고, 모두 false 일 경우에만 결과값이 false
  • F OR F = F, F OR T = T, T OR F = T, T OR T = T
  • ||| 의 차이점뒤의 피연산자 검사를 생략하고 결과를 바로 true 로 리턴
  • 즉, 연산 과정이 짧아짐
  • || 연산자는 두 피연산자 중 앞의 피연산자가 true 일 경우

NOT 연산자(!) - 논리부정

  • 단항 연산자로, 현재 값을 반대로 반전시킴
  • F -> T, T -> F

XOR 연산자(^) - 배타적 논리합(배타적 OR)

  • 두 피연산자가 서로 다를 때 true, 같을 때 false
  • F XOR F = F, F XOR T = T, T XOR F = T, T XOR T = F
		boolean a = false, b = true;
		
		System.out.println("a && a = " + (a && a));
		System.out.println("a && b = " + (a && b));
		System.out.println("b && a = " + (b && a));
		System.out.println("b && b = " + (b && b));
		System.out.println("--------------------");
		System.out.println("a || a = " + (a || a));
		System.out.println("a || b = " + (a || b));
		System.out.println("b || a = " + (b || a));
		System.out.println("b || b = " + (b || b));
		System.out.println("--------------------");
		System.out.println("a ^ a = " + (a ^ a));
		System.out.println("a ^ b = " + (a ^ b));
		System.out.println("b ^ a = " + (b ^ a));
		System.out.println("b ^ b = " + (b ^ b));
		System.out.println("--------------------");
		System.out.println("!a = " + !a); // false -> true
		System.out.println("!b = " + !b); // true -> false

 

반응형

 

비교 연산자와 결합하여 사용하는 경우

		int num = 8;
		
		// 한 가지 비교만 수행하는 경우 비교연산자만 사용 가능
		// 정수 num 이 5보다 큰가?
		//		boolean result = num > 5;
		//		System.out.println("num 이 5보다 큰가? " + result);
			
		// 두 가지 이상의 비교를 조합해야 하는 경우 논리연산자와 결합 필요
		// AND : 두 비교 연산의 관계를 ~이고, ~이면서, 그리고 로 정의
		// 정수 num 이 5보다 크고, 정수 num 이 10보다 작거나 같은가?
		// 1) 정수 num 이 5보다 크다 : num > 5
		// 2) 정수 num 이 10보다 작거나 같다 : num <= 10
		// => ~이고, 그리고 가 포함되므로 두 연산을 AND연산(&&)으로 묶음
		boolean result = num > 5 && num <= 10;
		System.out.println(
				"num 이 5보다 크고, 10보다 작거나 같은가? " + result);
		
		// OR : 두 비교 연산의 관계를 ~이거나, 또는 으로 정의
		// 정수 num 이 5보다 작거나, 또는 num 이 10보다 큰가?
		// => 두 연산 중 하나라도 만족하면 결과가 true
		num = 15;
		result = num < 5 || num > 10;
		System.out.println(
				"num 이 5보다 작거나, 10보다 큰가? " + result);

비교 연산자와 논리 연산자를 활용한 char 타입 연산

  • char 타입은 주로 비교 연산자와 논리 연산자를 활용하여 특정 범위 내의 문자인지를 판별하는 용도로 사용
    삼항연산자(조건연산자) ?:
    • 피연산자(항)가 3개인 연산자
    • ? 앞의 조건식에 따라 : 앞 뒤의 문장을 선택하는 연산자
    • 뒤에 나올 if ~ else 문의 역할과 동일한 작업을 수행

    조건식은 연산 결과가 true 또는 false 인 식만 올 수 있다!삼항연산자 연산 결과를 변수에 대입하거나, 출력문 등에 결합하여 사용할 수 있다삼항연산자의 중첩 사용
    • 기본 삼항연산자는 두 가지 경우의 수를 판별할 수 있으나 세 가지 경우 이상은 판별이 불가능하다
    • 이 때, 삼항연산자를 중첩해서 사용하면 두 가지 이상의 경우의 수를 판별할 수 있다.
    기본 문법조건식1 의 결과가 true 이면 값1 을 선택하고 아니면, 다시 조건식2를 판별하여 조건식2 의 결과가 true 이면 값2 를 선택하고 아니면 값3 을 선택
  •  
  • 조건식1 ? 값1 : 조건식2 ? 값2 : 값3;
  • 조건식 결과가 true 이면 값1 을 선택하고, 조건식 결과가 false 이면 값2 를 선택
  • 조건식 ? 값1 : 값2;
  • ex) 대문자 판별, 소문자 판별, 영문자 판별, 숫자 판별 등


		char ch = '1';
		
		boolean result = ch >= 'A'; // ch >= 65 사용 가능
		System.out.println(ch + " 이(가) 대문자 A(65) 이상인가? " + result);
		
		result = ch <= 'Z'; // ch <= 90 사용 가능
		System.out.println(ch + " 이(가) 대문자 Z(90) 이하인가? " + result);
		
		// 문자 ch 가 대문자인지 판별
		// => 대문자란? 'A'(65) 보다 크거나 같고, 'Z'(90) 보다 작거나 같음
		// => 같'고' 의 조건은 AND 연산자인 && 를 사용하여 결합
		result = ch >= 'A' && ch <= 'Z'; 
		System.out.println(ch + " 이(가) 대문자인가? " + result);
		
		// 문자 ch 가 소문자인지 판별
		// => 소문자란? 'a'(97) 보다 크거나 같고, 'z'(122) 보다 작거나 같음
		ch = 'r';
		result = ch >= 'a' && ch <= 'z'; 
		System.out.println(ch + " 이(가) 소문자인가? " + result);
		
		// 문자 ch 가 영문자인지 판별
		// => 영문자란? 대문자 또는 소문자
		ch = 'r';
		result = (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
		System.out.println(ch + " 이(가) 영문자인가? " + result);
		
		// 문자 ch 가 숫자인지 판별
		// => 숫자란? '0'(48) ~ '9'(57)
		ch = '0';
		//		result = ch >= '0' && ch <= '9';
		//		result = ch >= 48 && ch <= 57;
		result = !(ch < 48) && !(ch > 57); 
		System.out.println(ch + " 이(가) 숫자인가? " + result);
		int num = 1;
		System.out.println(
				num >= 10 ? "num 이 10 이상이다!" : "num 이 10 이상이 아니다!");
		// => num 이 10 이상(true)일 때 "num 이 10 이상이다" 문장을 선택하여
		//    출력문에 사용하므로 "num 이 10 이상이다" 문장이 출력되고,
		// => num 이 10 이상이 아닐(false) 때
		//    "num 이 10 이상이 아니다!" 문장을 선택하여
		//    출력문에 사용하므로 "num 이 10 이상이 아니다!" 문장이 출력됨
		
		String result = num >= 10 ? "10 이상이다!" : "10 이상이 아니다!";
		System.out.println(result);
		
		System.out.println("--------------------");
		
		num = 20;
		System.out.println("num 이 10보다 큰가? " + (num > 10));
		
		// num 이 10보다 크면 정수형 변수 result2 의 값에 1을 더하고
		// 아니면, 정수형 변수 result2 의 값에 10을 더하기
		int result2 = 0;
		//		result2 = result2 + 1;
		//		result2 = result2 + 10;
		//		result2 = num > 10 ? result2 + 1 : result2 + 10;
		result2 += num > 10 ? 1 : 10;
		// => true 와 false 일 때 선택할 문장 부분에 연산식이 올 수도 있으나
		//    해당 식을 사용하여 값을 할당하는 문장에 사용해야함
		System.out.println(result2);
		int a = 10, b = 4;
		
		System.out.println(a == b); // a 와 b 가 같은지 판별 결과 출력
		// => a 와 b 는 같지 않으므로 false 가 리턴되어 출력됨
		
		System.out.println(a != b); // a 와 b 가 다른지 판별
		// => a 와 b 는 다르므로(같지 않으므로) true 가 리턴되어 출력됨
		
		System.out.println(a > b); // a 가 b 보다 큰지 판별
		// => a 가 b 보다 크므로 true 가 리턴되어 출력됨
		
		System.out.println(a >= b); // a 가 b 보다 크거나 같은지 판별
		// => a 가 b 보다 크거나 같으므로 true 가 리턴되어 출력됨
		
		System.out.println(a <= b); // a 가 b 보다 작거나 같은지 판별
		// => a 가 b 보다 작거나 같지 않으므로 false 가 리턴되어 출력됨
		
		System.out.println(a < b); // a 가 b 보다 작은지 판별
		// => a 가 b 보다 작으므로 false 가 리턴되어 출력됨
		
		// 대소 관계 비교 결과를 boolean 타입 변수에 저장할 수 있다!
		boolean result = a > b; // a > b 판별 결과가 result 에 저장됨
		System.out.println("result = " + result);
		
		// 산술 연산자 등과 결합하여 사용할 수 도 있다!
		// => 두 연산 결과를 비교연산자로 비교 가능
		//		boolean result2 = a + b > a - b;
		// => 산술연산자가 비교연산자보다 우선순위가 높으므로
		//    별도의 괄호를 표시하지 않아도 산술연산을 먼저 수행함
		
		// 만약, 명확하게 산술연산을 먼저 수행하도록 하려면 괄호 표시!
		boolean result2 = (a + b) > (a - b); // 위의 코드와 결과 동일
		System.out.println(result2);
		
		
		// char 타입도 정수이므로 비교연산자 사용 가능
		char ch = 'C';
		System.out.println("ch 가 대문자 A 보다 큰가? " + (ch > 65));
		System.out.println("ch 가 대문자 A 보다 큰가? " + (ch > 'A'));
		
		
		// 비교연산자도 피연산자 타입이 다르면 일치시킨 후 연산 수행
		System.out.println(10 == 10.0);
		// => int == double => double == double 로 변환 후 수행(10.0 == 10.0)
		
		
		// 주의사항!
		// 실수(특히 double) 0.1 의 유효자릿수 문제때문에 
		// float 0.1f 와 double 0.1 비교 시 문제 발생! (= 부정확)
		System.out.println(0.1 == 0.1f); // false 출력됨
		
		float f = 0.1f;
		double d = 0.1;
		System.out.println(f == d); // false 출력됨
		
		// => float, double 타입 비교 시 반드시 float 타입으로 일치시킨후
		//    비교 연산을 수행해야한다!
		System.out.println(f == (float)d);

 

728x90
반응형