Java

연산자(Operator) - 산술 연산자 & 비교 연산자

제주니어 2022. 8. 17. 22:00

산술 연산자

1. 사칙 연산자 +, -, *, /

  • 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선순위가 높으므로 먼저 처리된다.
  • 피연산자가 정수형인경우, 나누는 수로 0을 사용할 수 없다. 만일 0으로 나눌 경우, 실행 시에 에러가 발생할 것이다.
  • 부동 소수점값이 0.0f, 0.0d로 나누는 것은 가능하지만 그 결과 Infinity(무한대)이다.
  • (주의) 같은 의미의 식이라도 연산의 순서에 따라서 다른 결과를 얻을 수 있다.
  • Math.round() 사용법
    • Math.round(pi * 1000) / 1000.0
    • → Math.round(3.141592 * 1000) / 1000.0
    • → Math.round(3141.592) / 1000.0
    • → 3142 / 1000.0
    • → 3.142

2. 나머지 연산자 %

  • 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자.
  • (주의) 나누는 수(오른쪽 피연산자)로 0을 사용할 수 없다는 점
  • 나누는 수로 음수도 허용하나 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.
public class C_Arithmetic {
	public void method1() {
		int num1 = 10;
		int num2 = 3;
		double dNum1 = 35.0;
		double dNum2 = 10.0;
		
		// 정수의 산술 연산
		System.out.println("num1 + num2 = " + (num1 + num2));
		System.out.println("num1 - num2 = " + (num1 - num2));
		System.out.println("num1 * num2 = " + (num1 * num2));
		System.out.println("num1 / num2 = " + (num1 / num2)); // 나누기의 몫
		System.out.println("num1 / num2 = " + ((float)num1 / num2)); // 형변환
		System.out.printf("num1 / num2 = %.1f\\n", ((float)num1 / num2)); // 형변환
		System.out.println("num1 % num2 = " + (num1 % num2)); // 나누기의 나머지
		System.out.println();
		
		// 실수의 산술 연산
		System.out.println("dNum1 + dNum2 = " + (dNum1 + dNum2));
		System.out.println("dNum1  dNum2 = " + (dNum1 - dNum2));
		System.out.println("dNum1 * dNum2 = " + (dNum1 * dNum2));
		System.out.println("dNum1 / dNum2 = " + (dNum1 / dNum2));
		System.out.println("dNum1 % dNum2 = " + (dNum1 % dNum2));
		
		// 참고
//		System.out.println(5 / 0);
		System.out.println(5 / 0.0); // Infinity
		System.out.println(5 % 0.0); // NaN(Not a Number) : 숫자가 아니다
		System.out.println((5 / 0.0) + 2); // Infinity
		System.out.println((5 % 0.0) + 2); // NaN(Not a Number) : 숫자가 아니다.
		System.out.println(Double.isInfinite((5 / 0.0) + 2)); // 연산 결과가 Infinity인지 검사하는 코드
		System.out.println(Double.isNaN((5 % 0.0) + 2)); // 연산 결과가 NaN인지 검사하는 코드
	}
}

 

4. 비교 연산자

1. 대소비교 연산자 <.>, ≤. ≥

  • 두 피연산자의 값의 크기를 비교하는 연산자
  • 참이면 true, 거짓이면 false 를 결과로 반환한다.
  • boolean 형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.
  • 좌변을 기준으로. 좌변 값이 크거나(>), 작거나(<), 크거나 같으면(≥), 작거나 같으면(≤) true 아니면 false

2. 등가비교 연산자 ==, ! =

  • 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자
  • 대소비교 연산자(<, >, ≤, ≥)와는 달리 기본형은 물론 참조형, 즉 모든 자료형에 사용할 수 있다.
  • 기본형의 경우 변수에 저장되어 있는 값이 같은지, 참조형의 경우 객체의 주소값을 저장하기 때문에 두 개의 피연산자(참조변수)가 같은 객체를 가르키고 있는지 알 수 있다.
  • 정수형과 달리 실수형은 근사값으로 저장되므로 오차가 발생할 수 있다.
    • 10.0 ==10.0f : true → 오차없이 저장할 수 있는 값이라서 double로 형변환해도 그대로 10.0
    • 0.1 == 0.1f : false → 0.1f는 저장할 때 2진수로 변환하는 과정에서 오차 발생

문자열의 비교

  • 두 문자열을 비교할 때는, 비교 연산자 ‘==’ 대신 equals()라는 메서드를 사용한다.
  • equals()는 두 문자열의 내용이 같으면 true, 다르면 false
    • 객체가 달라도 내용이 같으면 true를 반환한다.
    • 대소문자를 구별하지 않고 비교하고 싶으면, equals()대신 equalsIgnoreCase()를 사용한다.
String str = ne String("abc";
boolean result = str.equals("abc"); // result에 true 저장
  • String 은 클래스이므로 new를 사용해 객체를 생성해야하지만, 특별히 String만 new를 사용하지 않고 간단하게 쓸 수 있다.
String str = new String("abc") // String클래스의 객체를 생성
String str = "abc"; // 위 문장을 간단히 표현

 

public class D_Comparison {

	public void method1() {
//		int num1 = 10;
//		int num2 = 25;
//		int num3 = 0;
		
		Scanner scanner = new Scanner(System.in);
		
		boolean result = false;
		//관계상 잘 사용하지 않는다. 
		int num1 = 10, num2 = 25, num3 = 0;
		
		System.out.println("num1 == num2 : " + (num1 == num2));
		System.out.println("num1 <= num2 : " + (num1 <= num2));
		System.out.println("num1 > num2 : " + (num1 > num2));
		
		result = (num1 != num2);
		System.out.println(result);
		
		result = ('A' == 65); // 65(A의 코드값) == 65
		System.out.println(result);
		
		result = (3.0 == 3); // 3.0 == 3.0
		System.out.println(result);
		
		// 대부분의 비교 연산에서는 정수 타입을 사용한다. 
		result = (0.1 == 0.1f); // false double 0.1 == float 0.1
		System.out.println(result);
		
		// 산술연산 + 비교연산
		// 사용자에게 입력받은 값이 짝수인지, 홀수인지 판단
		System.out.print("임의의 정수를 입력해주세요 > "); // print로 하면 옆에 숫자가 출력 println은 아래에 숫자가 출력
		num3 = scanner.nextInt();
		
		// ((num3 % 2) == 0
		System.out.printf("%d는 짝수인가요? %b\\n", num3, ((num3 % 2) == 0));
		System.out.printf("%d는 홀수인가요? %b\\n", num3, ((num3 % 2) != 0));
//		System.out.printf("%d는 홀수인가요? %b\\n", num3, ((num3 % 2) == 1));
		
		System.out.printf("%d는 5의 배수인가요? %b\\n", num3, ((num3 % 5) == 0));
		
		scanner.close();
	}
}