새소식

인기 검색어

iOS/Swift

[Swift] Swift에서의 Value Type, Reference Type

  • -

프로세스 메모리 관리


기본적으로 프로세스의 메모리가 할당되면 영역은 4군데로 나뉜다.

 

Code

  • 우리가 작성한 소스 코드 저장되는 공간
  • 컴파일 타임에 결정되고 중간에 코드가 변경되는 일이 없도록 Read-Only 형태로 저장된다

Data

  • 전역변수와 static 변수들이 저장되는 공간
  • 보통의 경우엔 프로그램 시작과 동시에 할당되며 프로그램이 종료되어야 해제된다
    • 하지만 Swift에서의 static은 lazy이기 때문에 아마 접근 시 할당되고 앱이 종료시 해제 될 것이다.
  • 실행 도중에 변수 값이 변경될 수 있기 때문에 Read-Write 형태로 저장된다.

Stack

  • 함수 호출 시 함수의 지역변수, 매개변수, 리턴값 등이 저장되는 공간.
  • 컴파일 시점에 결정되고 함수가 종료되면 할당된 메모리도 해제 된다.
  • 장점
    • CPU가 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
    • 메모리르 직접 관리 하지 않는다.
  • 단점
    • 메모리 크기에 대한 제한
    • 지역 변수만 액세스 가능

Heap

  • 프로그래머가 동적할당/해제 하는 메모리 공간
  • 사용하고 난 후에는 반드시 메모리 해제를 해주어야 memory leak이 발생하지 않는다.
  • 네 영역중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용
  • 하지만 swift에서는 ARC를 채택하기 때문에 클래스의 인스턴스 클로저와 같은 참조 타입을 자동으로 Heap에 할당과 해제를 해준다.
  • 장점
    • 메모리 크기에 대한 제한이 없다.
    • 범위가 전역이기 때문에 프로그램의 모든 함수에서 액세스 가능
  • 단점
    • 할당/해제 힙 손상, 경합 등 으로 인한 속도 저하
    • 메모리를 직접 관리해야 함 해제 하지 않을 시 memory leak이 발

 

💡 스택과 힙
힙과 스택은 같은 메모리 공간을 공유 하는데
힙은 낮은 메모리 주소부터 할당을 받고 스택은 높은 메모리 주소 부터 할당을 받는다.
여기서 힙이 너무 많은 메모리를 할당하여 자신의 메모리 영역을 초과한 경우를 힙 오버플로우
반대로 스택이 너무 많은 메모리를 할당하여 자신의 메모리 영역을 초과한 경우를 스택 오버플로우
 라고 한다

 

 

 

Swift에서의 Value Type, Reference Type


Value Type

  • Swift의 기본 자료형 타입 (Int, Float, Double, Bool, String, Array, Dictionary, Set 등)은 모두 struct 형태로 구현
  • struct, enum, tuple 등

Reference Type

  • class, function, clouser 등

 

Swift에의 Collection은 Value Type이면서 Reference Type


우리는 이제 Value Type은 스택에 Reference Type은 힙에 저장된다는 것을 알고 있습니다.

하지만 Collection타입의 서브타입들 (String, Array, Dictionary 등)은 기본적으론 Value Type이지만

내부 구현을 보면 둘이 섞여 있습니다. 그 이유는 성능 때문인데요

Array나 String은 크기가 큰 값들을 내부에 포함하고 있는 경우가 많습니다. 하지만 이것들은 값타입이라

복사를 할 때 마다 내부의 큰 값들을 다 복사하면 시간이나 공간의 부담이 커지게 됩니다.

그래서 Swift컴파일러는 Copy-On-Write 라는 방법을 사용합니다.

'iOS > Swift' 카테고리의 다른 글

[Swift] Swift에서의 메모리 관리  (0) 2023.12.28
[Swift] Copy-on-Write  (1) 2023.12.28
[Swift] Swift Package 만들기  (0) 2023.12.12
[Swift] Optional(옵셔널)  (0) 2023.06.11
[Swift] Generics(제네릭)  (2) 2023.06.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.