2024. 12. 20. 13:42ㆍJAVA
안녕하세요. 진득코딩입니다.
이번 시간에는 전에 간단하게 다루고 넘어간 기본형 타입에 대해서 좀 더 세부적인 내용에 대해서 살펴보도록 하겠습니다.
네 가지 기본형 중 정수형과 실수형은 다음 포스팅에서 다루기로 하고 이번 포스팅에서는 논리형과 문자형을 먼저 살펴보겠습니다.
논리형(boolean)
- 논리형에는 'boolean' 한 가지밖에 없습니다.
- boolean형 변수에는 true와 false 중 하나를 저장할 수 있으며 기본값(default)은 false입니다.
- 대답(yes/no), 스위치(on/off) 등의 논리구현에 주로 사용됩니다.
- 1bit만으로도 충분하지만, 자바에서는 데이터를 다루는 최소단위가 byte이기 때문에, boolean의 크기가 1byte입니다.
- 자바에서는 대소문자가 구분되기 때문에 True와 true는 다른 것입니다.
문자형(char)
- 문자형에는 'char' 한 가지 자료형 밖에 없습니다.
- char 타입의 변수는 단 하나의 문자만을 저장할 수 있습니다.
- 문자형 변수에는 문자가 저장되는 것이 아닌 문자의 유니코드(정수)가 저장됩니다.
- 문자 'A'의 유니코드는 65이므로, 변수 ch에는 65가 저장됩니다.
- 그렇기 때문에 문자 리터럴 대신에 뮨자의 유니코드를 직접 저장할 수 있습니다.
- 어떤 문자의 유니코드를 알고 싶으면, char형 변수에 저장된 값을 정수형(int)으로 변환하면 됩니다.
- 어떤 타입(type, 형)을 다른 타입으로 변환하는 것을 형변환(캐스팅, casting)이라고 하는데 이는 추후 포스팅에서 자세하게 다루도록 하겠습니다.
위 예제를 통해 문자 'A'의 유니코드는 65(16진수로 0x41)이고, 문자 '가'의 유니코드는 44032(16진수로 0xAC00)이라는 것을 알 수 있습니다.
특수 문자
특수 문자 | 문자 리터럴 |
tab | \t |
backspace | \b |
form feed | \f |
new line | \n |
carriage return | \r |
역슬래쉬(\) | \\ |
작은따옴표 | \' |
큰따옴표 | \" |
유니코드(16진수)문자 | \u유니코드 (예: char a='\u0041') |
여러 특수 문자를 사용하고 싶으면 위 표에 있는 문자 리터럴을 사용하면 됩니다.
위 예제를 보면 많이 사용되는 특수문자들을 적용한 모습을 볼 수 있습니다.
그 중 '\b'가 제대로 적용이 되지 않고 깨진 글자로 출력되는 것을 볼 수 있는데 이는 이클립스 콘솔 버그이므로 이를 인지하고 넘어가면 된다고 생각했습니다.
해당 버그에 대해 더 궁금하신 분은 밑에 있는 stackoverflow 링크를 참조해 주세요.
https://stackoverflow.com/questions/3095986/how-to-get-backspace-b-to-work-in-eclipses-console
How to get backspace \b to work in Eclipse's console?
I'm creating a little Java application which should have a progress indicator with percentages. In every loop it uses backspace \b to remove the displayed progress before displaying the next percen...
stackoverflow.com
char타입의 표현형식
- char 타입의 크기는 2 byte(=16bit)이므로, 16자리의 2진수로 표현할 수 있는 정수의 개수인 65536개(2^16)의 코드를 사용할 수 있습니다.
- char타입의 변수에는 문자가 아닌 문자의 유니코드(정수)가 저장되고 표형 형식은 정수형과 동일합니다.
- 같은 2byte를 사용하는 short와 비교하면 char타입에 저장되는 값인 유니코드는 모두 양수(0 포함)이므로, '0~65535'의 번위를 가지지만 정수형인 short은 절반을 음수 표현에 사용하여 '-32768~32767'을 범위로 갖습니다.
16비트로 표현할 수 있는 정수의 개수 : 2^16개( 65536개 )
short타입의 표현 범위 : -2^15 ~ 2^15-1 ( -32768 ~ 32767 )
char타입의 표현 범위 : 0 ~ 2^16-1 ( 0 ~ 65535 )
위와 같이 변수 ch와 s에 'A'와 65를 저장하면, 둘 다 2진수로 똑같은 값이 저장됩니다.
- 심지어 똑같이 65를 저장해도 출력해 보면 다른 결과가 출력되는 것을 확인할 수 있습니다.
- 이는 println()은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드 문자를 출력하기 때문입니다.
- 이처럼 값만으로는 값을 해석할 수 없습니다.
인코딩과 디코딩(encoding & decoding)
- 컴퓨터가 문자를 숫자로 변환할 때 기준으로 삼는 표를 '유니코드(unicode)'라고 합니다.
- 위 예시에서 문자 'A'를 유니코드로 인코딩하면 65가 됩니다.
- 반대로 65를 유니코드로 디코딩하면 문자 'A'가 됩니다.
- 이처럼 문자를 코드로 변환하는 것을 '문자 인코딩(encoding)'이라고 하고, 코드를 문자로 변환하는 것을 '문자 디코딩(decoding)'이라고 합니다.
- 아스키(ASCII)
- 'ASCII'는 'American Standard Code for Information Interchange'의 약자로 정보 교환을 위한 미국 표준 코드라는 뜻을 가지고 있습니다.
- 아스키는 128(=2^7)의 문자 집합(character set)을 제공하는 7bit 부호입니다.
- 처음 32개의 문자는 인쇄와 전송 제어용으로 사용되는 '제어문자(control character)'로 출력할 수 없습니다.
- 마지막 문자(DEL)를 제외한 33번째 이후의 문자들은 출력할 수 있는 문자들로, 기호와 숫자, 영대소문자로 이루어져 있습니다.
- 아스키는 숫자 '0~9', 영문자 'A~Z', 'a~z'가 연속적으로 배치되어 있다는 특징을 가지고 있습니다. - 확장 아스키(Extended ASCII)와 한글
- 아스키에서 남는 1bit의 공간을 활용해 문자를 추가로 정의한 것이 '확장 아스키'입니다.
- 확장 아스키에 추가된 128개의 문자는 여러 국가와 기업에서 서로의 필요에 따라 다르게 정의해서 사용합니다.
- ISO(국제표준화기구)에서 발표한 대표적인 확장 아스키의 표준은 'ISO 8859-1'입니다.
- 이는 'ISO Latin 1'이라고도 하며 서유럽에서 일반적으로 사용하는 문자들을 포함하고 있습니다.
- 확장 아스키로도 한글을 표현하기에는 문자의 개수가 부족하기 때문에 조합형과 완성형이라는 한글을 표현하는 방법을 생각하게 되었습니다.
- 조합형은 초성, 중성, 종성을 조합하는 방식입니다.
- 완성형은 확장 아스키의 일부 영역(162~254)에 해당하는 두 문자코드를 조합하여 한글로 표현합니다.
- 현재 조합형은 사용되지 않고 '완성형(KSC 5601)'에 없는 잘 안 쓰이는 8822글자를 추가한 '확장 완성형(CP 949)'이 사용되는데, 이것이 바로 한글 윈도우에서 사용하는 문자 인코딩입니다.
- 한글 윈도우에서 작성된 문서는 기본적으로 'CP 949(확장 완성형)'로 인코딩되어 저장됩니다. - 코드 페이지 (code page, cp)
- PC를 사용하는 지역이나 국가에 따라 여러 버전의 '확장 아스키'를 '코드 페이지(code page)'라고 합니다.
-한글 윈도우는 'CP949', 영문 윈도우는 'CP 437'을 사용합니다. - 유니코드(Unicode)
- 서로 다른 문자 인코딩을 사용하는 컴퓨터 간의 문서 교환에 어려움을 해소하고자 전 세계의 모든 문자를 하나의 통일된 문자 집합으로 표현한 것이 '유니코드'입니다.
- 2byte(=16bit)로는 부족해서 21bit (약 200만 문자)로 확장되었습니다.
- 새로 추가된 문자들을 보충문자(supplementary character)라고 하는데 이 문자들을 표현하기 위해서는 char 타입이 아닌 int 타입을 사용해야 합니다.
- 유니코드에 포함시키고자 하는 문자들의 집합을 유니코드 문자 셋(또는 캐릭터 셋, character set)이라고 합니다.
- 이 문자 셋에 번호를 붙인 것이 유니코드 인코딩입니다.
- 유니코드 인코딩에는 UTF-8, UTF-16, UTF-32 등 여러 종류가 있습니다.
- 그중 자바에서는 UTF-16을 사용합니다.
- UTF-16은 모든 문자를 2byte의 고정크기로 표현하고 UTF-8은 하나의 문자를 1~4byte의 가변크기로 표현합니다.
- 그리고 두 인코딩 모두 처음 128 문자가 아스키와 동일합니다.
- 모든 문자의 크기가 동일한 UTF-16이 문자를 다루기는 편리하지만, 1byte로 표현할 수 있는 영어와 숫자가 2byte로 표현되므로 문서의 크기가 커진다는 단점이 있습니다.
- UTF-8은 영문과 숫자는 1byte, 한글은 3byte로 표현되기 때문에 문서의 크기가 작지만 문자의 크기가 가변적이기 때문에 다루기 어렵다는 단점이 있습니다.
- 인터넷에서는 전송속도가 중요하므로 UTF-8 인코딩으로 작성된 웹문서의 수가 빠르게 늘고 있습니다.
이번 시간에는 기본형 자료형 중 논리형과 문자형에 대해서 알아보았습니다.
또한 문자형을 알아보면서 인코딩과 디코딩에 대해서도 살펴보았습니다.
앞서 한번 다룬 기본형 정도만 이해해도 기본적인 공부하는 데에는 지장이 없지만 언젠가는 알면 좋은 내용들이기 때문에 한 번씩 확인하고 넘어가는 것이 좋다고 생각합니다.
이번 포스팅은 여기까지입니다.
끝까지 봐주셔서 감사합니다.😊
'JAVA' 카테고리의 다른 글
형변환으로 다른 타입으로 변환해보자 (0) | 2024.12.24 |
---|---|
기본형 타입 중 정수형과 실수형에 대해 알아보자 (0) | 2024.12.23 |
진법을 이용하여 숫자를 여러 방식으로 표현해보자 (0) | 2024.12.19 |
자바 console에 입출력을 해보자 (0) | 2024.12.18 |
자바 변수의 타입에 대해서 알아보자 (0) | 2024.12.17 |