본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 7일차 - Java프로그래밍 기초(문자집합 & 수)

by kk_naks 2024. 6. 3.

1. 문자집합

  1.1 문자 집합의  발전과정 및 특징

     - ACII 코드 

- 알파벳을 2진코드로 변환하기 위해 만들어진 약속
- 7비트로 128개의 문자를 저장가능 

 

    ※ 줄바꿈 코드 

- 운영체제 별로 줄바꿈(개행 방법이 다르다)
- Linux/Unix : LF(Line Feed) 0x0A
- Window : CRLF(Carrage Return Line Feed) 0x0D 0x0A
- 과거 OS간에 개행에 대한 호환이 안되었지만 지금은 호환가능하다.

 

     - ISO-8859-1

 - 기존 ASCII/ANSI 방식의 확장버전 
- ISO-8859-1~4 버전까지 있으며, 기존 ASCII 문자와 추가적인 라틴계열 문자가 더해졌다.

 

     - EUR-KR

- 한글 도입을 위해 도입된 인코딩 방식
- 한글 2350자를 나타 낼수 있지만, 한글 음절의 수는 11,172자로 고어를 포함한 일부 음절은 인코딩이 불가능하다.
   ex) "똡","똣"

     - 조합형

- 기존 완성된 글자를 2진코드로 변환한것(완성형)과 달리
- 한글의 초성,중성,종성을 가지고 조합하여 글자를 인코딩하는 방법(조합형)
- 한컴오피스의 초창기 적용된 인코딩방식(당시 MS949는 없었다.)
- 총 2byte(16bit)로 한글(1bit) + 초성(5bit), 중성(5bit), 종성(5bit)으로 구성되어 있다.
- 한국어 자체 인코딩으로 국제표준이아니다. (16bit의 절반을 한글이 사용하면 다른나라 언어 어케 적용해...)

     

     - MS949(CP949)

- MS에서 한글을 지원하기 위해 만든 문자집합
- EUC-KR + 알파 하여 11,172자를 표현할 수 있다. 
- EUC-KR 기반으로 2byte를 차지하며, 국제 표준은 아니다. 

 

     - Unicode(UTF-16)

- 전세계 문자코드를 새로 지정 
- 32bit를 할당 했지만 실제 사용되는 코드는 21비트만 사용한다. 
- 한글과 영어 모두 2byte로 표현 가능하다.
- 국제 표준이고  자바에서 문자를 다룰 때 사용한다. 

 

     - UTF-8

- 서구권에서는 기존 1Byte만 할당하던 문자를 2Byte까지 늘려야 하는 문제가 발생
   (메모리 1bit가 귀하던 시절에..)
- UTF-16을 변형하여 새로이 적용
- 영어는 1Byte를 사용하고 한글은 3Byte를 사용한다. (한국에서 초전도체 나오기 전까지 안바뀔듯)

UTF-8 변환 규칙

 

2. 수를 메모리에 저장하는 방법

  2.1 Sign-Magnitude방식 

     - 최상위 비트에 부호비트(양수 : 0, 음수 : 1)를 할당하고 나머지 비트에는 절대값을 할당한다.

- 사용하기 간단하나 양수+음수 계산에서 잘못된 결과를 산출한다. 
   ex) 0001(1) + 1001(-1) = 1010(-2) ?!?!
- 0이 두개의 값으로 존재한다. (+0,-0)
- 그렇기 때문에 일반적인 정수로 사용하지 않고, 부동소수의 가수부에 사용된다.

 

  2.2  1의 보수

     - 주어진 비트를 반전

- 마찬가지로 양수 + 음수에서 잘못된 결과를 가져온다. 

 

  2.3 2의 보수

     - 1의 보수에서 1을 더하여 얻은 값

- Java에서 음수를 적용할 때 사용하는 방법(대부분의 언어에서 위 방식을 사용)
- 부호가 다른 같은 수를 더하면 0이 나온다(자리수가 올라가서 overflow가 발생하므로)

 

  2.4 K-excess

     - bias를 적용하여 값의 기준을 이동한다. 

8bit 기준으로 a = 13을 변환하면
- k(bias) = 2^(8-1)-1 = 127
- a + k = 13 + 127 = 140 
- 140 = 0b1000 1100  = 0x8C
- 부동소수점의 지수부를 저장할때 사용한다. 

  2.5 부동소주를 메모리에 저장하는 방법 

     - 부동소수는 float, double이 있다.

     - 부동소수 저장 방법은 IEEE754에 따른다. 

 

부동소수 계산 방법
1) 값을 2진수로 변환 
2) 정규화 
3) 가수부는 sign-magnitude 지수부는 k-excess 방식으로 변환

ex) 12.375 
1) 2진수 변환 : 1100.011
1.1) 12변환 : 0b 0000 1100
1.2) 소수부 변환
       0.375 변환 : 0.375 * 2 = 0.75  ---- 0
       0.7      변환 : 0.75   * 2 = 1.5     ---- 1
       0.5      변환 : 0.5     * 2 = 1.0     ---- 1
       0.375 변환 :  0b 011
2) 정규화 : 1.100011 * 2^3 
2.1) 정규화를 통해 가수부는 항상 1이므로 1을 무시한다. 
3) 가수부 : 100011, 지수부 :  1000 0010 (3+127 = 130)

결과
부호 비트 : 0 
지수부 : 1000 0010
가수부 : 10001100000000000000000

0b :  0100 0001 0100 0110 0000 0000 0000 0000
0x : 4146 0000