Programing Language/Java

[Java] 산술 연산자(Arithmetic Operators)

vinedpillar 2022. 5. 13. 08:47

연산자(Operator)

  • 연산자는 메모리에 저장된 여러 값을 목적에 맞게 연산하는 기능을 제공하고 있습니다.

  • 연산자는 필요에 맞게 산술 연산, 논리 연산, 비트 연산 등 다양한 기능을 제공하고 있습니다.

 

 

 

부호 연산자

  • 부호 연산자는 피연산자 앞에 붙어 변수의 부호를 유지하거나 변경하는데 사용됩니다.

  • 연산자 종류는 +와 - 두 가지를 지원합니다.
    • +[피연산자] : 피연산자의 부호를 현재 상태로 유지합니다. 
    • -[피연산자] : 피연산자의 부호를 현재의 반대 상태로 변경합니다.

 

 

증감 연산자

  • 피연산자의 값을 증가시키거나 감소시키는데 사용합니다.
    • ++[피연산자] : 다른 연산 수행한 후에 피연산자의 값을 1 증가시킵니다..
    • [파연산자]++ : 다른 연산 수행 전에 피연산자의 값을 1 증가시킵니다.
    • -- [파연산자] : 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킵니다.
    • [피연산자]-- : 다른 연산 수행 전에 피연산자의 값을 1 감소시킵니다.

 

증감 연산 예시

int x = 10;
int y = 10;

// 변수 x값을 1을 증가시킨 후에 10을 더함
// result1의 값은 21, 연산 후 x의 값은 11
int result1 = ++x + 10;

// 변수 y에 10을 더한 후 y값을 1 증가
// result2의 값은 20, 연산 후 y의 값은 11
int result2 = y++ + 10;

 

 

 

산술 연산자

  • 기본적으로 활용되는 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지, 5가지 연산을 위해 사용되는 연산자입니다.
    • [피연산자1] + [피연산자2] : 두 개 이상의 피연산자 사이에서 쓰이며 앞 피연산자에서 뒤 피연산자를 더하는 연산을 수행합니다.
    • [피연산자1] - [피연산자2] : 두 개 이상의 피연산자 사이에서 쓰이며 앞 피연산자에서 뒤 피연산자를 빼는 연산을 수행합니다.
    • [피연산자1] * [피연산자2] : 두 개 이상의 피연산자 사이에서 쓰이며 앞 피연산자에서 뒤 피연산자를 곱하는 연산을 수행합니다.
    • [피연산자1] / [피연산자2] : 두 개 이상의 피연산자 사이에서 쓰이며 앞 피연산자에서 뒤 피연산자의 나눈 값의 몫을 구하는 연산을 수행합니다.
    • [피연산자1] % [피연산자2] : 두 개 이상의 피연산자 사이에서 쓰이며 앞의 피연산자에서 뒤 피연산자를 나눈 값의 나머지를 구하는 연산을 수행합니다.

 

산술 연산 예제

int val1 = 20;
int val2 = 10;

// 변수 result1에 30 저장
int result1 = val1 + val2;

// 변수 result2에 10 저장
int result2 = val1 - val2;

// 변수 result3에 200 저장
int result3 = val1 * val2;

// 변수 result4에 2 저장
int result4 = val1 / val2;

// 변수 result5에 0 저장
int result5 = val1 % val2;

 

 

 

대입 연산자

  • 대입 연산자는 '=' 기호를 사용하며 우측 피연산자의 값을 좌측 피연산자(변수)에 대입하는 기능을 제공합니다.

  • 대입 연산자의 기본 형태
    • [변수] = [피연산자(리터럴 or 변수 or 연산식)] : 우측 피연산자의 값을 변수에 대입
      (계산 결과 혹은 같다를 뜻하는 수학의 = 과는 다른 기능을 가졌음)

 

 

 

복합 대입 연산자

  • 복합 대입 연산자는 정해진 연산을 수행한 후에 결과를 변수에 저장하는 기능을 제공합니다.

  • 산술 복합 대입 연산자의 종류
    • [변수] += [피연산자] : 피연산자의 값을 변수에 더한 후에 다시 변수에 저장합니다.
    • [변수] -= [피연산자] : 피연산자의 값을 변수에서 뺀 후에 다시 변수에 저장합니다.
    • [변수] *= [피연산자] : 피연산자의 값을 변수에 곱한 후에 다시 변수에 저장합니다.
    • [변수] /= [피연산자] : 피연산자의 값을 변수에서 나눈 후에 다시 변수에 저장합니다.
    • [변수] %= [피연산자] : 피연산자의 값을 변수에서 나눈 나머지를 다시 변수에 저장합니다.

산술 복합 대입 연산자 사용 예시

// 변수 num에 10 대입
int num = 10;

// 변수 num에 5를 더하고 다시 저장
// 현재 상태: num에 15 저장
num += 5;

// 변수 num에 10을 빼고 다시 저장
// 현재 상태: num에 5 저장
num -= 10;

// 변수 num에 4를 곱하고 다시 저장
// 현재 상태: num에 20저장
num *= 4;

// 변수 num에 5를 나누고 다시 저장
// 현재 상태: num에 4저장
num /= 5;

// 변수 num에 3으로 나눈 나머지를 구하고 다시 저장
// 현재 상태: num에 1저장
num %= 3;

 

 

 

 

연산 오류

  • 연산의 결과가 지정한 변수가 표현할 수 있는 범위를 벗어날 경우 값이 정상적으로 계산되지 않는 오류가 발생합니다.
    • 오버플로우가 발생한 경우: 지정한 타입의 가장 낮은 값으로 자동 변경됩니다.
    • 언더플로우가 발생한 경우: 지정한 타입의 가장 높은 값으로 자동 변경됩니다.

 

오버플로우/언더플로우 오류

byte val1 = 127;
byte val2 = -128;

// 변수 val1에 -128이 저장
val1++;

// 변수 val2에 127 저장
val2--;

 

 

 

실수 연산의 주의점

  • 산술 연산을 정확하게 계산하기 위해서는 실수 타입을 지양하는 것이 좋습니다.

  • 부동 소수점 방식을 사용하여 연산을 하면 정확한 계산값이 출력되지 않기 때문입니다.

  • 따라서 실수 연산은 정수 연산으로 변경한 후에 다시 실수 형태로 변경해주는 것이 좋습니다.

 

실수 연산 정밀도 오류

int val1 = 1;
int val2 = 7;
double val3 = 0.1;

// 잘못된 연산
// result1에 0.3이 아닌 0.29999999999999993 저장
double result1 = val1 - val2 * val3;

// 올바른 연산
// result2에 0.3 저장
double result2 = (val1 * 10 - val2) / 10.0;

 

 

 

나눗셈 연산 후 처리

  • 나눗셈은 나누는 값이 0일 경우 계산이 되지 않으므로 산술 예외(Arithmetic Exception)가 발생합니다.

  • 단 피연자가 실수이거나 우측 피연산자가 0.0 / 0.0F 일 경우 무한대(Infinity) 또는 NaN(Not a Number)이 나오게 됩니다.

  • 이 상태에서는 어떤 계산을 해도 무한대나 NaN이라고 나오기 때문에 정상적인 계산을 할 수 없게 됩니다.

  • 따라서 나눗셈 연산에는 이러한 오류를 검출하는 과정이 추가로 필요할 수 있습니다.