제니노트

사칙 연산자, 산술 변환 [자바] 본문

Java/Java 입문

사칙 연산자, 산술 변환 [자바]

yangjennie 2023. 6. 10. 15:43
반응형

산술 연산자

 

사칙 연산자

사칙연산자에는 덧셈(+),뺄셈(-),곱셈(*),나눗셈(/)이 있다.

class Ex5 {
	public static void main(String args[]) {
   		int a = 10;
        int b = 4;
        
        System.out.printf("%d + %d = %d\n", a, b, a + b);
        System.out.printf("%d - %d = %d\n", a, b, a - b);
        System.out.printf("%d * %d = %d\n", a, b, a * b);
        System.out.printf("%d / %d = %d\n", a, b, a / b);
        System.out.printf("%d / %f = %f\n", a, float(b), a / float(b));

결과

10 + 4 = 14

10 - 4 = 6

10 * 4 = 40

10 / 4 = 2 

10 / 4.000000 = 2.500000 

 

10/4의 경우 2.5가 아닌 2가 나오는 것을 볼 수 있다. 

int 10 / int 4 = int 2 //소수점이하는 버려진다. 

 

따라서 

int 10 / float 4.0f  -> float 10.0f / float 4.0 -> float 2.5f 

로 변경해줘야 올바른 값이 나온다.

두 피연산자의 타입이 일치하지 않으므로, float 타입으로 일치시킨 후에 연산을 수행하는 것을 알 수 있다. float -> int 의 경우 값손실이 있으므로 float 로 변경되는 것이다.

 

 


산술 변환

위의 연산과정을 본다면, 두 피연산자의 타입이 일치하지 않으므로, float 타입으로 일치시킨 후 연산을 수행한다.

이것이 바로 산술 변환이다.

이는 규칙이 있는데

 

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

이는 값손실이 일어나지 않도록 큰 타입으로 맞춰주는 것이다.

 

long + int -> long + long -> long 

8bit      4bit     8         8        8

float + int -> float + float -> float

double + float -> double + double -> double

 

float의 예시로. float는 4byte이고 int 는 4byte이다. 하지만 표현범위는 float 가 더 크므로 float float 연산으로 바뀐다.

또한 double은 8byte이고 float는 4byte이다. 표현범위는 double이 더 크므로 float가 double로 바뀐다.

그 후 반환은 일치된 타입으로 반환된다.

 

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

 

byte + short -> int + int -> int

char + short -> int + int -> int

 

int 보다 작은 타입에는 byte,short,char 가 있다.

char은 2byte, short 2byte의 char 1byte 이다. 이는 다 연산 시 int형으로 변환된다.

왜그럴까?

byte는 범위가 -128~127. char은 0~6만 short는 ±3만이다.

예를 들어 300*300의 연산을 가정하면 답이 9만이다. 이렇게 별거 아닌 작은 계산을 해도 위의 범위를 쉽게 넘어버린다.

범위를 벗어나면 오버플로우가 발생하므로 바람직하지 않은 결과가 나온다.

이를 막으려고 일단 int 로 바꿔주는 것이다. 

그러면 overflow가 발생하지 않아 잘못된 결과가 나오지 않는다.

 

'2'-'0' 의 경우를 한번 보자

 

char - char의 연산은 그럼 int - int 로 바뀐다.

int 보다 작은 타입이므로 int로 바뀌는 것이다

 

문자 2는 유니코드 문자표에서 '2'는 50에 대입되고 '0'은 48에 대입된다.

따라서 답은 2이다.

 

이는 문자를 숫자로 바꿀 때 사용되는 방법인데

유니코드의 경우 연속적으로 배치되어있으므로 50-48 = 2 이므로 이 방법이 가능한 것이였다

바로'2'를 int 형으로 변환하면 (int)'2' 50으로 되니 이에 유의하자

 

 

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

 

 

 

 

 

반응형
Comments