2015년 7월 8일 수요일

자바(JAVA)의 산술 연산자와 형변환 규칙

 산술 연산자는 덧셈, 뺄셈 등 산술 연산을 수행하는 연산자들이고 부호 연산자는 부호를 지정하는 것들이다. 산술 연산자는 피연산자가 두 개이므로 이항 연산자이고 부호 연산자는 피연산자가 하나이므로 단항 연산자에 해당된다. 산술 연산자는 다음과 같은 것들이 있다.

[표 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;

부호 연산자는 어떤 값의 부호를 지정하거나 바꾸는데 쓰인다. +, -기호는 부호 연산자로도 사용되며, 부호 연산자는 한 개의 피연산자를 요구하는 단항 연산자이다.  예를 들면 다음과 같다.

+1234   -1234   -temp   +a   -b

따라서 다음과 같은 표현식에서 첫 번째 ‘-’는 부호연산자이고 두번째 ‘-’는 산술연산자이다.

ia = -ib - ic;

 연산의 결과를 변수에 저장할 때는 결과 값이 그 변수의 허용 범위에 들어가는지 여부를 잘 판단해야 한다.

int ia = 2000000;
int ib = ia*10;
byte bya = 129; // 오류
short sa = 700000;//오류

나머지(%)연산의 예를 들면 다음과 같다.

10%5 // 0
3%2 // 1
8%3 // 2
3%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);
   }
}

1
0
0.56700134

 다음 예제는 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈의 결과를 표시해 주는 프로그램이다.

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 = 24245
ia - ib = 22667
ia * ib = 18506784
ia / 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형에 대해서도 마찬가지이다.

댓글 없음:

댓글 쓰기