4. 바이트 어레이 (Bytearray)

순수 바이트(bytes) 자료형은 한 번 생성되면 절대로 갱신할 수 없지만, 파이썬은 대용량 파일의 바이트 읽기/쓰기나 네트워크 통신 시 자유자재로 편집할 수 있는 바이트 어레이(bytearray)라는 임시 버퍼 공간을 추가로 제공합니다.

바이트 어레이는 이름 그대로 바이트들을 모아둔 가변 배열이므로, 파이썬의 리스트(list)와 매우 유사하게 내부 원소들을 자유롭게 변경, 추가, 삭제할 수 있는 강력한 변경 가능(Mutable) 자료형입니다.

4.1 바이트 어레이 생성 및 할당

기존에 만들어둔 바이트나 문자열을 bytearray 생성자로 감싸면 곧바로 변경 가능한 버퍼 묶음으로 변신합니다. 또한, 빈 공간을 미리 예약하여 버퍼 크기를 확보할 수도 있습니다.

# 1. 불변 바이트를 가변 바이트 어레이로 변환
b_data = b"abcde"
ba_data = bytearray(b_data) 
print(ba_data) # bytearray(b'abcde')

# 2. 지정된 크기만큼 빈 버퍼 공간 0(\x00)으로 채워 생성
buffer = bytearray(20)
print(buffer) # 20개의 0 영역이 잡힘

4.2 바이트 어레이 갱신 규칙 (요소 수정)

바이트 어레이가 불변 바이트와 가장 결정적으로 차이나는 부분이자 강력한 능력은 내부 요소를 입맛대로 뜯어고칠 수 있다는 점입니다.

슬라이스를 이용한 덩어리 교체

슬라이싱([:])을 이용해 특정 구간을 잡으면 파이썬 문자열이나 바이트 객체를 통째로 집어넣어 내용을 덮어씌울 수 있습니다.

# 20칸짜리 버퍼의 맨 앞 5칸을 b'abcde' 로 교체
buffer[:5] = b"abcde"
print(buffer) 
# 출력 결과 앞부분에 데이터가 씌워지고 뒷부분 15칸은 비어있게 됨
# bytearray(b'abcde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

단일 인덱스 요소 교체 시의 주의사항

단, 덩어리 단위가 아니라 buffer[0] 처럼 정확히 하나의 칸(Index)을 집어내어 값을 교체하려 할 때는 반드시 0부터 255 사이의 정수(아스키 번호)를 직접 넣어주어야 합니다. 바이트 문자를 직접 밀어넣으려 하면 에러가 발생합니다.

# buffer[0] = b'a' -> TypeError: an integer is required 예외 폭발!
buffer[0] = 97  # 소문자 'a'의 아스키코드 정수 배정 (성공)

4.3 리스트와 동일한 컬렉션 편집 메서드

바이트 어레이는 파이썬의 리스트(List)와 동일한 메커니즘을 상속받았기 때문에, 데이터를 조작하는 유용한 메서드들을 빠짐없이 지원합니다.

  • 데이터 추가: append(정수), extend(순회가능객체)
  • 데이터 중간 삽입: insert(인덱스, 정수)
  • 데이터 뽑아내어 삭제: pop(인덱스) -> 지정된 인덱스의 데이터를 버퍼에서 제거하고 값을 반환합니다.
  • 순역 배열: reverse()
test_array = bytearray(b"Hello")

# 맨 뒤에 감탄사(아스키코드 33 -> '!') 추가하기
test_array.append(33)
print(test_array) # bytearray(b'Hello!')
서브목차