본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 산술 연산자

산술 연산자

자바의 산술 연산자는 다음과 같습니다. 가장 기본적인 연산자로써 다른 언어와 차이점이 없습니다.

구분 연산자 항의 개수 연산식 결과
산술 + 이항 두 피연산자의 합
산술 - 이항 두 피연산자의 차
산술 * 이항 두 피연산자의 곱
산술 / 이항 두 피연산자의 나누기
산술 % 이항 두 피연산자의 나머지
문자열 + 이항 두 피연산자 문자열의 연결

+ 연산자

+ 연산자는 두 피연산자의 합을 반환합니다. boolean과 char 타입을 제외한 Primitive 타입에서 사용 할 수 있습니다.

int a = 10;
int b = 20;
int c = a + b;    // 30

String 타입에서도 + 연산자를 사용 할 수 있습니다. 이 경우 두 피연산자가 갖는 각각의 문자열을 하나의 문자열로 연결합니다.

String a = "prefix ";
String b = "postfix";
String c = a + b;     // "prefix postfix"

- 연산자

- 연산자는 두 피연산자의 차를 반환합니다. + 연산자와 마찬가지로 boolean과 char 타입을 제외한 Primitive 타입에서 사용 할 수 있습니다. - 연산자의 경우 + 연산자 처럼 String 타입에서 사용 할 수 없습니다.

int a = 10;
int b = 20;
int c = a + b;    // -10

* 연산자

* 연산자는 두 피연산자의 곱을 반환합니다. * 연산 시 주의점은 피연산자가 실수를 포함하는 경우 오차가 발생 할 수 있다는 점입니다. 이 내용에 대해서는 고정소수점과  부동소수점 방식으로 따로 다루도록 하겠습니다.

int a = 10;
int b = 20;
int c = a * b;    // 200

/ 연산자

/ 연산자는 두 피연산자의 나누기 결과를 반환합니다. / 연산 시 주의점은 * 연산과 마찬가지로 피연산자가 실수를 포함하는 경우 오차가 발생 할 수 있다는 점입니다.

int a = 20;
int b = 10;
int c = a / b;    // 2

 또한 / 연산자의 경우 분모가 되는 피연산자 값이 0인 경우 런타임 에러(/ by zero)를 발생합니다. 따라서 프로그램 작성 시 / 연산자를 포함하는 알고리즘은 반드시 분모의 값을 검사하는 구문을 포함해야 안전합니다.

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Log4JExploit.test(Log4JExploit.java:10)
	at Main.main(Main.java:4)

% 연산자

% 연산자는 두 피연산자의 나누기로 인한 나머지 값을 반환하며, 나머지-모드(MOD, Modulo) 연산이라고 부릅니다. 두 피연산자의 나누기 연산 이후 나머지 값을 반환합니다.

int a = 20;
int b = 7;
int c = a % b;    // 6

모드 연산의 경우 피연산자가 꼭 정수일 필요는 없습니다. 피연산자가 실수를 포함하더라도 나누기 연산 후 정수를 제거한 나머지 분에 대해서 반환합니다.

float a = 20.5f;
float b = 7;
float c = a % b;      // 6.5f

모드 연산은 순수하게 나머지 값을 구하는 목적보다는, 반복문 등에서 특정 구간의 element를 처리하는 알고리즘에서 주로 사용됩니다. 아래 예시는 계속해서 증가하는 변수 i에 대해서 값이 100의 배수가 될때마다 값을 출력하는 코드입니다. i의 값이 100의 배수인 경우 100으로 정확하게 나뉘어지며, 이는 (i % 100) == 0과 같은 의미입니다.

int i = 0;
while (i < 1000) {
   if (0 == i % 100) {
      System.out.println(i);
   }
   
   ++i;
}