사내에서 진행한 스터디 내용을 종합 요약한 글.
질문 세례에도 잘 설명해주신 동료분들께 감사드립니다.(kny님, ljh님, yje님)
1. 드모르간의 법칙
드모르간의 법칙은 논리식에서 not을 분배한다는 것이다. 인터넷에 찾아보면 자료는 많다. 배울점은 다음과 같다.
- not (A or B) = not A and not B 와 같이 2개 항목에만 적용가능한 것이 아니라 3개 이상의 항목에도 적용가능하다.
- 프로그래밍을 할 때 활용하기 좋다. 예를 들어 if(!(A != 1 or A != 2)) 라는 구문은 드 모르간의 법칙을 이용하여 if(A ==1 and A == 2) 라고 표현하는 것이 간결하다.
- 경우의 수를 10가지 고려해야할 때, 8가지를 고려해서 적는 것보다 2가지가 아님을 고려해서 적는것이 유리하다. 왜냐하면 비즈니스 로직이 바껴서 11가지를 고려해야할 때, 2가지가 아님이라고 작성되었다면 유지보수가 필요없다.
2. 1의 보수, 2의 보수
보수를 왜 배워야할까? 컴퓨터에서의 연산은 '뺄셈'이 존재하지 않는다. 2장에서 정리한 가산기를 통해서만 가능하다. 두 수를 합쳤을 때 1, 두 수를 합쳤을 때 2가 되는 방식의 수를 통해 음수를 만드는 것이다. 예를 들어 3 + 7 = 10일 때 3의 10의 보수는 7이다. 이렇게 합산하는 방식으로 음수를 표현하는 것이다.
계산 방식은 좀 복잡한 편인데, 1의 보수는 보통 비트를 뒤집고 2의 보수는 1의 보수에다 LSB에 1만 더하면 된다. 예를 들어 00000101 의 1의 보수는 11111010이다. 2의 보수는 11111011이다.
다만 덧셈, 뺄셈 등은 더 복잡한 규칙을 따라야한다.
3. 인코딩 : Unicode, UTF-8, Base64, URL 인코딩
Unicode : 인류가 표현하고자 하는(했던) 모든 각 기호들에 대해 비트로 매핑 해놓은 것
인코딩 : 각 국의 언어가 달라서 번역이 없으면 의사소통이 힘들듯이, 초창기 컴퓨터 언어의 기호 표현법은 OS나 시스템의 개발자마다 기호가 달랐다. 따라서 이것을 어떤 규칙에 맞게 암호화해주는 것이 인코딩이다. 이를 해석하고자하는 쪽은, 어떤 방식으로 인코딩 되었는지와 인코딩 규칙을 알면 해석이 가능하다.
UTF-8 : 국제 공용어인 영어와 비슷한 지위를 갖고 있다. 어떤 인코딩 방식을 갖는 시스템이든, UTF-8 방식으로 시스템의 기호들을 인코딩하면 대부분의 시스템에 전달할 수 있다. 이 규칙대로라면 Unicode에 대한 모든 정보를 들고 있을 필요는 없다. UTF-8은 6바이트까지 가능하나, 다른 인코딩과의 호환을 위해 4바이트까지만 사용한다.
ex ) TV 에서만 쓰는 기호를 UTF-8 방식으로 인코딩 -> 냉장고에서 UTF-8 방식으로 디코딩하여 TV의 신호(기호)를 냉장고에서 해석 (예시일 뿐 말도 안되는 소리임)
UTF-8으로 2바이트 유니코드 '한'을 3바이트 UTF-8 방식으로 늘리더라도, 모든 기호에 대한 매핑 정보를 알아야되는 Unicode 보다 UTF-8이 인코딩계의 공용어처럼 쓰인다는 이점때문에 사용한다. 아래 Base64도 비슷하다.
Base64, URL : UTF-8로 다 인코딩하면 되지 왜 또 이런 인코딩 방식을 만드는걸까?
-Base 64는 보통 파일을 전송할 때 많이 사용한다. 24비트로 바이너리 데이터를 받은 다음 다시 6비트로 쪼개는 등 복잡한 과정을 거치고 8비트(1바이트) 중 6비트만 사용하므로 2비트가 손실이 나기도 한다. 그럼에도 불구하고 base64로 인코딩 하는 이유는,
많은 기호들 중 웹에서 필수적인 기호만 사용하기 때문에 데이터가 다른 문자에 영향을 받지 않는다. Unicode에서 시스템 제어 기호 같은 것도 Base64에 포함되어 있다면, 인코딩하기도 힘들고 웹에서는 쓰지도 않는 기호로 데이터가 전송되어 불필요한 디코딩이 일어날 수도 있을 것이다. 아래 Base64 표를 보면, 정말 꼭 필요한 문자열만 있다.
URL도 마찬가지다. URL을 구성하는 기호 규칙만 표시할 수 있도록 URL을 위한 인코딩 방식이 따로 존재하는 것이다. 대표적인 예로 URL에서는 빈 공백을 허용하지 않는다. 그래서 인터넷 주소창에 빈 공백이 있는 부분이 있다면, 그 부분은 %20으로 대체되어 표시되는 것이다.
처음 미국에서 ASCII 코드를 만들어서 쓰다가 기호가 많아지다보니 한계가 와서 Unicode로 표현 비트를 늘린 것처럼, 파일 전송이나 URL과 같은 여러가지 시스템들도 각자의 인코딩 방식을 갖고 있다가 전체적으로 통합되면서 UTF-8을 공용어처럼 사용하는 것인게 아닐까 하는 생각도 했다. 아마 맞을 것이다..
이제 1, 2장 끝!
참조
1. [책] 한 권으로 읽는 컴퓨터 구조와 프로그래밍
'Computer Science > Introduction' 카테고리의 다른 글
11. 시간표현과 상태기억: Gate S-R 래치, Gate D 래치, 플립플롭, 카운터 (0) | 2022.05.03 |
---|---|
10. 시간표현과 상태기억: 발진자, 클럭, 래치 (0) | 2022.05.01 |
8. 가산기, 디코더/인코더, 멀티플렉서/디멀티플렉서 (0) | 2022.04.19 |
7. (보충) 논리식의 간소화 (0) | 2022.04.18 |
6. (보충) 출력유형 : Open Collector, Push Pull, Totem Pole (0) | 2022.04.17 |