원래 블로그 운영하면서 뻘글을 잘 안쓰는 편인데, 오늘은 이래저래 고민이랄까 생각이랄까 할만한 주제가 있는 것 같아서, 과거의 내가 이런 생각을 하기도 했구나 하는 기록 겸 뻘글 겸 생각정리 글을 한번 써볼 까 한다.

 

글을 쓸려고 하는데 벌써부터 조금 귀찮아 지기 시작했다.

ㅋㅋㅋㅋㅋ 최대한 간결하게 써보자.

 

정파 vs 사파

요즘 SW관련 직종들 주변 동기들 사람들 보면, 크게 두가지 공부방법의 부류로 나뉘는 것 같다.

속칭 정파와 사파.

 

뭐 정확한 분류는 아니지만, 대충 설명해보자면 정파는 전통적인 컴퓨터공학과 커리큘럼을 따라서 기본기를 다진 뒤, 실무에 필요한 내용들을 익히는 순서를 갖고, 사파는 실무에 필요한 내용들을 익히기 위한 기본기를 그때그때 찾아서 공부하는 방식이라고 정의해보자.

 

 아마 컴퓨터 공학과 교수님들과 같은 교육자들은 정파가 더 좋고 맞다고 주장할 것이다.

정파 방식의 공부법의 장점

정파 방식의 공부방법에서 전통적인 CS 기본기들을 먼저 익히는 이유는, CS기본기들은 유행을 잘 타지 않는 foundation에 가깝고, 이것들을 바탕으로 유행을 잘 타는 cutting-edge skill set을 쉽게 익힐 수 있다는 이유이다.

 

다만 이 CS Foundation들을 익히는데 시간이 다소 소요된다. 우리가 컴퓨터공학과 학부 교육과정을 중요시 해야 하는 이유는 이 때문이다.

따라서 정파 방식의 공부를 했다면 어떠한 SW관련 업무를 하더라도 안정적인 실력을 가져가면서 좋은 러닝커브로 빠르게 학습할 수 있다는 장점이 생긴다.

 

사파 방식의 공부법의 장점

그렇다면 사파의 공부방법은 정파에 비해 장점이 없는 것일까?

사파의 공부 방법을 하면 최신 트렌드에 실무에 필요한 내용들을 선택적으로 공부를 할 수 있다.

요즘은 신기술이 나오는 속도가 우리가 기술을 학습하는 시간보다 빠르다고 할 정도로 신기술들이 쏟아져 나오는데, 당장 써먹을 수 있는 practical한 것들 위주로 학습을 할 수 있는 것이다.

 

다만 필요한 foundation이 부족한 경우 learning curve가 급격히 안좋아질 수 있다는 점이 단점이다.

 

특히나 요즘 핫한 AI, DNN, 빅데이터 등의 기술이나 보안분야는 최신 트렌드의 기술들을 학습하는 것이 매우 중요하기 때문에, 이러한 분야에는 사파식 공부가 적용하는 것도 꽤나 괜찮은 선택일 수 있다.

 

특히나 해당 분야는 Specialist가 부족하기 때문에 해당 분야를 잘 파서 희소성을 바탕으로 좋은 대우를 받아볼 수도 있을 것이다.

다만 사파로 시작하였더라도 나중에는 부족한 Base들을 스스로 채울 수 있는 insight가 있는 것이 좀 더 롱 런할 수 있는 Specialist가 되지 않을까 싶다.

 

결론

나는 개인적으로 정파방식의 공부법이 맞다고 믿어왔고, 그렇게 해왔다. 하지만 지금으로서는 CS Foundation은 나쁘지 않다고 생각하지만 그 이후에 자신을 Specialize할 수 있는 특기가 부족하다는 생각이 다소 든다.

 

공부를 시작한 방법이 정파든 사파이든 결론적으로 base나 specialized skill set이나 둘 다 가지고 있어야지 진정한 Tech Specialist가 된다고 생각을 하며, base를 먼저 공부했느냐, specialized skill set을 먼저 공부했느냐 순서의 차이이지 결론적으로는 항상 자신이 부족한 부분을 스스로 깨닫고 공부하는것이 중요하다.

이산적인 컴퓨터 내부

컴퓨터는 내부적으로 0과 1로 이루어진 디지털이면서 2진수로 동작을 한다고 합니다.

실제로 논리회로 수준으로 내려가 보면 0과 1을 간단하게 아래처럼 정의를 해볼 수 있겠지요.

 

전류가 통하면 1, 안통하면 0

전압이 높으면 1, 낮으면 0

이런식으로 1아니면 0으로 나타낼 수 있습니다. 이렇게 중간이 없고 "1아니면 0이다" 라고 딱딱 나뉘어져 있는것을 이산적(Discrete)라고 합니다.

 

