iOS 개발자라면,
코드를 작성할 때, 이 코드가 어디에 저장되고 어떻게 동작할지 알아야한다고 문득 생각이 들었습니다.
그래서 메모리 구조에 대해서 간략히 정리해볼까합니다.
그림으로 먼저 전체를 볼게요.
(made by Uno)
프로그램이 실행되면, 다음 4 개의 영역으로OS가 공간을 할당합니다.
(코드 / 데이터 / 힙 / 스택)
코드영역은 (소스)코드영역 이라고 생각해도 됩니다.
우리가 코드를 작성하는 그 부분 텍스트 에디터 영역입니다.
우리가 작성한 메모리에 소스코드
→ 0,1
로 변경하여 저장합니다.
프로그램을 실행했는데, 그 와중에 코드가 변경된다고 프로그램이 변경되면 안되겠죠.
그렇기 때문에 Read-Only
형태로 저장합니다.
소스코드 → Binary 형태로 저장
Read-Only 형태로 저장
이름이 상당히 직관적이죠. 데이터를 저장하는 영역입니다.
어떤 데이터를 저장하는데?
전역 변수와 정적변수를 저장합니다.
struct Constant {
static let token = "jwt토큰이다."
}
var userName = "Uno"
var userScore = 99
보통 이런식으로 저장을 하죠.
Constant
내부에 선언된 상수를 보면 static인 부분이 정적변수입니다.
userName
과 userScore
는 멤버변수가 아닌 어디에도 속하지 않은 그냥 변수입니다.
→ 전역변수
힙(Heap) 영역의 경우, 프로그래머가 직접 할당하거나 해제합니다.
(malloc / calloc)
하지만 스위프트에서는직접 하지 않고, ARC를 통해서 자동으로 해제해줍니다.
class Adress {
var postCode: Int?
var street: String?
}
var unoAdress: Adress = Adress()
이렇게 class를 선언한다면,
위에 제가 그린 그림보면
의 특징대로
클래스는 힙에 저장합니다.
그리고 unoAdress
스텍에 저장합니다.
함수를 호출하게되면, 함수 내부 혹은 함수 호출 시 사용되는 값들이 저장됩니다. 그리고 함수가 종료될 때, 이 모든 것들을 메모리에서 해재됩니다.
ex) 지역변수, 매개변수, 리턴 값 등등
스텍 영역에 저장되는 정보들을 스택 프레임(stack frame)
이라고 합니다.
스택은 CPU에서 관리하고 최적화를 하고 있습니다. 그래서 속도가 빠릅니다.(힙에 비해)
func printName(s1: String, s2: String) -> String {
let message = "\(s1)님 \(s2)에 오신걸 환영합니다."
return message
}
s1 과 s2 는 매개변수 → 스택에 할당한다.
message 는 지역변수 → 스텍에 할당한다.
함수 종료와 동시에 메모리 해제
다들 그림으로 쓰는데 직접 작성한 느낌 너무 러블리해용 ㅎ ㅎㅋㅎ