[Java] 부호없는 자료형이 없는 자바
1️⃣ 부호없는 자료형이란?
- 말그대로 음이아닌 정수만 표현하는 자료형을 말합니다.
- int형의 크기는 4바이트(2021년 기준)인데 비트로 환산하면 32비트 입니다. 이 32비트중 맨앞 1비트를
부호를 구분하는데 사용 합니다. 하지만 음수를 표현할 필요가 없게 되면 32비트를 온전히 음이아닌 정수를 표현하는데 사용할 수 있게 됩니다. - C언어같은 경우
unsigned
를 자료형 앞에 붙이면 부호가 없는 정수가 됩니다.
2️⃣ 부호없는 자료형이 필요한 이유?
(1) 메모리를 아낄 수 있다
부호비트
가 필요없게되어 메모리를 아낄 수 있습니다.- 색상(rgb)는
r(빨강) , g(초록), b(파랑), a(투명도) 각각 0 ~ 255(2^8)범위의 값을 갖기 때문에 딱 1바이트(2^8)를 필요로합니다. 부호없는 자료형이 없는 자바의 경우 어쩔 수 없이 2바이트크기의short
형을 사용할 수 밖에 없습니다. - 또한 음수를 쓸필요가 없는 경우 부호비트를 사용하는 것은 낭비입니다.
(2) 이상하다
- 나이(age), 날짜(date), 높이(height)등등.. 음수값을 가질 수있게하는 것은 이상합니다.
- 배열의 길이를 저장하는 변수가 음수값을 가질 수 있는 것도 이상합니다.
- 대부분의 실존하는 것들은 대부분 자연수인데 표현할 자료형이 없습니다.
3️⃣ 자바에도 부호없는 자료형이 있기는 하다
- 자바의
char
형은부호없는 2바이트 크기의 자료형 입니다. 유니코드 를 표현하기 위해 2바이트크기를 가지고 있으며ASCII코드 를 표현하기 위해 1바이트크기를 갖는 C언어의char형
과 차이가 있습니다.- Java가 나왔을 때 유니코드의 최댓값은 U+FFFF였다. 그렇기 때문에 2바이트의 크기지만 지금은 더 많은 크기가 필요해 졌습니다.()
4️⃣ 자바에 부호없는 자료형이 없는 이유?
- Java의 아버지라 불리는 ‘제임스 고슬링’은 다음과 같이 말했다고 합니다.
C 개발자 아무나 붙잡고 자료형 스펙을 다 기억하는지 물어봐라. 대부분의 개발자들은 부호 없는 자료형을 기억 못 할 뿐만 아니라 제대로 알지 못한다. 그렇기 때문에 깔끔히 지우는게 낫다.
5️⃣ 자바에서 부호없는 자료형 사용하기
- 위에서 살펴본 불편한 이유로 자바에서도 부호없는 자료형을 만들 수 있는 클래스를 제공했습니다.
- int의 경우 Integer클래스입니다. (
'wrapper class' 라고 불리며 다른 Primitive(원시형)자료형도 대응하는 ‘wrapper class’가 있습니다.) unsigned int
의 최대값(4294967295)을 자바의int
에 대입하면 당연히 compile오류가 생깁니다.- 다음과 같이 Integet클래스를 이용하면 됩니다.
int num = Integer.parseUnsignedInt("4294967295");
- 하지만 위의
num
을 출력해보면 오버플로우되어-1
이 출력 됩니다. - 그래서 온전한 값을 출력하기 위해 String형으로 포맷팅해주어야 합니다.
String numString = Integer.toUnsignedString(num);
- 그외에도 Integer클래스에는 부호 없는 수처럼 처리할 수 있는 수많은 메소드들을 가지고 있습니다.
6️⃣ 결론
- 그냥 부호없는 자료형 만들어 주지..