Chapter 2-3 기본형(Primitive type)

HeeSeong·2021년 5월 12일
0

Java

목록 보기
3/3
post-thumbnail

1. 논리형 - boolean

boolean형 변수에는 true와 false 중 하나를 저장할 수 있으며 기본값은 false다.
주로 yes/no, on/off 등의 논리구현에 주로 사용된다. boolean의 크기는 1byte이다.

boolean power = true;  // 정상
boolean checked = False;  // 에러. false로 바꿔야 함

2. 문자형 - char

문자를 저장하기 위한 변수를 선언할 때 사용되며, char타입의 변수는 단 하나의 문자만을 저장할 수 있다.

char ch = 'A';

위에서 변수에 문자가 저장되는 것 같지만, 사실 문자의 유니코드가 저장된다. 컴퓨터는 숫자밖에 모르기 때문에 숫자로 변환하여 저장하는 것이다.


문자 리터럴 대신 문자의 유니코드를 직접 저장할 수도 있다. 문자 'A'의 유니코드는 10진수로 65이기 때문에 아래 두개의 문장은 같은 결과를 얻는다.

char ch1 = 'A';
char ch2 = 65;

'가'라는 문자 리터럴 대신에 유니코드를 직접 사용할 수도 있다.

char hch1 = 0xAC00;  // '가'
char hch2 = '\uAC00';

그래서 만약 어떤 문자의 유니코드를 알고 싶으면 char형 변수에 저장된 값을 정수형(int)으로 변환하면 된다.

int code = (int)ch;

2-1 특수 문자 다루기

영문자 이외에 tab이나 backspace 등의 특수문자를 저장하려면, 특별한 방법을 사용한다.


System.out.println('\'');  // '
System.out.println("abc\t123\b456");  // abc	12456
System.out.println('\n');  // 개행문자 출력하고 개행
System.out.println("\"Hello\"");  // "Hello"
System.out.println("c:\\");  // c:\

2-2 char 타입의 표현방식

char 타입의 크기는 2byte이므로, 16자리의 2진수로 표현할 수 있는 정수의 개수인 65536개 (=2162^{16})의 코드를 사용할 수 있으며, char 타입의 변수에는 문자가 아닌 '문자의 유니코드'가 저장되고 표현 형식 역시 정수형과 동일하다. 하지만 정수형과 달리 음수를 나타낼 필요가 없으므로 0 ~ 65536의 범위를 가진다. 정수형 short는 절반을 음수표현에 사용하므로 -32768 ~ 32767을 범위로 갖는다.

char ch = 'A';
short s = 65;

System.out.println(ch);  // A
System.out.println(s);  // 65

ch와 s는 똑같은 2진수 값(0000000001000001)이 저장되지만 출력해보면 결과가 다르다. println()은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드를 출력하기 때문이다.


3. 정수형 - byte, short, int, long

정수형에는 4개의 자료형이 있으며, 각 자료형이 저장할 수 있는 값의 범위가 서로 다르다.
byte부터 long까지 1byte부터 시작해서 2배씩 크기가 증가한다.


3-1 정수형의 표현 형식과 범위

어떤 진법의 리터럴을 변수에 저장해도 실제로는 2진수로 바뀌어 저장된다. 2진수는 정수형과 실수형으로 저장되며, 모든 정수형은 부호있는 정수이므로 왼쪽의 첫 번째 비트를 부호비트로 사용하고, 나머지는 값을 표현하는데 사용한다. 그래서 n비트로 표현할 수 있는 값의 개수 2n2^n의 절반인 2n12^{n-1}개의 0과 양수의 표현에 사용하고 나머지 절반은 음수의 표현에 사용한다.
즉 범위는 2n1-2^{n-1} ~ 2n112^{n-1}-1 이다.


3-2 정수형의 선택기준

byte나 short가 크기가 작아서 메모리를 더 절약할 수 있지만, 저장할 수 있는 값의 범위가 작아서 범위를 넘어 잘못된 결과를 얻기 쉽다. 그리고 JVM의 피연산자 스택이 피연산자를 4byte 단위로 저장하기 때문에 크기가 4byte보다 작은 byte, short의 값을 계산할 때는 4byte로 변환하여 연산이 수행된다. 따라서 byte나 short보다 int를 사용하는 것을 권장한다.


