메모리 구조의 4가지 영역 중,
Heap과 Stack 영역을 조금 더 자세히 살펴보고자 합니다.
해당 두 영역의 개념을 다시 한번 상기하고,
Swift 메모리 상에서 데이터가 쌓이는 과정을 알아보겠습니다!
본 포스팅의 경우, 메모리 구조와 관련된 추가적인 학습 이후
개념상 맞지 않은 부분이 있다면 지속적으로 보완 할 예정입니다.
Heap 과 Stack 메모리 영역은 어떻게 할당할까?
메모리 내 저장(할당)되는 기준은 바로 Semantics!
앞서 메모리 구조에서 다룬
Heap과 Stack에 대한 내용을 되짚어 보자면..
- Heap ➟ 컴파일단계에 사용자에 의해 할당/해제하는 영역
- Class, Closure와 같은 참조타입이 저장
- Stack ➟ 런타임 단계에서 프로그램이 자동으로 할당/해제하는 영역
- 함수 호출 시, 지역변수 / 매개변수 / 리턴값이 저장
하지만, 위와 같은 내용으로 봤을 때
메모리 상에 실제로 어떻게 저장이 되는 것인지 구분하기 매우 어렵습니다🤷🏻♂️
그래서, 어떻게 할당되는데요?
- 메모리 할당 시, Heap 혹은 Stack에 저장되는 기준은 'Semantics' 입니다.
- Semantics란, 프로그래밍 분야에선 '코드의 의미'로 통용됩니다.
- 다시 말해, "무엇을 어디에 할당을 해야 의미가 있는 것인가?" 란 의미로 작용합니다.
- 여기서의 '무엇'은 객체(인스턴스)이자 데이터이며, 이는 타입에 따라 구분됩니다.
- 타입(Type)이란, 데이터의 메모리 저장과 처리방식을 알리는 역할을 담당합니다.
- 결과적으로, ①타입체크 ➟ ②Semantics 확인 ➟ ③메모리 할당 순서를 거치게 됩니다.
Reference & Value Semantics
Heap과 Stack의 할당 기준인 Semantics는 참조 타입과 값 타입으로 구분된다
앞서 메모리 영역인 Heap과 Stack으로의 할당 기준이
타입(Type)과 해당 데이터의 의미(Semantics)라는 내용을 다뤄왔습니다.
그렇다면,
해당 타입을 가지고 있는 데이터는 어떻게 구분이 될까요?
Reference Semantics (참조 타입)
- Reference Semantics에는 대표적으로 클래스(Class)와 같은 참조타입이 있습니다.
- Class 내부에 위치하고 있는 데이터(프로퍼티, 메서드)는 Heap에 할당됩니다.
- 하지만, 주소값(Address)은 Stack에 할당합니다.
- 클래스(Class)를 활용한 예시 코드를 통해 살펴본 할당 과정은 다음과 같습니다.
- Human이란 클래스를 생성한 후, 'man'이란 인스턴스에 초기값을 설정합니다.
- 'man'의 주소값은 Stack에 저장이 되는 동시에 ➟ Heap 영역의 Human 인스턴스를 참조합니다.
(참조와 관련된 내용은 Swift 문법 내 Class 포스팅을 참고하시길 바랍니다)
class Human {
var age: Int
var number: Int
init(age: Int, number: Int) {
self.age = age
self.number = number
}
}
var man: Human = Human(age: 23, number: 7848)
- woman 이란 새로운 인스턴스를 생성한 후, 기존 man 인스턴스를 할당한다면?
- 클래스 인스턴스이므로, Heap에 담긴 데이터 값을 참조합니다.
- 또한, woman의 age에 새로운 값을 할당하게 되면 man&woman 모두 값이 변경됩니다.
...
var man: Human = Human(age: 23, number: 7848)
var woman = man
woman.age = 45
Value Semantics (값 타입)
- Value Semantics에는 대표적으로 구조체(Struct)와 같은 값 타입이 있습니다.
- 프로퍼티의 데이터는 모두 Stack에 할당됩니다.
- 구조체 이외, Enum, Tuple 등이 있습니다.
- 구조체(Struct)를 활용한 예시 코드를 통해 살펴본 할당 과정은 다음과 같습니다.
- Human이란 구조체를 생성한 후, 'man'이란 인스턴스에 초기값을 설정합니다.
- 'man'의 인스턴스(데이터)는 ➟ Stack 영역에 쌓이게 됩니다.
struct Human {
var age: Int
var number: Int
init(age: Int, number: Int) {
self.age = age
self.number = number
}
}
var man: Human = Human(age: 23, number: 7848)
- woman 이란 새로운 인스턴스를 생성한 후, 기존 man 인스턴스를 할당한다면?
- 구조체 인스턴스이므로, 새로운 복사본으로서 별도의 값을 가지게 됩니다.
- Stack 영역에 woman이란 인스턴스의 공간과 데이터가 새롭게 할당됩니다.
...
var man: Human = Human(age: 23, number: 7848)
var woman = man
woman.age = 35
다소 복잡하고, 어려운 데이터 구조에 대한 내용을 다뤄보았습니다.
다음 포스팅에서는 메모리를 관리하는 방식인
Heap 영역과 관련된 ARC에 대한 내용을 가지고 돌아오겠습니다.
- Reference(참고)
iOS :: Swift 메모리의 Stack과 Heap 영역 톺아보기
iOS :: Swift 메모리의 Stack과 Heap 영역 톺아보기
안녕하세요! 상어입니다. 최근에 공부를 하면서 이 부분에 대해서는 꼭 블로그에 써야겠다라는 생각이 들었는데 그건 바로 Stack과 Heap입니다! 아마 많은 분들이 해당 부분에 대해서는 학교에서
shark-sea.kr
'CS > Computer Basic' 카테고리의 다른 글
[CS/Basic] 예시 코드와 함께 살펴보는 ARC 메모리 관리 과정 (0) | 2023.03.17 |
---|---|
[CS/Basic] 메모리 관리의 시작, ARC(Automatic Reference Counting) (0) | 2023.03.16 |
[CS/Basic] 메모리 구조는 어떻게 구성되어있을까? (0) | 2023.02.12 |
[CS/Basic] 객체지향 프로그래밍의 특징과 설계원칙(SOLID) (2) | 2023.02.01 |
[CS/Basic] 마침내, 객체지향 프로그래밍 (OOP, Object-Oriented Programming) (0) | 2023.01.25 |
댓글