-
[사전캠프 TIL 2일차] 자료구조 / 메모리 구조iOS💖 2025. 2. 4. 19:55
학습 키워드
자료구조
🗂️ 메모리 구조 🔴
자료구조
1. 배열 (Array)
- 데이터를 순차적으로 저장하는 자료구조
- index 로 특정 요소 접근
- 특징
- 빠른 조회 : O(1)
- 삽입 / 삭제시 성능 저하 : O(n)
- 예시 코드)
var numbers = [1, 2, 3, 4, 5] numbers.append(6) print(numbers) // [1, 2, 3, 4, 5, 6]2. 큐 (Queue)
- 선입선출 (FIFO) 구조
- 데이터를 한쪽에서 삽입하고, 반대쪽에서 제거
- 사용 사례
- 프린터 작업 대기열
- 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() } }3. 스택 (Stack)
- 후입선출 (LIFO) 구조
- 데이터를 한쪽에서 삽입하고 제거
- 사용 사례
- 함수 호출 스택
- 알고리즘 문제 _ 괄호 검사
- 예시 코드)
struct Stack<String> { private var elements: [String] = [] mutating func push(_ element: String) { elements.append(element) } mutating func pop() -> String? { return elements.popLast() } mutating func lastElement() -> String? { return elements.isEmpty ? nil : elements[elements.count - 1] } }
메모리 구조
4개의 영역으로 나눠져 있다.
- Code (낮은 주소)
- 소스코드 가 기계어 형태로 저장
- CPU에서 Code영역에 저장된 명령어들을 하나씩 처리
- 프로그램 시작-종료까지 메모리에 유지
- Data
- global 변수, static 변수 저장
- 프로그램 시작과 동시 -> 할당, 종료되면 -> 메모리 해제
- Heap
- 동적 메모리 할당
- 동적 할당의 불확실성 & 데이터 크기의 변동성 때문에,
낮은 주소(low) -> 높은 주소(high) 로 데이터가 쌓임 (= 메모리 할당)
- 동적 할당의 불확실성 & 데이터 크기의 변동성 때문에,
- 참조 타입 값 (클래스) 저장
- runtime 에 크기 결정됨
- 동적 메모리 할당
- Stack (높은 주소)
- 함수 호출, 지역 변수, 매개변수, 리턴값, 포인터 등 저장
- compile time 에 크기 결정됨

