산술 연산자는 덧셈, 뺄셈 등 산술 연산을 수행하는 연산자들이고 부호 연산자는 부호를 지정하는 것들이다. 산술 연산자는 피연산자가 두 개이므로 이항 연산자이고 부호 연산자는 피연산자가 하나이므로 단항 연산자에 해당된다. 산술 연산자는 다음과 같은 것들이 있다.
[표 1] 산술 연산자
기호 | 기능 | 용례 |
+ | 덧셈/부호 | 12+13, a+b, 12.3+45.6+c, +12, +d |
- | 뺄셈/부호 | 12-13, a-b, 12.3-45.6-c, -12, -d |
* | 곱셈 | 12*13, a*b, 12.3*45.6*c |
/ | 나눗셈 | 12/13, a/b, 12.3/45.6/c |
% | 나머지 | 12%13, a%b |
예를 들면 다음과 같다.
int ia = 11, ib = 22, ic, id, ie;ic = 1a + ib;id = ia – ib;ie = ia * ib; double da = 1.1, db=2.2;da = ie*ie;db = da/ia; |
부호 연산자는 어떤 값의 부호를 지정하거나 바꾸는데 쓰인다. +, -기호는 부호 연산자로도 사용되며, 부호 연산자는 한 개의 피연산자를 요구하는 단항 연산자이다. 예를 들면 다음과 같다.
따라서 다음과 같은 표현식에서 첫 번째 ‘-’는 부호연산자이고 두번째 ‘-’는 산술연산자이다.
연산의 결과를 변수에 저장할 때는 결과 값이 그 변수의 허용 범위에 들어가는지 여부를 잘 판단해야 한다.
int ia = 2000000;int ib = ia*10; byte bya = 129; // 오류short sa = 700000;//오류 |
나머지(%)연산의 예를 들면 다음과 같다.
10%5 // 03%2 // 18%3 // 23%5 // 3 |
한 가지 주의할 점은 %연산자의 피연산자는 정수형과 실수형 모두 사용 가능하다. (C/C++에서는 정수형만 사용가능하지만 자바는 그렇지 않다.)
double da=5.2, db=4.1;System.out.println(da%db); // 1.1이 출력됨 |
다음 예제는 다양한 숫자의 2로 나눈 나머지를 출력해 주는 프로그램이다.
package tut02;public class Tut02 { public static void main(String[] args) { byte bya = 13; int ia = 23456; float fa = 78.567f; System.out.println(bya%2); System.out.println(ia%2); System.out.println(fa%2); }} |
다음 예제는 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈의 결과를 표시해 주는 프로그램이다.
package tut02;public class Tut02 { public static void main(String[] args) { int ia = 23456, ib=789; int ir = ia + ib; System.out.println("ia + ib = "+ir); ir = ia - ib; System.out.println("ia - ib = "+ir); ir = ia * ib; System.out.println("ia * ib = "+ir); System.out.println("ia / ib = "+(ia/ib)); }} |
ia + ib = 24245ia - ib = 22667ia * ib = 18506784ia / ib = 29 |
자바는 컴파일하는 시점에서 변수에 어떤 상수를 입력할 때 범위를 체크하여 허용 범위를 넘어선다면 에러를 발생시킨다. 또한 산술연산을 할 때 다음과 같이 자동 형 변환이 일어난다.
두 피연산자 중 하나라도 double 형이면 다른 하나도 double 형으로 변환하고 결과도 double형이다.
그렇지 않고 두 피연산자 중 하나라도 float 형이면 다른 하나도 float 형으로 변환하고 결과도 float형이다.
그렇지 않고 두 피연산자 중 하나라도 long 형이면 다른 하나도 long 형으로 변환하고 결과도 long형이다.
그렇지 않다면 두 피연산자를 모두 int 형으로 변환하고 결과도 int 형이다.
자바에서 산술연산에 대해서는 이 네 가지의 규칙을 따른다. (c/c++의 경우보다 훨씬 더 간결하다.) 특히 마지막 규칙 때문에 예를 들어서 두 개의 byte형이나 short 형의 연산의 결과는 int형이 된다. 따라서 다음과 같은 간단한 연산도 에러를 발생한다.
short sa = 10, sb=20;short sc = -sa;short sd = sa+sb; //에러 |
범위를 벗어나는 것도 아닌데 왜 에러가 발생하는지 처음에는 의아할 수 있다. -sa와 sa+sb의 연산 결과는 int 형이고 이것을 short 형에 대입하려고 하기 때문이다. (C/C++ 프로그래머는 처음에 혼동하기 쉽다.) 자바에서는 크기가 작은 자료형으로의 형변환(lossy conversion)은 무조건 명시적으로 해 주어야 한다. 따라서 다음과 같이 명시적으로 형변환을 해주어야 한다.
short sa = 10, sb=20;short sc = (short)(-sa); short sd = (short)(sa+sb); |
이것은 byte형에 대해서도 마찬가지이다.