Programming Language/JAVA

사칙 연산자, 산술 변환

Glory-L 2023. 1. 14. 20:18

 

사칙 연산자

 

class Ex3_6 {
	public static void main(String args[]) {
    
    	int a = 10;
        int b = 4;
        
        System.out.printf("%d + %d = %dn", a, b, a + b);  // 14
        System.out.printf("%d - %d = %dn", a, b, a - b);  // 6
        System.out.printf("%d * %d = %dn", a, b, a * b);  // 40
        System.out.printf("%d / %d = %dn", a, b, a / b);  // 10 / 4 = 2
        System.out.printf("%d / %d = %fn", a, (float)b, a + (float)b); // 10 / 4.000000 = 2.500000
        
      }
}

 

사칙 연산은 같은 타입끼리만 가능하다. 다른 타입끼리 연산을 할 경우 피연산자 중 하나를 선택해서 형변환을 해야 한다. (둘다 해도 되지만 번거롭다.)

 

 

 


 

산술 변환

 

위의 언급 한 것 같이 타입이 다르면 형변환으로 일치 시킨다. 

 

일일이 일치시키는 것이 번거롭기 때문에 자동 형변환을 제공하는 데 이를 산술 변환이라고 한다. 

 

이러한 산술 변환에는 2가지 규칙이 있다. (중요!)

 

1) 두 피 연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)

 

long (8byte)  +  int (4byte)  --->   long (8byte)   +  long (8byte)

 

float (4byte)  +  int (4byte)  --->   float (4byte)   +  float(4byte) : 실수가 정수보다 표현 값이 크다.

 

 

double (8byte)  +  float (4byte)  --->   double (8byte)   +  double (8byte)

 

 

 

2) 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다. 

* int 보다 작은 타입 : byte, char, short

 

byte (1byte)  +  short (2byte)  --->   int (4byte)   +  int (4byte) =  int (4byte)

 

char (2byte)  +  short (2byte)  --->   int (4byte)   +  int (4byte) =  int (4byte)

 

 

* int로 연산되는 이유?

 

byte는 -128 ~ 127까지 , char는 0 ~ 60000 , short는 -30000 ~ 30000까지로 굉장히 범위가 작다. 범위가 넘어가면 오버 플로우가 발생하여 정확한 계산이 되지 않는다. 이를 막기 위해서 일단 큰 타입인 int로 바꿔 놓고 계산 해주는 것이다. 이렇게 해야 오버 플로우가 일어나지 않는다. 

 

char num1 = '2';
char num2 = '0';

// 각각 int로 형변환 되고 문자 코드표에 의해서 
num1 - num2 // int 2 결과 반환 -> 문자 2는 숫자코드로 50 , 문자 0은 숫자코드로 48

 

* 앞서 공부 할 때 , 문자를 숫자로 형변환 하는 과정에서 문자형 ' 0 ' 을 빼주었는데

 

그 이유는  문자 0이 숫자 코드로 48이고 1부터 순차적으로 문자 ' 1 ' = 49, 문자 ' 2 ' = 50 , 문자 ' 3 ' = 51 ... 이런 식으로 구성되어 있기 때문에 위의 num1 - num2가 int 2 를 반환하는 것이다. 

 

 

[ 자바의 정석 - 기초 유튜브 강의 영상 참고 ]

 

https://www.youtube.com/watch?v=gz0jjUBITtw&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=27