자료구조/ 메모리 구조 및 ARC
개념 바로 알기
1. 자료구조
1.
배열(Array):
•
데이터를 순차적으로 저장하는 자료구조.
•
인덱스를 사용해 특정 요소에 접근.
•
특징: 빠른 조회(O(1)), 삽입/삭제 시 성능 저하(O(n)).
•
예시
var numbers = [1, 2, 3, 4, 5]
numbers.append(6)
print(numbers) // [1, 2, 3, 4, 5, 6]
Swift
복사
2.
큐(Queue):
•
선입선출(FIFO, First In First Out) 구조.
•
데이터를 한쪽에서 삽입하고, 반대쪽에서 제거.
•
사용 사례: 프린터 작업 대기열, BFS 탐색.
•
예시
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()
}
}
Swift
복사
3.
스택(Stack):
•
후입선출(LIFO, Last In First Out) 구조.
•
데이터를 한쪽에서 삽입하고 제거.
•
사용 사례: 함수 호출 스택, 괄호 검사.
•
예시
struct Stack<T> {
private var elements: [T] = []
mutating func push(_ element: T) {
elements.append(element)
}
mutating func pop() -> T? {
return elements.popLast()
}
}
Swift
복사
2. 메모리 구조 및 ARC
1.
메모리 구조
•
Stack: 함수 호출, 지역 변수 저장.
•
Heap: 동적 메모리 할당, 참조 타입(클래스) 저장.
•
Code: 실행 중인 코드 저장.
•
Data: 전역 변수, 정적 변수 저장.
2.
ARC(Automatic Reference Counting)
•
Swift의 메모리 관리 방식.
•
클래스 인스턴스의 참조 횟수를 추적하여 필요하지 않은 인스턴스를 메모리에서 해제.
•
순환 참조(Circular Reference):
◦
두 개 이상의 객체가 서로를 참조하면서 메모리에서 해제되지 않는 상황.
•
해결 방법:
◦
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: "Alice")
let pet = Pet()
person.pet = pet
pet.owner = person // 순환 참조 발생
Swift
복사
해결 방법: weak 키워드
class Pet {
weak var owner: Person?
}
Swift
복사
직접 구현해보기
앞서 복습한 자료구조와 메모리 구조/ARC를 기반으로 직접 구현해볼거에요!
힌트는 가능한 보지 않고 진행해주세요.
Step 1: 자료구조 구현
1.
큐(Queue) 구현하기:
•
정수를 저장하는 Queue 구조체를 구현하세요.
•
enqueue()로 데이터를 삽입하고, dequeue()로 데이터를 제거합니다.
•
큐의 현재 상태를 출력하는 메서드를 추가하세요.
2.
스택(Stack) 구현하기:
•
문자열을 저장하는 Stack 구조체를 구현하세요.
•
push()로 데이터를 삽입하고, pop()으로 데이터를 제거합니다.
•
스택의 최상단 값을 반환하는 메서드를 추가하세요.
Step 2: ARC와 순환 참조 해결
1.
순환 참조 문제 구현:
•
두 클래스를 생성하세요:
◦
Person 클래스: 이름을 저장하는 속성(name)과 애완동물(pet) 속성을 가짐.
◦
Pet 클래스: 주인(owner) 속성을 가짐.
•
서로를 참조하는 인스턴스를 생성하고 순환 참조 문제를 확인하세요.
2.
순환 참조 해결:
•
weak 키워드를 사용해 순환 참조 문제를 해결하세요.
•
해결 후, deinit 을 사용해 두 인스턴스가 정상적으로 메모리에서 해제되는지 확인하세요.