Swift에서 Array를 관리하는 방법

@Cho· October 14, 2025 · 3 min read

값 타입과 참조 타입

Swift의 값에는 값 타입과 참조 타입이라는 종류가 있다. 흔히 Class와 Struct의 차이점이 무엇인지 대답할때 사용하곤 하는데, 정확한 뜻은 아래와 같다.

참조 타입 값 타입
의미 데이터를 전달할 때 값의 메모리 위치를 전달 데이터를 전달할 때 값을 복사하여 전달
예시 Class, Closures Struct, Enum, Int, String, Array, Set 등 기본 타입
메모리 저장 위치 힙(Heap) 메모리 스택(Stack) 메모리

여기서 메모리에 대해 조금 공부해본 경우, 힙 메모리에는 동적인 데이터가 들어가고 스택 메모리에는 정적인 데이터가 들어갈 수 있다는 것을 알 수 있는데, Swift에서는 이상하게 Array나 Set 같은 동적으로 관리해야 하는 자료형도 값 타입으로 분류되어 스택 메모리에 저장된다는 모순점을 찾을 수 있다.

왜 그럴까?

Array는 사실 힙 메모리에 저장된다

Swift에서 Array는 값 타입이지만 힙 메모리와 스택 메모리를 둘다 사용한다.

정확하게는,

Array의 메타데이터(길이, 용량, 참조 포인터 등..)는 스택 메모리에 저장되고,
실제 원소들([1, 2, 3 ...])은 힙 메모리에 저장된다.

이런 방식을 사용해서 Swift의 Array를 비롯한 컬렉션 타입(Collection Types)은 값 타입의 특성을 지니면서 동적인 크기를 가진 자료형이 될 수 있던 것이다.

COW(Copy-On-Write) 전략

COW 전략은 Swift의 값 타입 메모리를 효율적으로 사용할 수 있는 기법이다.

값 타입은 값을 복사하여 데이터를 전달하기 때문에 만약 복사해야 할 값이 매우 큰 사이즈라면 복사하는 작업 만으로도 많은 리소스를 필요로 할 것이다. 그리고 만약 값을 복사했는데 사용하지 않는다면 이는 큰 자원 손실로 이어질 것이다.

이런 문제를 해결하기 위해 Swift에서는 값의 변경이 일어나는 시점에서 복사를 진행하는 방법을 사용한다. 이름 그대로 쓰기(Write)를 할 때 복사(Copy)하는 전략인 것이다.

Array, Set, Dictionary와 같은 컬렉션 타입들은 모두 COW를 사용해 메모리를 효율적으로 관리하고 있는 것이다.

💻 Cho
이해한 내용을 기록합니다