배열(Array)
데이터를 순차적으로 저장하는 형태의 자료구조
인덱스를 사용해 요소에 접근
특징: 빠른 조회(O(1)), 삽입/삭제 시 성능 저하(O(n))
ex)
var numbers = [1, 2, 3, 4, 5]
numbers.append(6)
print(numbers) // [1, 2, 3, 4, 5, 6]
큐(Queue)
선입선출(FIFO, First In First Out) 구조
데이터를 한쪽에서 **삽입(enequeue)**하고, 반대쪽에서 제거(dequeue)
사용 사례: 프린터 작업 대기열, BFS 탐색
ex)
struct Queue<T> {
private var elements: [T] = []
mutating func enqueue(_ element: T) {
elements.append(element)
}
mutating func dequeue() -> T? {
return elements.isEmpty ? nil : elements.removeFirst()
}
}
스택(Stack)
후입선출(LIFO, Last In First Out) 구조
데이터 한 쪽에서 데이터 삽입, 제거
사용 사례: 웹 브라우저 뒤로가기, DFS 탐색, 괄호 유효성 검사
ex)
struct Stack<T> {
private var elements: [T] = []
mutating func push(_ element: T) {
elements.append(element)
}
mutating func pop() -> T? {
return elements.popLast()
}
}
메모리 구조
Stack
함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 메모리 공간
특징
예시
func greet(name: String) {
let message = "Hello, \\(name)" // name과 message는 stack에 저장됨
}
Heap
동적 메모리에 할당이되는 영역
주로 **참조 타입(클래스 인스턴스)**이 저장됨
특징
예시
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let person = Person(name: "Mori") // person 인스턴스는 heap에 저장됨
Code
Data
**전역변수, 정적 변수(Static 변수)**가 저장되는 영역
특징
예시
// Initialized Data 영역 (초기화됨)
var globalA = 10
static var staticA = 5
// BSS 영역 (초기화 안됨)
var globalB: Int // 초기값 없음 -> 0으로 자동 초기화
static var staticB: Int // 초기값 없음 -> 0으로 자동 초기화
ARC(Automatic Reference Counting)
weak
또는 unowned
키워드 사용class Person {
var name: String
var pet: Pet?
init(name: String) {
self.name = name
}
}
class Pet {
var owner: Person?
}
let person = Person(name: "Mori")
let pet = Pet()
person.pet = pet
pet.owner = person // 순환 참조 발생
class Pet {
weak var owner: Person?
}
person
은 pet
을 강하게 참조하며, pet
도 owner
프로퍼티를 통해 다시 person
을 강하게 참조함해결
: 여기서 weak
즉, **“약한 참조(Weak Reference)”**를 사용하면 owner
는 person
을 참조하지만, 참조 카운트를 증가시키지 않음