본문 바로가기
IT 돌고래/JAVA

[JAVA]자바의 네걸음 : 변수 + 알파(진법, 진수, 진법 변환, 보수, 문자 표현 방법)

by IT돌고래 2020. 1. 19.
반응형

안녕하세요.

IT 돌고래입니다.

자바의 변수의 알파로 진법, 진수, 진법 변환, 보수, 문자 표현 방법에 대해서 이야기를 하겠습니다.

 

진법이란?

수를 셀 때 자리 수가 올라가는 단위를 기준으로 하는 셈법을 말합니다. 그럼 이 진법을 통해 나타낼 수 있는 수의 갯 수가 진수가 됩니다.

사람이 사용하는 진법이랑 진수는 뭐일까요?

사람들이 사용하는 진법은 10진법이고 진수는 10진수입니다. 저희가 잘 생각해보시면 0~9를 하고 9에서 1을 더하면 자릿수가 바뀌어서 10이 됩니다. 그렇기 때문에 사람은 10진법 10진수를 사용하고 있습니다.

사람은 10진법과 10진수를 사용하고 컴퓨터의 체계에서는 0과 1밖에 없기 때문에 2진법과 2진수를 사용합니다. 2진수는  0~1을 하고 1에서 1을 더하면 2가 되는 것이 아니라 10이 됩니다. 

컴퓨터는 2진법을 쓰고 사람은 10진법을 쓰는데 어떡해 우리들은 이렇게 편하게 컴퓨터를 사용하고 있는 걸까요?

이유는 간단합니다. 10진수의 값을 2진수로 바꿔서 컴퓨터는 사용하고 사람에게 보여줄 때는 10진수로 보여주기 때문에 컴퓨터를 사용할 때 불편함을 느끼지 못했던 것입니다. 이렇게 진법을 바꾸는 것을 진법 변환이라고 합니다.

진법 변환 이란?

현재의 진법을 다른 진법으로 변환하는 것을 말합니다. 이렇게 사람은 10진법 컴퓨터는 2진법을 사용하지만 사람들이 2진법을 더욱더 편하게 사용하기 위해 사람들이 8진법과 16진법을 만들었습니다.

그래서 2진법 8진법 10진법 16진법에 대해서 한번 보겠습니다.

 

2진법 0~1
8진법 0~7
10진법 0~9
16진법 0~F(A:10, B:11, C:12, D:13, E:14, F:15)

자리올림이 발생하기 전에 자릿수는 이렇게 표현됩니다.

2진법은 1에서 1을 더하면 자리 올림이 발생해서 10이 됩니다.

8진법은 7에서 1을 더하면 자리 올림이 발생해서 10이 됩니다.

10진법은 9에서 1을 더하면 자리 올림이 발생해서 10이 됩니다.

16진법은 F에서 1을 더하면 자리 올림이 발생해서 10이 됩니다.
다 10처럼 보이지만 10진법만 10이라고 말하지 다른 진법들은 10이라고 표현을 하지 않습니다.

이제 진법 변환을 한번 해보겠습니다.

 

1. 2진법 -> 10진법

2의7승 2의6승 2의5승 2의4승 2의3승 2의2승 2의1승 2의0승
0 0 1 0 0 1 1 0

위에 표처럼 자리별로 승수의 값이 들어가서 1로 표신 된 승수를 더하면 10진수의 값이 나오게 됩니다.

예를 들어 위에 표에 있는 값은 2의 1승 2의 2승 이기 때문에 2 + 4  + 32이기 때문에 10의 진수로 38이 됩니다.

 

2. 2진법 -> 8진법

2의1승 2의0승 2의2승 2의1승 2의0승 2의2승 2의1승 2의0승
0 0 1 0 0 1 1 0

위에 표를 보면 2진법의 값을 3자리씩 자르면 7이 됩니다. 그래서 8진수의 값으로 나타내면 46이 됩니다.

 

3. 2진법 -> 16진법

2의3승 2의2승 2의1승 2의0승 2의3승 2의2승 2의1승 2의0승
0 0 1 0 0 1 1 0

위에 표를 보면 2진수의 값을 4자리씩 자르면 15가 F가 됩니다. 그래서 16진수의 값으로 나타내면 26이 됩니다.

 

