[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오류가 생깁니다. compileerror1

  • 다음과 같이 Integet클래스를 이용하면 됩니다.
int num = Integer.parseUnsignedInt("4294967295");
  • 하지만 위의 num을 출력해보면 오버플로우되어 -1이 출력 됩니다.
  • 그래서 온전한 값을 출력하기 위해 String형으로 포맷팅해주어야 합니다.
String numString = Integer.toUnsignedString(num);
  • 그외에도 Integer클래스에는 부호 없는 수처럼 처리할 수 있는 수많은 메소드들을 가지고 있습니다.

6️⃣ 결론

  • 그냥 부호없는 자료형 만들어 주지..




© 2021.02. by kirim

Powered by kkrim