한권으로읽는컴퓨터구조와프로그래밍

UTF-8, P.81 ~ 83

  • 유니코드를 2진수로 인코딩하는 방식. 쉽게 말해, 글자를 2진수로 매핑해둔 코드들 전체를 가리켜 유니코드라고 부르는 것이다.
  • UTF-8은 가변바이트 사용한다. 예를 들어, 1바이트로 표현이 충분한 A같은 경우는 0x41로 표현하며 한글의 경우 3바이트로 표현한다. 아스키코드 호환의 1바이트(8비트)부터 4바이트(32비트) 영역까지 유니코드가 존재하며, 코드는 U+로 시작하며 이는 유니코드를 뜻하는 프리픽스이며 이후에 16진수로 표현된다.
  • 유니코드의 U+C546과 같은 코드 Index를 가리켜 CodePoint 혹은 CodeUnit라 부르기도 한다.
  • 한글로 예를 들면, 유니코드에서 U+C000 코드부터 시작하며 아래는 변환하는 예제이다.
    한글 유니코드 2진수
    U+C548 (1110)1100 (10)010101 (10)001000
    U+C624 (1110)1100 (10)011000 (10)100100
    U+B124 (1110)1011 (10)000100 (10)100100
  • 바이트별로 비트 배열이 조금씩 달라지는데, 이건 다른 복잡한 이유가 있는 것이 아니라 규칙이다.
    • 1바이트의 경우 MSB(Most Significant Bit)를 0으로 고정 => 7bit에 해당하는 부분이 유효비트
    • 2바이트의 경우 첫 번째 MSB를 110, 2번째 MSB를 10으로 고정 => 11bit에 해당하는 부분이 코유효비트
    • 3바이트의 경우 첫 번째 MSB를 1110, 나머지 MSB는 10으로 고정 => bit에 해당하는 부분이 유효비트
    • 4바이트의 경우 첫 번째 MSB를 11110, 나머지 MSB는 10으로 고정 => bit에 해당하는 부분이 유효비트

객체지향의 함정, P.311

객체에는 함수에 해당하는 메서드와 데이터에 해당하는 프로퍼티가 들어 있다. 정수값 등 크기가 작은 데이터를 저장하는 프로퍼티는 객체 구조체 안에 들어가고 메모리 할당이 더 필요한 프로퍼티는 객체 구조체 안에 포인터를 통하여 참조된다. 메서드가 아주 많거나 하면 이 구조체가 아주 커질수 있는데, 이를 별도의 데이터 구조에 나눠 담으면 이런 문제는 해결할 수 있다. 시간/공간/트레이드 오프의 예라고 할 수 있다.

객체는 전역적으로 알려진 함수 대신에 자신이 사용할 메서드에 대한 포인터를 가지고 다녀야 한다. 따라서 객체 내의 데이터가 데이터만 저장하는 데이터 구조처럼 꽉 짜여 있지 않다. 성능적으로 결정적으로 중요할 때는 전통적인 배열을 활용하라.