산술 연산자
는 피연산자를 두 개 갖는 연산자입니다.
산술 연산자로 연산을 수행할 때 피연산자의 타입 크기가 4byte 미만이면, 4byte int
형으로 자동 형변환을 수행한 뒤에 연산이 수행됩니다.
사칙 연산자는 사칙연산에 사용되는 연산들로 더하기(+), 빼기(-), 곱하기(*), 나누기(/)
를 수행합니다.
일반적인 수학의 사칙연산 규칙처럼 곱하기와 나누기가 더하기 빼기보다 높은 우선순위를 가지고 수행됩니다.
public class Operator {
public static void main(String[] args) {
int num1 = 4;
int num2 = 2;
System.out.println(num1 + num2);
System.out.println(num1 - num2);
System.out.println(num1 * num2);
System.out.println(num1 / num2);
}
}
사칙 연산자
는 아래의 3가지 규칙에 따르면서 연산을 수행합니다.
char, byte, short
는int
로 캐스팅한 후에 연산을 수행합니다.byte + short -> int + int => int char + char -> int + int => int
따라서 아래 코드는 오류가 발생합니다.
num1
,num2
는 모두byte
형이지만, 산술 연산자를 이용한 연산 과정에서int
형 결과가 나오기 때문입니다. 따라서 오류없이 출력하고 싶다면 강제로 캐스팅을 해야합니다.
지난번에 언급한 데이터 타입의 크기로 인해 타입 크기는
int < long < float < double
입니다.int + float -> float + float => float double + float -> double + double => double
나눗셈 연산자 /
는 조금 주의할 점이 있습니다. 바로 int
형 간의 연산인데요. int/int
의 결과는 int
형이기때문에 소수점 자릿수가 버려집니다.
3 나누기 2는 1.5이지만, 자바에서는 소숫점을 버리고 나눈 결과만을 보내기 때문에 1이 됩니다.
System.out.println(3 / 2);
만약 이런 현상을 방지하고 싶다면, 나누는 피연산자를 float 또는 double 형으로 만들어줍니다.
System.out.println(3.0 / 2.0);
나머지 연산자 %
은 나눗셈을 수행하고 남는 나머지는 취득하는 연산자입니다.
예를 들어 5 나누기 3은 몫이 1, 나머지가 2입니다. 다음 코드처럼 나머지 연산자를 이용해서 나머지를 취득할 수 있습니다.
System.out.println(5 % 3);
시프트 연산자
는 정수형 변수에만 사용할 수 있는 산술 연산자입니다. 시프트 연산자
는 피연산자를 2진수
로 변환했을 때의 그 숫자를 왼쪽 또는 오른쪽으로 이동시킵니다.
<<
는 한 칸 씩 왼쪽으로 이동시키며 만들어진 빈 칸을 0으로 채웁니다. >>
는 한 칸 씩 오른쪽으로 이동시키는데, 이때 원래 정수가 음수였다면 빈자리를 1로 채우고, 양수였다면 0으로 채웁니다.
그리고 >>>
는 한 칸 씩 오른쪽 이동은 동일하나, 부호에 상관없이 빈자리를 0으로 채웁니다.
시프트 연산의 팁이라고 한다면, 10진수
x
의왼쪽(<<)
으로n
만큼 이동은x * 2^n
이고,오른쪽(>>)
으로n
만큼 이동은x / 2^n
과 동일합니다.