3-3 정수형의 오버플로우

2진수 1111에 1을 더하면 10000이 되지만 4bit로는 4자리의 2진수만 저장할 수 있기 때문에 '0000'이 된다. 이처럼 연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 '오버플로우'라고 한다.
정수형 타입이 표현할 수 있는 최대값에 1을 더하면 최소값이 되고, 최소값에서 1을 빼면 최대값이 된다.

부호있는 정수는 부호 비트가 0에서 1이 될 때 오버플로우가 발생한다.

기본적으로 자바에서 unsigned integer는 없다. 하지만 부호없는 정수가 필요한 경우가 있다. 네트웍 입출력이나 숫자가 아닌 색상이나 이미지의 비트열을 다룰 때는 부호가 필요치 않다.


4. 실수형 - float, double

실수형은 실수를 저장하기 위한 타입으로 float와 double, 두 가지가 있으며 각 타입의 변수에 저장할 수 있는 값의 범위는 아래와 같다.

4-1 실수형의 범위와 정밀도

float 타입의 표현 범위는 3.41038-3.4 * 10^{38} ~ 3.410383.4 * 10^{38}이지만, 0을 제외한 1.41045-1.4 * 10^{-45} ~ 1.410451.4 * 10^{-45} 범위의 값은 표현할 수 없다. 정수형과 달리 실수형은 오차가 발생할 수도 있다는 단점이 있다. 실수형은 소수점 수도 표현해야 하므로 '얼마나 큰 값을 표현할 수 있는가' 뿐만 아니라 '얼마나 0에 가깝게 표현할 수 있는가'도 중요하다.

실수형에서도 변수의 값이 표현범위의 최대값을 벗어나면 '오버플로우'가 발생하는데, 정수형과 달리 실수형에서는 오버플로우가 발생하면 변수의 값은 무한대가 된다.
또한 정수형에는 없는 '언더플로우'가 있는데 실수형으로 표현할 수 없는 아주 작은 값, 즉 양의 최소값보다 작은 값이 되는 경우를 말한다. 이때 변수의 값은 0이 된다.


float은 정밀도가 7자리인데, 이것은 a10na * 10^n의 형태로 표현된 7자리의 10진수를 오차없이 저장할 수 있다는 뜻이다. 만일 7자리 이상의 정밀도가 필요하다면 변수의 타입을 double(15자리)로 해야한다.

연산속도의 향상이나 메모리를 절약하려면 float을 선택하고, 더 큰 값의 범위라던가 더 높은 정밀도를 필요로 한다면 double을 선택하면 된다.


4-2 실수형의 저장형식

int 타입은 (부호, 값) 2개의 부분으로 이루어져 있지만, float 타입과 같은 실수형은 (부호, 가수, 2지수2^{지수}) 3개의 부분으로 이루어져 있다. 실수형은 값을 부동소수점수의 형태로 저장한다. 부동소수점수는 실수를 ±M2E±M * 2^E 형태로 표현하는 것을 말한다.

  • 부호 : 크기는 1bit이다. 이 값이 0이면 양수를, 1이면 음수를 의미한다. 정수형과 달리 '2의 보수법'을 사용하지 않기 때문에 양의 실수를 음의 실수로 바꾸려면 그저 부호비트만 0에서 1로 변경하면 된다.

  • 지수 : float의 경우 8bit의 저장 공간을 갖는다. 지수는 부호있는 정수이고 8bit로는 모두 282^8개의 값을 저장할 수 있으므로, -127 ~ 128의 값이 저장된다. 이 중에서 -127과 128은 숫자 아님이나 양의 무한대, 음의 무한대와 같이 특별한 값의 표현을 위해 예약되어 있으므로 실제로 사용가능한 지수의 범위는 -126 ~ 127이다.

  • 가수 : 실제 값인 가수를 저장하는 부분. 2진수 23자리를 저장할 수 있다.
    즉 약 7자리의 10진수를 저장할 수 있는데 이것이 바로 float의 정밀도가 된다

profile
끊임없이 성장하고 싶은 개발자

0개의 댓글