본문 바로가기
개발/오늘의 개발일지

[Python] 바이트 문자열과 바이트 배열의 차이 이해하기

by 꾀돌이 개발자 2024. 11. 13.
반응형

 

바이트 문자열의 불변 객체 특성으로 발생할 수 있는 상황을 이해합니다.

 

 

 
 

 

 

목차

     

     

     

    개발 의도

    # 바이트 문자열 생성
    byte_str = b"hello"
    print("byte string:", byte_str)
    
    # 바이트 문자열 생성
    byte_str[0] = b"a"
    print("byte string:", byte_str)
    
    # 출력값: TypeError: 'bytes' object does not support item assignment

    - 위와 같이 바이트 문자열을 생성하고, 첫 글자를 수정합니다.

     

    - 최종 출력값은 b"aello"가 되어야 합니다.

     

    문제 상황

    - 위 함수를 실행했을 때, 최종 출력값이

         TypeError: 'bytes' object does not support item assignment

         가 되는 상황이 발생합니다.

     

    바이트 문자열은 불변 객체

    - 파이썬에서 바이트 문자열불변(immutable) 객체입니다.

     

    - 불변성의 의미는 객체를 생성한 이후에는 그 값을 수정할 수 없다는 것입니다.

     

    바이트 문자열은 불변 객체(immutable)

    # 바이트 문자열 생성
    byte_str = b"hello"
    print("Original byte string:", byte_str)
    
    # 출력값: Original byte string: b'hello'
    
    # 바이트 문자열의 요소를 수정하려고 하면 오류가 발생
    try:
        byte_str[0] = b"a"  # 바이트 문자열은 수정할 수 없음
    except TypeError as e:
        print("Error:", e)
       
    # 출력값: Error: 'bytes' object does not support item assignment

    - 바이트 문자열(b"hello")은 불변 객체이기 때문에,

          byte_str[0] = b"a"와 같은 코드는 TypeError를 발생시킵니다.

     

    # 바이트 문자열 생성
    byte_str = b"hello"
    
    # 수정이 필요할 경우 새로운 바이트 문자열을 생성해야 함
    new_byte_str = b"a" + byte_str[1:]
    print("Modified byte string:", new_byte_str)
    
    # 출력값: Modified byte string: b'aello'

    - 바이트 문자열을 수정하려면 기존 객체를 수정하는 것이 아니라,

          조합을 통해 새로운 바이트 문자열 객체를 생성해야 합니다.

     

    바이트 배열(bytearray)은 가변 객체(mutable)

    data = b"hello"
    
    # 바이트 배열로 변환 (가변 객체)
    byte_array = bytearray(data)
    
    # 0번째 값을 b"a"으로 변경
    byte_array[0] = 97
    
    # 다시 바이트 문자열로 변환 (불변 객체)
    data = bytes(byte_array)
    
    print(data)  # 변경된 바이트 문자열 출력
    
    # 출력값: b'aello'

    - 바이트 문자열은 불변이지만, 바이트 배열(bytearray)은 가변(mutable) 객체입니다.

     

    - 따라서 바이트 문자열을 수정하고 싶을 때,

           이를 바이트 배열로 변환한 후 변경을 수행하고,

           다시 바이트 문자열로 변환하는 방법을 사용할 수 있습니다.

     

    - 단, 바이트 배열의 요소는 반드시 정수로 지정해야 하기 때문에,

           byte_array[0] = b"a" 대신 byte_array[0] = 97을 사용합니다.

           (b"a"는 아스키(ASCII) 코드에서 10진수 97에 해당합니다.)

     

    바이트 배열이 가변인 이유

    - 대용량 데이터나 빈번한 데이터 조작 작업에서 유용합니다.

     

    - 바이트 배열을 사용하면 기존 메모리 공간에서 직접 데이터를 변경할 수 있으므로,

            새로운 객체를 생성할 필요가 없습니다.

            이는 메모리 사용량을 줄이고 프로그램의 성능을 향상시킵니다.

     

    문제 원인 파악

    - 즉, 바이트 문자열이 불변 함수이기 때문에

            바이트 문자열을 수정할 때, 의도한 것과 다르게 오류가 발생합니다.

     

    아래 코드로 디버깅 완료

    data = b"hello"
    
    # 바이트 배열로 변환 (가변 객체)
    byte_array = bytearray(data)
    
    # 0번째 값을 b"a"으로 변경
    byte_array[0] = 97
    
    # 다시 바이트 문자열로 변환 (불변 객체)
    data = bytes(byte_array)
    
    print(data)  # 변경된 바이트 문자열 출력
    
    # 출력값: b'aello'

    - 바이트 문자열을 바이트 배열로 변환하여 원하는 값으로 수정합니다.

     

    - 이 방법을 사용하면 바이트 문자열을 "수정한" 것처럼 보이지만,

             실제로는 새로운 바이트 문자열을 생성하는 것입니다.

     

    반응형