[JAVA] Bit vs Byte, 2진수 ~ 16진수

이번에 알아볼 내용은 컴퓨터 공학에서 가장 기초적이면서도 가장 기본이되는 Bit 및 Byte에 대하여 알아보려고 합니다. 그러나 그 전에 먼저 2진수 및 16진수를 알아야합니다. 하지만, 이걸 배우기 전에 또 먼저 진법에 대하여 간단히 살펴보고 가도록 하겠습니다.


우리말로 진법은 영어로 Radix라고도 표현을 하기도 합니다. 컴퓨터 용어에서 진법이란 수학에서 진법과 동일(?)한 개념입니다.


수의 표현에 사용될 수 있는 숫자기호의 개수와 그 자리수를 의미한다. 

또는 위치에 대한 값을 정의해주는 수의 체계


정의가 참 어렵죠? 간단히 말해 우리가 일상에서 0,1,2,3,4,5,6,7,8,9 까지 수를 셀수 있는 방법을 진법 즉, 10진법(10진수)이라고 합니다. 10개의 개수로 수를 셀수 있는 체계라는 말이죠.


그러면 여기서 2진수(2진법)은 뭘까요? 뭔진 몰라도 위 10진수의 정의를 빌리자면 2진법은 2개의 개수로 수를 셀수 있는 체계 이겠죠? 그래서 2진수는 2개 즉, 0,1로 수를 세는 체계입니다. 일단 여기까지만 생각하죠. 더 자세한건 좀 더 있다 상세히 설명하도록 하겠습니다.


자 그럼 또 16진수란 뭘까요? 16진수를 알기전에 먼저 8진수라는 것도 존재하니 이걸 먼저 알아보고 가도록 하겠습니다.


8진수(8진법)란 0,1,2,3,4,5,6,7 까지 8개의 숫자로 수를 셀수 있는 체계입니다. 그럼 마지막으로 16진수(16진수)란 뭘까요? 당연히 16개의 숫자로 수를 셀수 있는 체계이겠죠? 그런데 여기서 잠깐 0~9까지는 알겠는데 그럼 10은 10으로 표현하나? 라고 눈치 빠르신 분들은 의문을 가졌겠죠? 물론 그렇게 표현할수도 있었을거 같은데 먼저 정의내린 저 영미권 선인(?)들께서 10은 A or a로 11은 B or b로 12는 C or c로 13는 D or d로 14는 E or e로 15는 F or f로 표현하자고 규칙을 정했습니다.


그래서 아마도 간혹 이런 것들을 봤을 겁니다. 0x00FA 이것이 16진수로 표현된 10진수의 값 250을 16진수로 표현한 값입니다. 이에 대한 이해는 이글이 끝날때쯤 알수 있을거 같네요.


정리하자면 아래와 같을 것  같습니다.


2진수(Binary) 0 or 1 만으로 표현하는 수의 체계

8진수(Octal) 0 ~ 7 로 표현하는 수의 체계

10진수(Decimal) 0 ~ 9 로 표현하는 수의 체계

16진수(Hex) 0 ~ 9, A ~F 로 표현하는 수의 체계



자 여기까지 일단 수의 진법 즉 수의 체계는 어느정도 감을 잡았을 것이라 생각됩니다. 

자! 그럼 본격적으로 이제 컴퓨터와 연결지어 이야기해야할 시간이 되었습니다. 그러면 왜 이렇게 2진수 8진수 16진수 들이 존재하는 것일까요? 간략히 말해 최초의 컴퓨터는 원래 10진수를 사용하여 처리하였다고 합니다(믿거나 말거나) 그런데 그당시 전기신호 즉, 전기를 처리하는 회로들을 가지고 1단계부터 10단계까지 전압을 처리하기가 어려웠던것이죠 그래서 그냥 편리하고 안정적인 2단계 즉 0(OFF) or 1(ON)으로 전기가 들어오고 나가고만 가지고 처리하기 시작했던 것이죠.