그래서 이산수학(Discrete Mathematics)이 컴퓨터공학과 밀접하게 관련이 있는 것입니다.

이산적이지 않다면 연속적이라고 하겠지요. 0도 있고 1도 있고 0.5도 있고 0.75도 있고 이런식으로 실수 범위까지 확장이 된다면 연속적이라고 부를 수 있을 것 같습니다.

 

하지만 값들이 0, 1, 2, 3, 4 처럼 딱딱 나뉘어져 양자화 되어 있다면 이는 이산적인 특징을 가졌다고 볼 수 있겠지요.

 

컴퓨터에서의 자연수 표기

어쨋든 컴퓨터는 기본적으로 Compute를 하기 위한 기기이고, 계산을 하기 위한 계산기에서 시작을 했습니다. 사칙연산이 가장 기본이 되는 연산이지요. 그래서 컴퓨터에서는 일단 수를 표현해야 하는데, 실수범위를 표현하기에 앞서서 정수를 먼저 표현해봅시다.

 

사실 정수보다도 자연수를 표현하는 것이 더 쉽겠지요.

0과 1로만 이루어져 있으면, 요즘 공교육 교육과정에서는 초등학교때 배우는지, 중학교때 배우는지는 모르겠지만 어쨋든 2진법이란게 생각이 날 수 있습니다.

 

흔히 사람들이 사용하는 10진법은 0부터 9까지의 총 10가지 아라비아 숫자로 크기를 표현하는데, 2진법은 0과 1이라는 2가지의 아라비아 숫자로 크기 값을 표현합니다.

 

간단하게 2진법으로 표현을 하면 컴퓨터에서 쉽게 자연수를 표기할 수 있겠지요. 그리고 0까지도 표현할 수 있습니다.

컴퓨터의 워드사이즈

이제 자연수를 컴퓨터에서 표현하기 위해, 컴퓨터의 워드사이즈와 비트(bit)라는 정보 단위를 설명하도록 하겠습니다.

일단 bit는 binary digit의 약자로, 이진수 숫자 한 자리라는 뜻이라고 보시면 됩니다.

이 bit는 정보의 단위로, 이진수 숫자 한 자리만큼의 정보량이라고 보면 됩니다.

이는 즉슨 1bit의 정보는 0아니면 1을 표현할 수 있습니다.

2bit의 정보는 00, 01, 10, 11의 4가지 종류의 정보를 표현할 수 있습니다.

 

컴퓨터에는 워드사이즈 라는게 있는데, 워드 사이즈는 워드(word)의 크기(size)입니다. 워드는 컴퓨터가 처리하는 최소 데이터 크기라고 보면 됩니다.

옛날 컴퓨터들 보면 8bit 컴퓨터, 16bit 컴퓨터 이런식으로 이름을 가지고 있는 녀석들이 있는데, 앞에 8bit, 16bit는 그 컴퓨터의 워드 사이즈를 뜻하는 것입니다.

8bit로 자연수 표현하기

 

이번에는 이해하기 쉽고, 그림그리기도 쉽게 8bit 워드사이즈를 갖는 컴퓨터를 기준으로 설명해보겠습니다.

8bit면 총 8자리로 된 2진수 값을 표현할 수 있을 것입니다.

위 표는 모든 비트가 0일때, 당연히 2진수로 값이 0이고 어떻게 평가되는지를 나타내는 모식표입니다.

오른쪽 부터 인덱스를 0부터 센다고 치고, 0번째 인덱스에 있는 비트는 2의 0제곱의 값을 나타내고, 1번째 인덱스는 2의 1제곱, 이렇게 n번 인덱스의 값은 2의 n제곱의 값을 나타냅니다.

 

이때 0번째 인덱스 비트는 가장 작은 값을 나타내고 따라서 가장 덜 중요한 비트(LSB: Least Significant Bit)라고 부르며, 7번째 인덱스 비트는 가장 큰 값을 나타내고 따라서 가장 중요한 비트(MSB: Most Significant Bit)라고 부릅니다.

만약 워드사이즈가 16bit라면, 15번 인덱스 비트가 MSB가 되겠지요.

 

어쨋든 저렇게 1을 나타낼 수 있습니다.

비슷하게 5를 나타낸다면 아래와 같이 되겠지요.

8bit 자연수 중 가장 큰 값은 255가 될 것이며 2진수로는 1이 8개 있는 형태가 나옵니다.

이걸로 왜 스타크래프트 유즈맵에서 공격력 방어력 업그레이드가 255까지 밖에 안되고, 유닛 1마리의 킬 수를 총 255까지 밖에 못 세는지에 대한 실마리를 대충 얻을 수 있을 것입니다. 해당 정보를 8bit, 즉 1byte 자료구조로 저장하고 있기 때문이지요.

8bit로 음의 정수 표현하기

