ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [사전캠프 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개의 영역으로 나눠져 있다.

     

    1. Code (낮은 주소)
      •  소스코드  가 기계어 형태로 저장
      • CPU에서 Code영역에 저장된 명령어들을 하나씩 처리
      • 프로그램 시작-종료까지 메모리에 유지
    2. Data
      • global 변수, static 변수 저장
      • 프로그램 시작과 동시 -> 할당, 종료되면 -> 메모리 해제
    3. Heap
      •  동적 메모리 할당 
        • 동적 할당의 불확실성 & 데이터 크기의 변동성 때문에,
          낮은 주소(low) -> 높은 주소(high) 로 데이터가 쌓임 (= 메모리 할당)
      • 참조 타입 값 (클래스) 저장
      •  runtime  에 크기 결정됨
    4. 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

     

     

     

    댓글

Designed by black7375.