그렇게 2진수 즉 ON/OFF가 탄생하게 되었던 것입니다. 그런데 이렇게 2진수만으로 표현하다보니 컴퓨터가 내부적으로는 처리하는데 문제가 없었지만 사람(물론 공학자들 이었겠죠)이 이를 보고 표현하고 분석하는데는 자리수가 너무 많고 복잡했던 것이죠.

01010001111001100001111 식으로 그것도 수백자리는 기본 수천자리를 표현한다면? @,.@

그래서 가독성을 위해 보완하기 시작한 첫번째 표현법이 3개의 비트를 합친 8진수가 등장하고 또 이걸로도 부족하여 4개의 비트를 합친 16진수가 등장하게 된것이죠.

일단 11111111를 8진수로 하면 377이고 16진수로 하면 FF가 되죠. 2진수 8자리가 3자리로 다시 2자리로 줄어들었죠? 이게 수천개라면 확실히 효과가 있겠죠?


물론 지금 현대시대는 일반사람이나 개발자도 기계어(2진수)나 8진수 16진수를 볼일이 드물지만 컴퓨터가 처음 생긴 시대에는 현재의 프로그래밍이라는 기법이 사람이 볼수 있는 영단어로된 코드들이 아니라 기계어 또는 어셈블리어(기계어에 가까운 코딩기법)으로 코딩을 했다고 하죠.


그래서 위와 같은 진법은 그당시 아주 큰 효과가 있었을거로(살아보진 않았지만) 예상합니다. ^^


결론은 2진수는 컴퓨터가 처리하기위해 꼭 필요한 처리 체계이고, 2진수를 8진수 16진수는 사람이 보기 불편하여 만든 방법이다.


현재 개발자들이라면 2진수는 컴퓨터 공학에서 필수로 배울 것이고 8진수는 그닥(?) 16진수는 개발 또는 코딩할 경우 아주 많이 사용하죠. 그러니 최소한 2진수와 16진수의 표현법 및 교환법은 달달달 외워야 하겠죠? ^^


16진수는 대표적으로 rgb 컬러 코드(#ff00ff), 유니코드(\u0061, U+0061, 0x0061 등등)에서 아주 아주 많이 쓰인답니다.

비트(2진수)는 컴퓨터가 처리하는 최소 단위로 이제 확실하게 이해 했을거라 생각합니다. 하지만 바이트(8bit)는 아직도 좀 의아한 분들을 위해 부연설명을 드리자면, 초기(?) 범용 컴퓨터는 내부적으로 하나의 명령어를 처리하는 단위가 8비트 였던 시절이었습니다. 그래서 아마도 명령어의 하나의 처러 단위가 8비트였던 관계로 이것을 기준으로 체계를 정리하였던 것이죠.


bit와 byte의 차이점과 보다 자세한 정보는 아래의 블로그를 참조하시면 좋을거 같습니다.


[ 네트워크 쉽게 이해하기 1편 ] Bit 와 Byte 차이점



위의 그림은 [ 네트워크 쉽게 이해하기 1편 ] Bit 와 Byte 차이점 에서 가져온 것임을 미리 알려드립니다.


그래서 위 내용을 바탕으로 자바에서 변수 종류별로 boolean은 1바이트, short는 2바이트, int는 4바이트 등에 대한 최소 최대값을 계산해보면 아래와 같은 것이죠

1byte(8bit) 0 ~ 256 음수표현시(-128 ~ 127)

2byte(16bit) 0 ~ 65,535 음수표현시(-32,468 ~ 32,767)

4byte(32bit) 0 ~ 4,294,967,295 음수표현시(-2,147,483,648 ~ 2,147,483,647)


여기까지 지루한(?)글을 읽어주셔 감사합니다. 오늘도 열공하는 여러분 화이팅~~~


댓글

이 블로그의 인기 게시물

Cordova 요구사항 android sdk/gradle 오류 해결 방법

[JAVA] 아카이브 파일 Export/Import 방법

[JAVA] JVM, JRE, JDK 이해하기