그런데 말입니다. 그러면 음수는 어떻게 표현할까요? 자연수의 경우 그냥 우리가 알고 있는 2진수를 때려박으면 쉽게 됩니다. 이제 음수를 표현해보도록 하겠습니다.

일단 음수와 양수를 둘 다 표현하는데는 크게 3가지 방법이 있습니다.

1. Sign & Magnitude (부호와 크기)

2. 1의 보수

3. 2의 보수

 

Sign & Magnitude

일단 이 방식은, bit하나를 부호 비트로 두고, 나머지로 크기를 나타내는 방식입니다.

대충 요런 식인데, 0번 비트부터 6번 비트는 우리가 아는 그 2진수 그대로 가게 되고, 7번 비트는 1이면 음수라서 -1을 곱해주고, 7번비트가 0이면 양수라서 아무일도 하지 않는(+1을 곱하는) 식입니다.

 

일단 이 방식으로 가장 큰 양수를 표현해보도록 하겠습니다.

7번을 뺀 나머지 비트가 다 1이면 127라는 가장 큰 양수를 표현할 수 있습니다.

가장 작은 음수는 모든 비트가 1인 -127을 표현할 수가 있습니다.

-127를 표현한 모습입니다.

 

그런데 이 방식은 조금 문제가 있습니다.

지금 보이는 값은 -0에 해당합니다. 

그렇습니다. 이 방식은 +0과 -0이 둘 다 존재하게 됩니다.

 

그리고 음수에 대한 덧셈이나 뺄셈 계산 시 기존 덧셈과는 다른 방식의 로직 구현이 필요하게 됩니다.

1의 보수

그래서 이러한 점을 보완하기 위한 1의 보수라는 개념(1's Complement)이 있습니다.

1의 보수를 취하게 되면 0인 값들은 1이 되고 1인 값들은 0이 됩니다.

1의 보수 관계에 있는 수는 기존 수에 부호를 전환한 것과 동일하게 됩니다.

즉 00000001 이 +1이면 11111110는 -1이 되는 방식입니다.

 

하지만 이 역시 -0이 존재하는 문제가 있습니다.

위는 -0 아래는 +0입니다. 서로 모든 bit를 negation한 값에 해당합니다.

 

다만 Sign & Magnitude와는 조금 나은 부분이 있는데, 덧셈 연산의 경우 입니다.

-1과 +1을 더한 경우를 한번 보겠습니다.

이 경우가 -1에 해당하고 11111110의 bit 값을 갖습니다.

1의 값을 가지며 00000001의 bit값을 갖습니다.

같이 더하면 11111111이 되고 -0이 됩니다. 

 

0이 2개라서 음수에서 양수가 되는 경우 1의 오차가 있는 것 빼고는 덧셈도 어느정도는 되는 모습입니다.

그리고 표현할 수 있는 값의 범위는 부호&크기 의 경우와 마찬가지로 -127 ~ +127입니다.

2의 보수

2의 보수(2's Complement)에 대해 한번 설명해보겠습니다. 현대 CPU들은 거의 모두 2의 보수를 쓰고 있고, 이전에 소개한 방법들에 비해 장점들만이 명확합니다.

표현법 자체는 간단한것이 정수 표현때와 비슷한데 MSB가 나타나는 값을 +128가 아닌 -128를 하도록 하면 됩니다.

그리고 2의 보수를 취한다는 것은 1의 보수를 취한 뒤 1을 더하면 됩니다.

이 표현법에서 서로 2의 보수 관계에 있는 수는 부호가 바뀐 관계를 갖습니다.

위와 같은 배열을 갖습니다. 가장 큰 양수와 가장 작은 음수를 표현해보겠습니다.

가장 큰 양수의 경우는 아까들과 동일한 +127입니다.

가장 작은 음수는 -128이 됩니다. 이전에는 -127이었는데 왜 -128까지 표현이 가능할까요?

2의 보수 표현법에서는 0이 2개가 아닌 1개이므로 하나의 -0이 차지하던 것이 의미있는 값을 하나 더 표현할 수 있게 된 것입니다.

 

그리고 덧셈을 한번 해보죠. -128과 +127를 더해봅시다.

정확한 값인 -1이 나옵니다.

 

여기서 8을 한번 더 더해봅시다.

11111111 + 00001000을 하면 마지막 올림수인 8번째 bit의 값은 버려지게 되므로 00000111이 됩니다.

정확한 값인 7를 표현할 수 있습니다.

 

이렇게 2의 보수는 다음과 같은 장점이 있습니다.

  • 0이 1개이다.
  • 가장 넓은 범위의 수를 표현 가능하다
  • 음수를 더하면 뺄셈처럼 정확히 동작한다

이러한 이유들로 1의보수나 Sign&Magnitude에 비해 명확한 장점들이 있어서 널리 쓰이는 방식입니다.

+ Recent posts