ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 타입은 왜 중요할까?
    Programming🧑‍💻 2025. 1. 29. 23:48

    프로그래밍 언어는 변수 선언시 타입 명시 유무에 따라 크게 두 가지로 나눌 수 있습니다.

    JavaScript나 Python같은 스크립트 언어들은 변수 선언 시 타입을 명시하지 않아도 되며, 런타임에 타입이 결정되는 동적 타입 시스템을 사용합니다.

    반면 C나 Rust와 같은 언어들은 변수 선언 시 타입을 명시적으로 지정해야 하며, 컴파일 타임 이전에 타입이 결정되는 정적 타입 시스템을 채택하고 있습니다.

     

    그렇다면 왜 C나 Rust와 같은 언어들은 변수 선언 시 타입을 명시해야 할까요?

    이는 타입 지정을 통해 개발자가 데이터를 표현하는 데 필요한 메모리를 직접 제어할 수 있도록 하기 위함입니다.

     

    컴퓨터는 모든 데이터를 0과 1의 나열로 표현합니다. 각 자리에는 0 또는 1만이 올 수 있으며,

    이러한 값들의 조합으로 서로 다른 데이터를 구분합니다.

    예를 들어 2자리를 사용하는 경우, 0과 1의 조합으로 표현할 수 있는 수는 총 4가지입니다.

    이처럼 표현해야 할 수의 범위가 커질수록 더 많은 자리(비트)가 필요하게 됩니다.  

     

    앞서 설명한 것처럼 비트 수에 따라 표현 가능한 데이터의 범위가 달라지는데,

    변수 선언 시 타입을 지정하면 컴파일러는 해당 변수가 필요로 하는 메모리 공간을 할당할 수 있게 됩니다.

     

    컴퓨터는 연산을 수행할 때 개별 비트 단위가 아닌, 8비트를 하나로 묶은 바이트 단위로 처리합니다.

    이러한 이유로 우리가 값을 저장하기 위해 사용할 수 있는 최소 메모리 공간은 1바이트, 즉 8비트입니다.

     

    예를 들어, 나이를 저장하는 변수를 선언할 때 8바이트를 사용하는 U64 타입을 사용했다고 가정해봅시다.

    1바이트는 8비트로 최대 256가지의 값을 저장할 수 있기 때문에, 아무리 장수하는 사람이라도 나이 값은 1바이트만으로 충분히 표현이 가능합니다.

    이 경우 나머지 7바이트는 해당 변수를 위해 할당되었지만 실제로는 전혀 사용되지 않는 낭비가 발생합니다.

    언뜻 보기에는 큰 문제가 아닌 것 같지만, 수많은 사용자의 나이 데이터를 다루는 경우 이러한 메모리 낭비는 상당한 규모로 늘어나게 됩니다.

     

    동적 타입 시스템에서 인터프리터는 어떻게 변수들의 값을 연산할까요?

    동적 언어는 런타임에 값의 타입을 결정하고 저장하기 위해 추가적인 메모리를 사용합니다.

    이를 '태깅(tagging)'이라고 하는데, 실제 연산이 필요할 때마다 인터프리터는 변수의 타입 태그를 확인하고 해당 타입에 적합한 연산을 선택하여 수행합니다.

    이러한 과정에서 추가 메모리 사용과 타입 확인을 위한 부가적인 처리 단계가 필요하기 때문에, 정적 타입 언어에 비해 실행 성능이 떨어지게 됩니다.

     

    반면 정적 타입 언어는 코드 작성 시점에 타입이 명시되어 있어, 컴파일 단계에서 이미 값의 타입과 필요한 연산이 결정됩니다.

    따라서 런타임에서는 별도의 타입 확인 없이 곧바로 연산을 수행할 있어 효율적입니다

     

    이러한 원리는 커스텀 타입에도 동일하게 적용됩니다.

    커스텀 타입을 구성하는 프로퍼티의 타입이 명시되어 있기 때문에,

    컴파일러는 컴파일 시점에 해당 커스텀 타입이 필요로 하는 전체 메모리 크기를 계산하여 미리 할당할 있습니다

     

     

     

    위의 ClassRoom 타입은 컴파일 에러를 발생시킵니다.

    정적 타입 시스템에서 컴파일러가 메모리를 할당하려면 타입의 전체 크기를 알아야 하는데, ClassRoom 가지고 있는 students 배열의 경우 개의 요소가 들어올지 컴파일 시점에서 없어 필요한 메모리 크기를 계산할 없기 때문입니다물론 배열의 최대 크기를 미리 정해둘 수도 있지만, 이는 해당 타입의 사용을 지나치게 제한하게 됩니다.

     

     

    그렇다면 이처럼 컴파일 시점에 크기를 알 수 없는 경우는 어떻게 처리해야 할까요?

     

     

    'Programming🧑‍💻' 카테고리의 다른 글

    web application은 어떻게 작동하는가?  (0) 2022.10.28
    HTTP messages  (0) 2022.10.13

    댓글

Designed by Tistory.