본문 바로가기
언어/JAVA

[연산자] 부호/증감 연산자, 산술 연산자, 오버플로우, 언더플로우

by 코딩맛집 2023. 1. 14.

3.1 부호/증감 연산자

부호 연산자는 변수의 부호를 유지하거나 변경한다.

연산식 설명
+ 피연산자 피연산자의 부호 유지
- 피연산자 피연산자의 부호 변경  

※ 주의할 점 부호 변경 후의 타입이다.

byte b = 100;
byte result = -b; //컴파일 에러

정수타입(byte, shor, int) 연산의 결과는 int 타입이다. 부호를 변경하는 것도 연산이므로 다음과 같이 int 타입 변수에 대입해야 한다. 

byte b = 100;
int result = -b;

증감 연산자(++, --)는 변수의 값을 1 증가시키거나 1 감소시키는 연산자이다.

연산식  
++ 피연산자 피연산자의 값을 1 증가시킴  
-- 피연산자 피연산자의 값을 1 감소시킴
피연산자 ++ 다른 연산을 수행한 후에 피연산자의 값을 1증가시킴
피연산자 -- 다른 연산을 수행한 후에 피연산자의 값을1 감소시킴
int x = 1;
int y = 1;
int result1 = ++x + 10; -> int result1 = 2 + 10;
int result2 = y++ + 10; -> int result2 = 1 + 10; 이후 y를 1증가

//result1=12, result2=11 그리고 x와 y의 값은 2가 된다.
public class Main {
    public static void main(String[] args) {
        int x = 10;
        int y = 10;
        int z;

        x++; //11
        ++x; //12
        System.out.println("x="+x);

        y--; //9 변수 단독
        --y; //8
        System.out.println("y="+y);

        z=x++;
        System.out.println("z="+z); //12
        System.out.println("x="+x); //13

        z = ++x;
        System.out.println("z=" + z); // 14
        System.out.println("x=" + x); // 14

        z= ++x +y++;
        System.out.println("z=" + z); //15+8=23
        System.out.println("x=" + x); //15
        System.out.println("y=" + y); //9
    }
}

 

3.2 산술 연산자

연산자 설명
+ 덧셈 연산    
- 뺄셈 연산
* 곱셈 연산
/ 나눗셈 연산
% 나눗셈의 나머지를 산출하는 연산자

 

산술 연산자의 특징은 다음과 같다.

  • 피연산자가 정수 타입(byte, short, char, int)이면 연산의 결과는 int 타입이다.
  • 피연산자가 정수 타입이고 그 중 하나가 long 타입이면 연산의 결과는 long 타입이다.
  • 피연산자 중 하나가 실수 타입이면 연산의 결과는 실수 타입이다.
public class Main {
    public static void main(String[] args) {
       byte v1 = 10;
       byte v2 = 4;
       long v4 = 10L;

       int result1 = v1 +v2;
       System.out.println(result1); //int 14 

       long result2 = v1+v2-v4; 
        System.out.println(result2);  // long 4 

        double result3 = (double) v1 / v2; 
        // (double) 강제 형변환 안해주면 2.0 출력됨. 
        System.out.println(result3);  // double 2.5

        int result4 = v1 % v2;
        System.out.println(result4); //int 2 
    }
}

 

3.3 오버플로우와 언더플로우

오버플로우란?

타입이 허용하는 최대값을 벗어난 것.

 

언더플로우란?

타입이 허용하는 최소값을 벗어난 것.

 

 오버플로우 언더플로우 발생되면 실행 에러가 발생하지 않고 해당 정수 타입의 최소값 또는 최대값으로 돌아간다.

byte value = 127;
value++;
System.out.println(value); //-128

예) byte 타입일 경우 최대값 127에서 1을 더하면 오버플로우가 발생하여 결과는 최소값인 -128이 된다. 그리고 다시 1을 더하면 -127이 된다.

 

short, int, long 타입은 값의 범위만 다를 뿐 오버플로우 및 언더플로우가 발생했을 때 마찬가지로 최소값 또는 최대값으로 되돌아간다.