본문 바로가기
Swift

[Swift] 메모리 구조

by Sky Titan 2022. 6. 6.
728x90
 

[Swift] Class와 Struct의 차이점?

안녕하세요 Pingu입니다.🐧 오늘은 iOS 개발에 쓰이는 Swift 언어에서 Class, Struct의 차이점이라는 주제를 가지고 글을 써보려고 합니다. iOS 개발자로 면접을 준비하다 보면 Class, Struct의 차이점이라

icksw.tistory.com

 

Using Structs over Classes in Swift Isn’t as Safe as You Think It is

Good discipline should be more of a concern than using a value type over a reference type

medium.com

 

iOS) 메모리 구조 (Code, Data, Stack, Heap)

안녕하세여~~ 소들입니다 :-))))) 오늘 웬 듣보잡 버그 한 놈이 나왔는데 처음에 메모리 참조 오류인 줄 알고 하루 종일 메모리에 대해서 공부 했는데 버그 원인은 메모리가 아니었음ㅋ (디코딩 네

babbab2.tistory.com

Swift의 메모리 구조

  • OS는 총 4가지의 메모리 영역을 가진다
    • Code
    • Data
    • Heap
    • Stack

 

1. Code 영역

  • 컴파일 타임에 결정된다.
  • 개발자가 작성한 소스 코드가 기계어 형태로 저장되는 영역
  • 중간에 코드가 변경되지 않도록 read-only 형태로 저장된다.

 

2. Data 영역

  • 컴파일 타임에 결정된다.
  • 정적(static) 변수, 전역 변수 들이 저장되는 영역
  • 프로그램 시작 시 할당, 프로그램 종료 시 해제
  • 실행 도중 변수 값이 변경될 수 있기에 read-write 형태로 저장된다.
struct Person {
	static let name: String = "park" //정적 변수 -> data 영역에 저장
}

var name: String? // 전역 변수 -> data 영역에 저장

 

3. Heap 할당

  • 컴파일 단계에서 생성과 해제를 알 수 없는 '참조' 타입의 객체가 할당된다.
    • '런타임' 시에 결정되는 영역 (4가지 영역 중 유일하게 런타임 시에 결정됨)
    • '동적 할당' 되는 객체들 
    • 데이터의 크기가 확실하지 않을 때 사용하는 영역
    • 즉, class 객체나 closure같은 참조타입들이 할당됨.
  • 메모리 할당, 해제가 하나의 명령어로 처리되지 않기 때문에 관리가 어렵다.
    • Heap은 참조 계산도 해줘야 하기 때문에 Stack보다 복잡하다.
    • swift에서 이러한 참조 계산을 통한 메모리 해제를 자동으로 해주는 것이 ARC이다.
  • Heap은 스레드들이 공유하는 영역이기 때문에 thread-safety하지 않다.
    • 이를 관리하기 위해 lock과 같은 자원이 필요하고 이것이 오버헤드로 이어진다.

 

4. Stack 할당

  • LIFO형태의 자료구조로 가장 마지막에 들어간 객체가 가장 먼저 나오게 된다.
    • 자료 구조의 특성상 하나의 명령어로 메모리 할당, 해제가 가능하다.
  • 컴파일 단계에서 언제 생성되고 해제되는지 알 수 있는 struct와 같은 값들이 저장된다.
    • 단, struct가 protocol을 채택하는 경우엔 heap 영역에 저장됨 
    • 그 외에 지역 변수, 매개변수, 반환값 등이 저장된다.
    • 함수가 종료되면 저장된 메모리도 해제 된다.
  • 컴파일 타임에 영역이 결정되기 때문에 무한히 할당이 불가능하다.
    • 영역이 한정되어 있기 때문에 큰 메모리는 할당할 수 없다.
  • 스레드 별로 독립적인 Stack 영역을 가지고 있기 때문에 thread-safety 하다
    • 즉, struct는 항상 unique한 copy만 생성되기 때문에, 이것이 곧 thread 별로 항상 동시에 하나의 독립적인 instance만 가지게 해주어서, thread-safe하게 만들어준다.
  • 위의 특징들 덕에 Heap의 값을 쓰는 것보다 빠르다.
    func add(a: Int, b: Int) -> Int { //파라미터 a, b 스택에 할당
        let result = a + b //지역변수 result 스택에 할당
        return result
    }

 

 

 

728x90

댓글