#문자 인코딩, Encodeing
문자를 코드로 변환하는 것
# 문자 디코딩, Decoding
코드를 문자로 변환하는 것
컴퓨터에는 모든 데이터가 숫자로 저장되어 있기 때문에 사람이 이를 읽기 위해서는 문자로 변환하는 과정이 필요하다.따라서, 인코딩과 디코딩을 통해 문자와 숫자를 변환한다.Java에서는 유니코드(Unicode)라는 기준을 통해 변환 과정이 이루어진다.
유니코드는 전 세계의 모든 문자를 하나의 통일된 문자 집합으로 표현한 것이며,유니코드에 포함시키고자 하는 문자들의 집합을 정의하여 유니코드 문자 셋(=캐릭터 셋, character set)이라고 한다.
유니코드 문자 셋에 번호를 붙인 것이 유니코드 인코딩이며, 유니코드 인코딩의 다양한 졸류 중 자바는 UTF-16을 사용한다.UTF-16은 모든 문자를 2바이트의 고정 크기로 표현한다는 특징이 있다.
1. 정수형의 표현
정수형은 부호가 있으므로 왼쪽 첫번째 비트를 부호 비트(sign bit)로 사용하며, 나머지는 값을 표현하는데 사용한다.
n비트로 표현 가능한 정수의 개수 : 2ⁿ개
n비트로 표현 가능한 정수의 범위 : -2n-1~ 2n-1 -1
(범위의 최대값에서 1이 빠지는 이유는 범위에 0이 포함되기 때문이다.)
※정수형의 오버플로우
오버플로우란?
타입이 표현할 수 있는 값의 범위를 넘어선 것을 말한다.
+) 오버플로우가 반드시 에러를 발생시키진 않지만, 예상한 결과와 다른 값이 계산될 것이다.
2진수의 '1111'에 1을 더하면 '10000'이 되는데 표현범위를 4비트로 제한한다면 맨 앞의 1은 저장되지 않는다.
이처럼 정수형 타입이 표현할 수 있는 최소값과 최대값이 정해져 있으므로 해당 범위를 벗어나지 않는다.
즉, 4비트로 표현가능한 2진수는 0000~1111이 되고, 최대값 1111에 추가연산이 이뤄지면 다시 0000이 되는 것이다.
반대로 0000에서 1을 빼면 1111이 된다.
부호가 있는 경우는 최소값과 최대값의 범위가 다르므로 오버플로우가 발생하는 시점이 위와 다르다.
부호가 없는 정수에서는 4비트의 2진수 0000~1111은 10진수로 0~15였다.
부호가 있는 정수에서는 4비트로 표현 가능한 2진수가 아래와 같다.
0000, 0001, 0010, ... , 0111, 1000, 1001, ... , 1111
1000이 되는 순간 부호가 바뀌면서 10진수로 -8이 된다.
따라서, 10진수로 표현 범위를 나타내면 -8~7이며, 부호 비트가 0에서 1이 될 때 오버플로우가 발생한다.
2. 형변환(=캐스팅, casting)
형변환이란?
변수나 리터럴의 타입을 다른 타입으로 변환하는 것이다.
방법 : 형변환을 하고싶은 변수나 리터럴 앞에 '(원하는 타입)'을 붙임
+) 타입 괄호를 캐스트 연산자 or 형변환 연산자라고 부른다.
같은 정수형 또는 실수형에서 형변환 시 주의점
→ 변환 전 타입이 변환 후 타입보다 큰 경우 '값 손실'이 발생하여 실제로 저장되는 값이 달라질 수 있다.
3. 정수형과 실수형 사이의 형변환
① 정수형을 실수형으로 변환하는 경우
정수를 2진수로 변환 → 2진수를 정규화 (1.xxx X 2ⁿ 의 형태로 바꾸는 것)
② 실수형을 정수형으로 변환하는 경우
실수의 소수점 이하 값을 버림
(남은 정수가 정수형의 저장범위를 넘는 경우 오버플로우 발생)
※ float은 7자리의 정밀도, double은 15자리의 정밀도를 가지는 것에 유의해야 함!
4. 자동 형변환
컴파일러의 판단 하에 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환이 이루어진다.
대부분 표현범위가 더 넓은 쪽으로 형변환된다.
Ex. int i = 3
double d = 1.0
d = d + i
→ 자동 형변환이 이루어져 d의 값은 4.0이 된다.
특징)
boolean은 형변환 불가능
기본형과 참조형은 서로 형변환할 수 없음
값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있음
'▶ JAVA > 개념정리' 카테고리의 다른 글
[Java] 6. 조건문 (0) | 2022.02.02 |
---|---|
[Java] 5. 연산자(2) (0) | 2022.01.28 |
[Java] 4. 연산자(1) (0) | 2022.01.27 |
[Java] 2. 진법과 2의 보수법 (0) | 2022.01.24 |
[Java] 1. 변수, variable (1) | 2022.01.21 |