자바 (ref. 자바의정석)

기본형(Primtive Type) - JAVA

쿠쿠s 2022. 3. 28. 21:54

https://dding9code.tistory.com/45?category=1258691 변수 포스팅을 했었는데 그중 기본형에 대하여 내용이 부실하여 추가로 글을 쓰게 되었습니다.

 

기본형이란?

실제 값(data)을 저장하는 데이터 타입으로 논리형, 문자형, 정수형, 실수형 으로 나누어 집니다.

 


 

논리형 (boolean)

 

- 논리형은 boolean 하나만 존재하며, boolean 변수는 true, false 밖에 저장을 할 수 없다. 기본(default)는 false 이다. 주로 대답(yes/no), 스위치(on/off), 플래그 등의 논리구현에 주로 사용된다. true, false 만을 사용하기에 1bit 로 충분하지만 자바에서 데이터를 다루는 최소 단위는 byte이다. 그래서 boolean의 크기는 1 byte이다.

 

 


 

문자형 (char)

 

- 문자형은 char 하나만 존재하며, 단 하나의 문자만을 저장합니다. 문자를 저장한다해서 문자가 메모리에 저장이 될 것 같지만, 컴퓨터는 숫자밖에 모르기 때문에 모든 데이터는 숫자로 저장이 됩니다. 실제로는 '문자의 유니코드' 가 저장이 됩니다.

char ch = 'A' // 실제는 A의 유니코드 65가 저장
char ch = '' //빈 문자열 저장 X

char 타입의 크기는 2byte(16bit)로 16자리의 2진수로 표현할 수 있는 정수의 개수(65536)를 사용할 수 있습니다.

 

컴퓨터는 숫자밖에 모르기때문에 유니코드라는 표준을 지정하게 되었다!
* 유니코드? 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준

'A' - > 65  => 인코딩(encoding)
65 - > 'A'  => 디코딩(decoding)

유니코드는 먼저 유니코드에 포함시키고자 하는 문자들의 집합을 정의하였는데 이것을 '유니코드 문자 셋' 이라고 한다.
그리고 이 문자 셋에 번호를 붙인 것이 '유니코드 인코딩' 이며 흔히 들어본 UTF-8, UTF-16, UTF-32 등이 있다.
자바에서는 UTF-16 을 사용하며 모든 문자를 2byte의 고정크기로 표현한다.

UTF-8은 1~4byte 가변 크기로 요즘 해당 인코딩으로 작성된 웹 문서가 많은데 영문,숫자는 1byte로 UTF-16을 사용하면 크기가 커져 용량이 커지는 단점이 있다. 따라서 전송속도가 중요한 인터넷에서 UTF-8을 많이 사용하고 있다.

 


 

 

정수형 (byte, short, int, long)

 

- 4개의 자료형이 있으며 각 자료형이 저장할 수 있는 값의 범위가 다르다.

  1. byte : 1byte
  2. short : 2byte
  3. int : 4byte - 기본 자료형(default date type)
  4. long : 8byte

 

우선 int 가 기본자료형이다. 왜그럴까?

- 이유는 cpu가 가장 효율적으로 다룰 수 있는 정수형 인것도 있지만 JVM의 피연산자 스택이 피연산자를 4byte단위로 저장을 하기 때문에 이보다 작으면 변환연산을 수행하게 된다. 그래서 int를 사용하는게 효율적이다.  (int 범위 넘어가면 long 사용)

 

 

정수형의 표현형식과 범위

- 어떤 진법의 리터럴을 변수에 저장해도 실제로는 2진수로 바뀌어 저장이 된다. 2진수로 저장되는 형식은 크게 정수형과 실수형이 있다.

 

S n - 1 bit

S(sign bit) : 부호 비트(양수는 0, 음수는 1)

n : 타입의 크기 (단위: bit)

 

 

 

모든 정수형은 부호있는 정수 이므로 왼쪽 첫번째에 부호비트를 사용하고 나머지는 값을 표현을 합니다.

n비트로 표현할 수 있는 정수의 개수: 2^n개 ( 2^n-1 + 2^n-1개)
n비트로 표현할 수 있는 부호있는 정수의 범위: -2^n ~ 2^n - 1

ex) int => 4byte => 32bit => -2^31 ~ 2^31 - 1 // (-1은 범위에 0이 포함되었기 때문에, 0~15 = > 16개)

 

 

 

만약의 타입이 표현할 수 있는 범위를 넘어서면 어떻게 될까? 오버플로우가 일어나게 됩니다.

자동차 km 표시기를 생각하면 쉬울 것 같습니다. 간단하게 '0000 ~ 9999' 4자리리를 표시할 수 있는 계기판이 있는데 '9999' 에서 1을 더하면 원래는 '10000'이 되어야하지만 5자리를 표시를 할 수 없어 앞에 1이 버려져 '0000'이 됩니다. 그럼 '0000'에서 -1을 빼면 어떻게 될까요? 0에서 1을 뺄 수 없어 앞에 저장되지 않은 1이 있다 생각하고 계산을 하여 네자리로 표현할 수 있는 최대값 '9999'가 됩니다.

 

최대값 + 1 ---> 최소값
최소값 - 1 ---> 최대값

 

 

 


 

 

실수형 (float, double)

 

실수형은 실수를 저장하기 위한 타입으로 2가지가 있습니다.

타입 저장 가능한 값의 범위(양수) 정밀도 크기
float 1.4 x 10^-45 ~ 3.4 x 10^38 7자리 4byte(32bit)
double 4.9 x 10^-324 ~ 1.8 x 10^308 15자리 8byte(64bit)

 

해당 범위는 양수만 적은 범위로 - 만 붙이면 음수의 범위가 됩니다. 실수형은 '얼마나 큰 값을 표현할 수 있는가' 뿐만아니라 '얼마나 0에 가깝게 표현할 수 있는가' 도 중요합니다. 표에 '정밀도' 라는게 써져있는데 정밀도는 10진수를 오차없이 저장가능한 자리수를 나타냅니다. 

예를들어 '123456789012345678901234' 라는 수가 있는데 float 형태는 9.12345695495605500000 이라는 형태 소수점 6자리 이후부터로 오차가 발생하고 dobule형은 9.12345678901234600000 으로 소수점 14자리까지 오차없이 저장이 됩니다.

그래서 더 많은 값의 범위나 높은 정확도를 요구하면 'double' 형을 사용해야 합니다.

 

실수형은 정수형과 달리 표현범위를 벗어나게 되면 '오버플로우'가 발생을 하지만 최소값으로 돌아가는게 아닌 무한대로 나타나게 됩니다. 그리고 정수형에는 없는 '언더플로우' 가 있는데 실수형으로 표현할 수 없는 아주 작은 값으로, 최소값보다 작은 값이 되는 경우를 말합니다. 이때 변수의 값은 0 이 됩니다.