배열이란 무엇입니까?
- 배열은 각 요소가 인덱스나 키로 식별되는 요소의 모음입니다.
- 배열은 고정 및 동적 크기를 갖습니다.
- 동종 요소 → 배열의 모든 요소는 동일한 데이터 유형입니다.
- 이기종 요소 → 동일한 배열에서 다양한 데이터 유형을 허용합니다.
// Homogeneous
int[] intArray = new int[5]; // Array of integers String[]
stringArray = new String[5]; // Array of strings
// Heterogeneous
mixedArray = [1, "hello", 3.14, True] # Mixed data types in one list
배열의 특성
- 인덱싱: 대부분의 프로그래밍 언어에서 0부터 시작하는 인덱싱입니다.
- 크기: 고정 크기(정적), 동적으로 변경할 수 없습니다(동적 배열이 있는 언어 제외).
- 메모리 할당: 배열 요소에 대한 연속 메모리 할당입니다. 즉, 각 요소는 메모리의 이전 요소 바로 옆에 있습니다. 이는 모든 요소의 크기가 동일하므로 시스템이 해당 인덱스를 사용하여 모든 요소의 메모리 주소를 계산할 수 있기 때문에 가능합니다.

어레이 작업
- 삽입: 일반적으로 요소 이동, O(n) 시간 복잡도가 포함됩니다.
- 삭제: 삽입과 유사하게 요소를 이동해야 할 수도 있습니다. 마지막 색인 제외
- 순회: 모든 요소를 반복하며 O(n) 시간 복잡도를 갖습니다.
- 액세스 시간: 인덱스를 사용하여 요소에 액세스하는 데 O(1) 시간 복잡도가 있습니다.
배열 유형
- 1차원 배열: 목록과 같은 가장 간단한 형식입니다.
- 다차원 배열: 배열의 배열(예: 2D 배열).
- 지그재그 배열: 하위 배열의 길이가 다른 배열입니다.
- 동적 배열(예: Java의 ArrayList): 크기가 동적으로 증가할 수 있는 배열입니다.
배열의 장점
- 효율성: 요소에 대한 액세스 시간은 O(1)입니다.
- 메모리 활용 : 연속적인 저장으로 메모리를 효율적으로 사용합니다.
- 사용 편의성: 정렬 및 검색과 같은 데이터 관리 및 작업을 단순화합니다.
배열의 단점
- 고정 크기: 선언한 후에는 크기를 변경할 수 없습니다. 동적 배열 제외
- 삽입/삭제 비용: 특히 중간에 요소를 삽입하거나 삭제하는 경우 O(n)입니다.
- 메모리 낭비: 사용하지 않는 요소가 여전히 공간을 차지합니다.
어레이의 실제 응용
- 데이터 저장: 요소 컬렉션을 저장하는 프로그래밍에서는 일반적입니다.
- 정렬 알고리즘: 많은 정렬 알고리즘이 배열용으로 설계되었습니다(예: QuickSort, MergeSort).
- 행렬 연산: 2D 배열은 수학과 그래픽 분야의 행렬 연산에 사용됩니다.
- 스택 및 큐 구현: 배열을 사용하여 기본 데이터 구조를 구현할 수 있습니다.
배열 모범 사례
- 불필요한 복사 방지: 요소 복사가 필요한 작업에 주의하세요.
- 필요할 때 동적 배열 사용: 크기가 불확실한 경우 동적 배열을 선호합니다.
- 내장 함수 활용: 배열 작업에 언어별 함수를 활용합니다.
- 경계 확인: IndexOutOfBoundsException을 방지하려면 항상 경계 조건을 확인하세요.
GO의 정적 및 동적 배열 예
package main
import (
"fmt"
"unsafe"
)
func main() {
// Static Array
var staticArr [5]int64
staticArr[0] = 1
staticArr[1] = 2
staticArr[2] = 3
staticArr[3] = 4
staticArr[4] = 5
elementSize := unsafe.Sizeof(staticArr[0])
totalSize := elementSize * uintptr(len(staticArr))
fmt.Printf("Memory used by static array: %d bytes\n", totalSize)
fmt.Println()
// Dynamic Array (Slice)
dynamicArr := make([]int32, 0, 5)
before := unsafe.Sizeof(dynamicArr[0])
beforeTotal := before * uintptr(len(dynamicArr))
fmt.Printf("Memory used by dynamic array (before): %d bytes\n", beforeTotal)
// Append elements to dynamic array
for i := 0; i