4. 10진법을 다른 진법으로 표현

 

10진수 35를 2진수로 변환을 합니다.

35/2 몫 : 17 나머지 1 

17/2 몫 : 8   나머지  

8/2 몫 : 4  나머지 0   

4/2 몫 :2 나머지 0       

2/2 몫 : 1    나머지 0

 

마지막 나누어진 몫부터 시작하여 역으로 나머지를 연결시키면 됩니다. 그럼 100011이 나오게 됩니다.

2의7승 2의6승 2의5승 2의4승 2의3승 2의2승 2의1승 2의0승
0 0 1 0 0 0 1 1

2의 5승 + 2의 1승 + 2의 0승은 35가 되기 때문에 정확하게 일치합니다.

 

10진수 35를 8진수로 변환을 합니다.

35/8 몫 : 4   나머지 : 3

더 이상 나눌 수 없기 때문에 43이 됩니다.

 

10진수를 35를 16진수로 변환을 합니다.

35/16 몫 : 2   나머지 : 3 

더 이상 나눌 수 없기 때문에 23이 됩니다.

 

5. 16진수 8진수의 10진수 2진수로의 변환

 

16진수와 8진수를 2진수로 변환을 시키려면 위에서 10진수를 2진수 변환을 하는 방법과 똑같이 2로 나누어서 마지막 몫과 역으로 나머지를 연결하면 됩니다.

 

16진수와 8진수를 10진수로 표현을 하려면 2진수로 변환을 시켜서 2진수가 된 값을 2진수 -> 10진수 변환을 하는 방법으로 변환을 하면 됩니다.

 

이런 진법 변환으로 컴퓨터가 데이터를 처리하게 됩니다.

 

6. 보수

 

하지만 또 문제가 있습니다. 숫자는 양수도 있지만 음수가 있기 때문에 음수는 어떡해 컴퓨터 표현을 할지 사람들의 고민이 많았습니다. 그래서 처음에 나온 방식이 1의 보수라는 것이 나왔습니다.

 

위에 표처럼 1의 보수가 나왔는데 음수 양수를 보시면 1(0001)을 보수를 하면 -1(1110)이 되고 2(0010)를 보수를 하면 -2(1101)이 됩니다. 이렇게 0과 1이 바뀌면 음수를 표현을 했습니다.

여기에는 문제가 있습니다. 0이 문제가 됐습니다. 0이 양수의 0과 음수의 0이 생기면서 불필요한 값이 발생되면서 2의 보수법이 나왔습니다.

2의 보수법은 1의 보수법의 값에서 1을 더해서 값을 표현을 하는 것을 2의 보수법이라고 합니다.

 

위에 표를 보면 1의 보수로 -1(1110)에 1을 더해서 1111을 -1이라고 하면서 음수 -0이 없어지고 음수의 값을 하나 더 표현을 할 수가 있게 됐습니다. 그래서 지금은 2의 보수법으로 컴퓨터가 음수를 표현하고 있습니다.

 

7. 문자 표현 방법

 

이렇게 사람들이 사용하고 있는 숫자인 음수와 양수를 컴퓨터가 표현하고 쓸 수가 있는 것을 위에서는 알 수가 있습니다. 그럼 문자는 과연 어떻게 표현을 할 수가 있는 걸까요?

바로 언어마다 유니코드를 두어서 알고 보면 코드표에 문자를 지정해놓고 숫자로 값을 저장하고 있다고 요청이 발생하면 사용자에게는 문자로 보여줍니다.

 

 

위에 그림 같이 A라는 문자가 들어오면 유니코드에 값인 65로 저장을 했다가 다시 사용자에 요청으로 값을 출력해주면 문자 A로 출력을 해줍니다.

이렇게 유니코드를 사용하여 문자를 표현을 하기 때문에 숫자 문자를 변수로 표현할 수가 있습니다.

※유니코드는 문자를 숫자로 표현을 할 수 있는 코드표입니다.

 

※ 긴 글을 읽어 주셔서 감사합니다. Java를 계속 진행해 나가겠습니다.

 

★ 이글 이후에는 Java 연산자와 형 변환에 대한 내용을 정리해서 처음부터 정리를 할 예정입니다. 많은 관심 부탁드립니다.

 

반응형

댓글