* 메모리 영역 (free-store)
: heap, stack은 같은 메모리 영역을 공유한다.
서로의 영역을 침범 ( heap-overflow / stack-overflow ) 하게 될 수 있다.
(iOS 에서의) Heap & Stack
Heap 영역 Stack 영역 특징 - FIFO (Queue)
- 참조타입
(클래스 instance(인스턴스 내부 변수/값들 모두),
클로저 등)
- Low 주소 -> High 주소
* 메모리 할당/해제 (iOS 에서)
- 참조타입은 자동 메모리 할당
- ARC가 자동 메모리 해제- LIFO (Stack)
- 함수(변수/리턴값), 지역변수, 매개변수, 포인터
- High 주소 -> Low 주소
* 메모리 할당/해제
- CPU가 자동 관리장점 - 메모리 크기 제한 X
- 범위 전역- 메모리 크기 제한 O
- 범위 지역단점 * iOS 가 아닌, 일반적인 경우
- 메모리 직접 관리 -> 속도 저하
- 사용후 반드시 메모리 직접 해제 (release, free ..)- 메모리 CPU가 자동 관리 -> 속도 매우 빠름 사용 메모리 크기 제한 X
-> 메모리 크기 모르는 경우
-> Stack 에 저장하기 큰 데이터메모리 크기 제한 O
-> Heap 할당 외의 경우1) Heap
Heap 특징
- code, data, stack 중, 유일하게 runtime 에 결정되기 때문에, ➡️ 데이터의 크기가 확실하지 않을 때 사용
- FIFO
- Queue의 구조로, 먼저 할당된 데이터 순서대로 먼저 해제 된다.
- ❤️ iOS 에서는!
- 할당
- 참조타입 (Class instance, closure 등 ) 은, Heap 영역에 자동 할당
- 해제
- ARC 를 통해, (할당된 메모리가 더이상 쓸모없다고 여겨지면), 자동 해제
- 할당
Heap 장점
- 메모리 크기 제한 없음
- 범위가 전역이므로, 프로그램의 모든 함수에서 접근 가능
Heap 단점: 속도 저하
- 동적 할당 / 해제 작업으로 인한, 속도 저하
- 메모리 직접 관리해야 함
2) Stack
Stack 특징
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- CPU에 의해 관리됨 -> 속도 매우 빠름!!
- 함수 호출 -> 함수 내의 변수/리턴값 등 메모리 할당,
종료 -> 메모리 해제 - LIFO
Stack 장점
- CPU가 Stack 메모리를 효율적으로 관리 -> 속도 매우 빠름!!
- 메모리 직접 해제 X
Stack 단점
- 메모리 크기 제한
- 지역변수만 접근
🔴 Heap & Stack 실제 메모리 할당 예시 🔴
https://babbab2.tistory.com/26
iOS) 메모리 관리 (1/3) - ARC(Automatic Reference Counting)
안녕하세요~~ 소들입니다 👀 오늘은 지난 시간 메모리 구조에 이어 Swift를 사용할 때 메모리 관리가 어떤 식으로 되는지에 대해 공부해볼 거예요 :) ARC 면접 단골 질문이라죠? 깔깔 iOS 개발자라
babbab2.tistory.com
컴파일 타임 (Compiletime)
: 소스코드를 기계어로 변역하여 실행 가능한 형태로 만드는 과정
- Swift 코드는, 컴파일 타임에 LLVM 컴파일러를 통해 중간 언어로 변환 됨
- Error )
- Syntax error
- 타입 체크 오류
- 파일 참조 오류
런타임 (Runtime)
: 프로그램이 실제로 실행되어 동작하는 시점
- 사용자의 입력에 따라 프로그램 반응 / 데이터 처리
- Error )
- 0 나누기 오류
- nil 참조 오류
- 메모리 부족 오류
직접 구현해보기
: 자료구조 구현1-1. 큐 구현하기
정수를 저장하는 Queue 구조체를 구현하세요.
enqueue()로 데이터를 삽입하고, dequeue()로 데이터를 제거합니다.
큐의 현재 상태를 출력하는 메서드를 추가하세요.
struct Queue<Int> { private var elements: [Int] = [] mutating func enqueue(_ element: Int) { elements.append(element) } mutating func dequeue() -> Int? { return elements.isEmpty() ? nil : elements.removeFirst() } mutating func printElements() { print(elements) } }1-2. 스택 구현하기
문자열을 저장하는 Stack 구조체를 구현하세요.
push()로 데이터를 삽입하고, pop()으로 데이터를 제거합니다.
스택의 최상단 값을 반환하는 메서드를 추가하세요.
struct Stack<String> { private var elements: [String] = [] mutating func push(_ element: String) { elements.append(element) } mutating func pop() -> String { return elements.popLast() } mutating func
회고
효율적인 메모리 관리를 위해 알아야 하는 필수 자료구조..
지금까지 알고리즘 문제를 풀때는 파이썬을 사용했었는데, Swift 로 자료구조들을 구현한 것은 처음인 것 같다.
어떤 상황에 놓일지 모르니, Swift로 자료구조를 구현할 수 있게 해놓자.
사전캠프 퀘스트 STEP 3의 담임 매니저님과 면담을 위한 질문들을 작성했다.
취업 / 학습 관련 면담이다 보니, 자기소개서 질문들과 대부분 겹쳤다.
오랜만에 생각하며 답을 써내려다가 보니, 시간이 많이 할애되어 ARC 는 학습하지 못했다.
그러나, 본캠프(지금부터가 본 캠프라고 생각하지만) 시작전 반드시 생각하고 정리해 둬야 하는 질문들 이기에,,
그리고 마음과 생각을 글로 정리하니, 어떤 개발자가 되고싶은지, 나의 개발자로서의 강점, 보완/개선해야하는 점이 명확해지면서,
동기부여도 다시 된다!
내일 다시 오늘 배운것 복습하고 새로운 개념들 복습해보자!
출처
https://velog.io/@averycode/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-Stack-Heap-Data-Code
[iOS] 메모리 구조 (Stack, Heap, Data, Code)
iOS에서의 메모리 구조에 대해 알아보기 (Stack Heap을 위주로)
velog.io
https://velog.io/@o_joon_/Swift-Memory
[Swift] Memory Structure
이번 포스팅에서 알아 볼 내용은 iOS의 메모리 중 메모리 구조에 관한 내용입니다.
velog.io
'iOS💖' 카테고리의 다른 글
[사전캠프 TIL 4일차] 비동기 프로그래밍 (with. GCD 💝) (2) 2025.02.06 [사전캠프 TIL 3일차] ARC / 클로저 / OOP (1) 2025.02.05 [사전캠프 TIL 1일차] Struct / Class / Protocol (0) 2025.02.03 [Swift] Network connect 두 가지 방법 (0) 2024.10.22 (Swift) closure @escaping (1) 2024.10.16