4.1 배열의 정의와 속성
배열은 동일한 타입의 요소로 구성된 정렬된 집합의 데이터 구조로, 인접한 메모리 셀에 저장됩니다. 각 배열 요소는 고유한 인덱스를 가지며, 이는 요소에 접근하는 데 사용됩니다.
여기 4개의 요소를 포함하는 간단한 배열 (1, 2, 3, 4) 가 나와 있습니다.
배열의 속성:
- 고정된 크기: 배열의 크기는 생성 시 설정되며 프로그램 실행 중에는 변경할 수 없습니다.
- 요소의 균일성: 배열의 모든 요소는 동일한 타입이어야 합니다 (예: 정수, 문자열).
- 메모리의 연속적 저장: 배열 요소는 인접한 메모리 셀에 저장되어 인덱스를 통해 빠르게 접근할 수 있습니다.
- 인덱스를 통한 빠른 접근: 배열의 어떤 요소에든
O(1)
시간 복잡도로 접근할 수 있습니다.
4.2 배열의 사용 예
이미 알고 있을 수도 있는 배열 사용 예를 보자:
고정 길이의 데이터 저장
요일, 연도의 월:
# 요일 배열 생성
days_of_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
print(days_of_week[2]) # 출력: Wednesday
행렬 및 다차원 배열
3x3 행렬:
# 3x3 행렬 생성
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][1]) # 출력: 5
정렬 알고리즘에서의 사용
숫자 배열 정렬:
# 숫자 배열 정렬
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort() # 배열 정렬
print(numbers) # 출력: [1, 2, 5, 5, 6, 9]
임시 데이터 저장을 위한 버퍼
파일에서 데이터를 읽기 위한 버퍼:
# 1024 바이트 버퍼 생성
buffer = [0] * 1024
print(len(buffer)) # 출력: 1024
4.3 배열의 주요 연산
중요! Python의 list 클래스는 동적 배열로, 작업 중 크기를 변경할 수 있습니다. 동적 배열에 대한 자세한 내용은 몇 강의 후에 배울 것입니다.
주요 연산: 인덱스를 통한 접근, 삽입, 삭제
인덱스를 통한 접근
배열 요소에 접근하기 위해 인덱스를 사용합니다. 이 인덱스는 요소의 위치를 가리킵니다.
# 인덱스를 통한 배열 요소 접근
arr = [10, 20, 30, 40, 50]
print(arr[2]) # 출력: 30
print(arr[-1]) # 출력: 50 (마지막 요소)
삽입
배열에 요소를 삽입할 때는 새 요소를 위한 공간을 확보하기 위해 모든 후속 요소를 이동시켜야 할 수도 있습니다.
예시 (배열 중간에 요소 삽입):
# 배열에 요소 삽입
arr = [10, 20, 30, 40, 50]
arr.insert(2, 25) # 2번째 위치에 25 삽입
print(arr) # 출력: [10, 20, 25, 30, 40, 50]
삭제
배열에서 요소를 삭제할 때는 비어진 공간을 채우기 위해 모든 후속 요소를 이동시켜야 할 수도 있습니다.
예시 (요소 삭제):
# 배열에서 요소 삭제
arr = [10, 20, 30, 40, 50]
arr.pop(2) # 2번째 위치의 요소 삭제
print(arr) # 출력: [10, 20, 40, 50]
4.4 배열 사용의 장단점
배열 사용의 장단점을 살펴보자:
장점:
- 인덱스를 통한 빠른 접근: 배열의 어떤 요소에든
O(1)
시간 복잡도로 접근할 수 있으며, 이는 데이터를 읽는 데 매우 효율적입니다. - 간단한 구현: 배열은 이해하기 쉽고 사용하기 쉬우며, 다양한 작업에 쉽게 구현하고 적용할 수 있습니다.
- 적은 오버헤드: 배열은 연결 리스트와 같은 더 복잡한 데이터 구조에 비해 적은 메모리를 사용합니다.
단점:
- 고정된 크기: 배열의 크기는 생성 시 설정되며 변경할 수 없습니다. 이는 필요한 배열 크기를 미리 알아야 함을 의미합니다. 필요에 따라 크기를 늘릴 수 있는 동적 배열을 사용해야 할 수도 있습니다.
- 삽입 및 삭제 비용: 요소를 삽입하거나 삭제할 때는 시간이 많이 소요될 수 있습니다. 특히 배열 중간에 삽입하거나 삭제할 때는
O(n)
시간이 소요됩니다. - 비효율적인 메모리 사용: 배열이 완전히 사용되지 않으면 남은 메모리 셀이 비어 있어 메모리 사용이 비효율적일 수 있습니다.
GO TO FULL VERSION