[Java] 산술 연산자

Bam·2024년 2월 22일
0

Java

목록 보기
9/98
post-thumbnail

산술 연산자

산술 연산자는 피연산자를 두 개 갖는 연산자입니다.

산술 연산자로 연산을 수행할 때 피연산자의 타입 크기가 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가지 규칙에 따르면서 연산을 수행합니다.

  1. int형보다 작은 타입은 int형으로 캐스팅을 한 뒤 연산이 수행된다.
  2. 두 피연산자의 타입이 다른 경우, 더 큰 크기의 타입으로 캐스팅을 한 뒤 연산이 수행된다.
  3. 정수형의 나눗셈에서 0으로 나누기는 오류가 발생한다

char, byte, shortint로 캐스팅한 후에 연산을 수행합니다.

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과 동일합니다.

0개의 댓글