JavaScript에서 글자 수 byte 계산과 length 계산

작성일 :

JavaScript에서 글자 수 byte 계산과 length 계산

서론

JavaScript에서 문자열을 다룰 때 자주 사용되는 두 가지 개념이 있습니다: 문자열의 길이(length)와 문자열의 바이트(byte) 수입니다. 문자열의 길이는 문자의 개수를 의미하며, 바이트 수는 문자열을 저장하거나 전송하는 데 필요한 메모리의 크기를 나타냅니다. 이 글에서는 JavaScript에서 글자 수와 바이트 수를 계산하는 방법을 상세히 설명하고, 각 개념의 차이점을 이해하는 데 도움을 주는 예제를 제공합니다.

문자열의 길이 계산 (length)

JavaScript에서 문자열의 길이를 계산하는 것은 매우 간단합니다. length 프로퍼티를 사용하면 문자열의 문자의 개수를 쉽게 얻을 수 있습니다.

예제

javascript
let str = "Hello, World!";
console.log(str.length); // 13

위 예제에서 str.length는 문자열의 길이인 13을 출력합니다. 여기서 중요한 점은 length는 문자열에 포함된 문자 수를 계산하며, 각 문자는 단일 유니코드 코드 포인트로 간주됩니다.

유니코드 문자

JavaScript는 유니코드(Unicode)를 지원하므로, 다양한 언어의 문자와 이모지를 포함한 문자열을 다룰 수 있습니다. 그러나, 일부 유니코드 문자는 두 개의 코드 유닛(code unit)으로 표현됩니다. 예를 들어, 이모지는 두 개의 코드 유닛으로 구성될 수 있습니다.

javascript
let emojiStr = "😀";
console.log(emojiStr.length); // 2

위 예제에서 emojiStr.length는 2를 출력합니다. 이는 이모지가 두 개의 코드 유닛으로 표현되기 때문입니다.

문자열의 바이트 수 계산 (byte)

문자열의 바이트 수는 문자열을 저장하거나 전송할 때 필요한 메모리의 크기를 나타냅니다. 이는 주로 문자열을 네트워크를 통해 전송하거나 파일에 저장할 때 중요한 개념입니다. 바이트 수를 계산하기 위해서는 문자열이 어떤 인코딩을 사용하는지를 알아야 합니다. 일반적으로 웹에서는 UTF-8 인코딩이 사용됩니다.

UTF-8 인코딩

UTF-8 인코딩에서는 각 문자가 1바이트에서 4바이트까지 다양한 크기로 인코딩될 수 있습니다. ASCII 문자(예: 영문 알파벳, 숫자, 일반 특수 문자)는 1바이트로 인코딩되지만, 한글, 중국어, 일본어와 같은 다른 문자들은 더 많은 바이트를 사용합니다.

바이트 수 계산 함수

JavaScript에서 문자열의 바이트 수를 계산하는 함수는 다음과 같이 구현할 수 있습니다:

javascript
function byteCount(str) {
  let count = 0;
  for (let i = 0; i < str.length; i++) {
    let charCode = str.charCodeAt(i);
    if (charCode <= 0x7f) {
      count += 1;
    } else if (charCode <= 0x7ff) {
      count += 2;
    } else if (charCode <= 0xffff) {
      count += 3;
    } else {
      count += 4;
    }
  }
  return count;
}

let str = "Hello, World!";
console.log(byteCount(str)); // 13

위 예제에서 byteCount 함수는 문자열의 각 문자를 순회하며, 해당 문자가 UTF-8에서 몇 바이트로 인코딩되는지를 계산합니다.

문자열 길이와 바이트 수의 차이

문자열의 길이와 바이트 수는 서로 다른 개념입니다. 문자열의 길이는 문자의 개수를 의미하며, 바이트 수는 문자열을 저장하거나 전송하는 데 필요한 메모리의 크기를 나타냅니다. 이 두 값은 특히 비영어권 문자나 이모지가 포함된 문자열에서 큰 차이를 보일 수 있습니다.

예제

javascript
let str = "Hello, 세계!";
console.log(str.length); // 9
console.log(byteCount(str)); // 15

위 예제에서 str.length는 9를 출력하고, byteCount(str)는 15를 출력합니다. 이는 "Hello, "는 각 문자가 1바이트이지만, "세계"는 각 문자가 3바이트로 인코딩되기 때문입니다.

유니코드 문자와 바이트 계산

유니코드 문자, 특히 이모지와 같은 문자들은 단일 코드 유닛으로 표현되지 않을 수 있으며, 이는 바이트 수 계산에 영향을 미칩니다. 이를 처리하기 위해서는 문자열을 제대로 순회하고, 각 문자가 실제로 몇 바이트를 차지하는지 정확히 계산해야 합니다.

예제

javascript
let complexStr = "Hello, 🌍!";
console.log(complexStr.length); // 10
console.log(byteCount(complexStr)); // 13

위 예제에서 complexStr.length는 10을 출력하지만, byteCount(complexStr)는 13을 출력합니다. 이는 이모지 "🌍"가 4바이트를 차지하기 때문입니다.

텍스트 인코딩에 따른 바이트 수 계산

문자열의 바이트 수를 계산할 때는 텍스트 인코딩이 중요합니다. UTF-8은 가장 널리 사용되는 인코딩 방식이지만, 다른 인코딩 방식들도 있습니다. 예를 들어, UTF-16에서는 모든 문자가 최소 2바이트를 사용합니다.

UTF-16 인코딩 바이트 수 계산

UTF-16 인코딩에서는 각 문자가 최소 2바이트를 차지합니다. UTF-16 바이트 수를 계산하는 함수는 다음과 같이 구현할 수 있습니다:

javascript
function utf16ByteCount(str) {
  let count = 0;
  for (let i = 0; i < str.length; i++) {
    let charCode = str.charCodeAt(i);
    if (charCode <= 0xffff) {
      count += 2;
    } else {
      count += 4;
    }
  }
  return count;
}

let str = "Hello, 세계!";
console.log(utf16ByteCount(str)); // 18

위 예제에서 utf16ByteCount 함수는 UTF-16 인코딩을 고려하여 문자열의 바이트 수를 계산합니다.

결론

JavaScript에서 문자열의 길이와 바이트 수를 계산하는 것은 문자열을 다루는 데 매우 중요한 작업입니다. 문자열의 길이는 length 프로퍼티를 사용하여 쉽게 얻을 수 있지만, 바이트 수는 문자열의 인코딩 방식에 따라 달라집니다. UTF-8 인코딩을 기준으로 바이트 수를 계산하는 함수 예제와 함께, 유니코드 문자가 포함된 문자열을 다루는 방법을 살펴보았습니다.

문자열의 길이와 바이트 수를 정확히 이해하고 계산하는 것은 특히 데이터 전송, 저장, 그리고 메모리 관리 측면에서 중요합니다. 이를 통해 효율적인 문자열 처리와 최적화된 애플리케이션을 개발할 수 있습니다.