본문 바로가기
☁️ 구름 X kakao DeepDive/☁️ Java

[Java] 정수 자료형과 실수 자료형 (+형변환과 부동소수점까지)

by 뽀짜꼬 2025. 1. 15.
728x90
반응형

 

이번 시간에는 정수 자료형과 실수 자료형,

그리고 자료형을 바꿀 수 있는 형변환과

실수 자료형을 나타내는 부동소수점까지!! 정리해보았다.


 

1. 정수 자료형

1비트는 0과 1을 나타낸다.

1바이트는 이게 8개가 있다는 뜻으로 2의 8승이다.

 

📍 자료형의 크기와 표현 범위

자료형 크기 표현범위
byte 1바이트
(8비트)
-128 ~ 127 (-2^7 ~ 2^7-1)
short 2바이트 -32,768 ~ 32,767
int 4바이트 -2,147,483,648 ~ 2,147,483,647
long 8바이트 -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807

 

- 자료형의 범주를 넘어가는 수를 담는것은 불가능하다.

byte overByte2 = 128;	// 불가
byte overByte4 = -129;	// 불가

 

보통 int가 널리 사용된다.

byte와 short의 연산에서도 결과로 int가 반환되고,

4바이트라는 크기가 대부분 CPU에서 처리하기 적합한 크기이기 때문이다.


1) 묵시적(암시적) 형변환

위의 표를 보면 byte -> short -> int -> long 순으로 크기가 커짐을 알 수 있다.

자바는 큰 자료형에 작은 자료형의 값을 넣을 수 있는데,

이를 묵시적(암시적)형변환 이라고 한다.

byte _1b_byte = 1;
short _2b_short = 2;

_2b_short = _1b_byte;

 

byte였던 1이 short 변수의 값으로 들어가면 short 자료형의 1로 바뀐다.

(값은 동일하지만 담기는 통의 크기가 달라졌다는 의미)

큰통에 작은게 들어있든, 큰게 들어있든

(들어있는 값과 무관하게) 큰통을 작은 통에 담을 수 없다

출처 - 사실내가그림


Long의 묵시적 형변환

long _8b_long = 4;

 

⇒ 그래서 사실 위의 코드의 경우,

int인 4가 묵시적 형 변환으로 들어가 있는것이다. L이 안붙으면 long이 아니다.

⇒ 그래서! int의 범위를 벗어나는 수에는 뒤에 L을 붙여주어야한다.

long _8b_long1 = 123456789123456789;
// 이렇게 말고

long _8b_long1 = 123456789123456789l;
// 소문자 말고 대문자를 권장함.
long _8b_long1 = 123456789123456789L;

 

+) 가독성을 위해 자바 7 버전부터 : 숫자 사이사이 _ 를 넣어 보기 편하게 할 수 있다.

int _4b_int2 = 123_456_789;
long _8b_long2 = 123_456_789_123_456_789L;

 

2) 명시적 (강제) 형변환

그냥 해라. 억지로 바꾸는것이다.

byte byteNum;
int smallIntNum = 123;

byteNum = (byte) smallIntNum;

 

다만, 바이트에 넣을 수 있는 숫자를 넘을 경우 망가진 값이 들어간다.

int intNum = 12345;

//  ⚠️ 강제로 범주 외의 값을 넣을 경우 값 손실
byteNum = (byte) intNum; // 💡 12345 % 128

2. 실수 자료형

을 알아보기 전에, 실수 자료형에 대한 제대로 된 이해를 위해

부동소수점에 대해서 먼저 알아보자.

1) 부동소수점

double a = 0.1, b = 0.2;
double c = a + b;

 

위의 코드를 디버깅해보면,

c가 0.3이 아니라 0.3000000004 뭐 이런 값이 나온다.

0.1 + 0.2 ≠ 0.3 으로 나오는 이유가 부동소수점으로 인해 발생하는 오차 때문이다.

 

왜?

실제로는 0.1이 0.1이 아니고, 0.2가 0.2가 아니기 때문

특정 자리에서 반올림하게 되어서 0.1보다 큰 숫자가 되기때문이다.

 

int

위에서 보았던 int는 소수점이 없는 정수 데이터를 저장하기 위한 자료형이다.

32개의 비트( 0또는 1로 표현되는 자리를 32개 사용한다는 말)중에서

첫번째 자리는 부호 (0또는 1), 그리고 나머지 31개로 절댓값을 표현한다

출처 - 얄코 유튜브 캡쳐

 

그런데, 소수점이 있는 자료형을 표현하려면 어떻게 해야할까?

31비트를 반으로 잘라서 분배를 하는건 어떨까. 라고 생각할것이다.

이게 고정소수점이다.

하지만 매우 비효율적이다. 반띵을 하면 앞에 정수형은 큰 수를 표현할 수 없고,

뒤의 소수점자리는 정확한 값을 표현할 수 없기 때문이다.

 

그러면 어떻게할까?

소수점을 움직이면 된다.

 

이게 바로

부동소수점 자료형 Floating point

이다.

출처 - 얄코 유튜브 캡쳐

맨 앞 8비트로 움직일 칸의 개수를 표시하고,

나머지에는 소수점 뒤로 오는 부분을 채워넣는다.


📍자료형과 크기

자료형 크기
float 4바이트
double 8바이트

 

double은 float 보다 단순히 범위가 넓은게 아니라 더 정밀하게 표현이 가능하다.

 

정밀도 테스트를 해보면 double이 더많이 표현할 수 있음을 알 수있다.

 

또, 위를 보면 알 수 있듯 float은 뒤에 f 또는 F를 붙여 표현해야한다.

 

이런 정밀도를 사용하는 문제가 있다.

아래의 백준 문제 풀이에서 더욱 상세하게 적어놓았다.

https://s2ej1n.tistory.com/78

 

[백준/Java] 1008 A/B 풀이 및 문제 (double을 사용해야하는 이유)

문제두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.입력첫째 줄에 A와 B가 주어진다. (0 // 첫번째 예시1 3// 두번째 예시4 5출력첫째 줄에 A/B를 출력한다. 실제 정답과 출력

s2ej1n.tistory.com

 

728x90
반응형