단순히 어떠한 데이터를 휘발성으로 임시보관하고 있는 장소로만 알고 있으며 정확히 ‘메모리가 무엇인가’ 또한 ‘메모리가 어떤 일을 수행하는가’에 대해서 심층적으로 이해하기 위해 학습하게 되었다.
보조기억장치에 to 메모리로 적재main을 찾아 진입code: 작성되는 모든 코드들이 올라가는 영역 순차적으로 한줄씩 실행
data: 전역변수 선언 시 적재되는 영역 - 외부에서 접근 가능 공유 영역
/*
아래와같이 static 변수 & 전역 변수는 데이터 영역에 적재되며, 프로그램이 종료되어야 해제된다.
즉, 무분별하게 사용하면 앱을 종료하기전까지 데이터영역에 불필요하게 점유하고 있을 수 있다.
*/
static let yoonds = "윤대성 입니다"
var name: String?
heap: 인스턴스 생성 시 메모리 주소 적재 - 외부에서 접근 가능 공유 영역
런타임 시점에 결정되기에 적재하려는
데이터의 크기를 확실히 모를 때 사용한다.ARC를 통해 자동으로 해제한다.
// heap에 존재하는 클래스 인스턴스
let yoondsInstance = YoondsAClass()
func somethingA() {
// yoondsInstance는 함수내부가 아닌 외부에 존재하지만 공유영역이기에 접근이 가능하다.
yoondsInstance.sameple()
}
stack: 함수 실행 시 실행에 필요한 메모리 공간 생성(스택 프레임) - 공유불가 영역
함수 실행 시 적재되며, 함수가 끝나게되면 해제된다.
스택 프레임은 외부 공유가 불가 → 내부에서만 사용
/*
아래와같이 testA 내에 있는 a변수를 testB에서 접근하려고 하면 에러가 발생한다.
a변수는 공유가 불가한 stack 내에서 생성되었기 때문이다.
*/
func testA() {
let a: String = "YoondsA"
}
func testB() {
a = "anotherA" // error
}
함수 생성 시 파라미터를 통해 들어온 값의 공간도 stack에 생성
함수 실행 완료 후 프레임을 LIFO 형태로 제거
리턴값이 없는 함수의 경우 스택프레임 내부에 메모리 공간 미생성
멀티스레드로 사용할 경우 스택이 다중 생성(서로 접근 불가능)
상대적으로 heap에 비해 빠르지만 메모리 크기에 제한이 존재한다.
| 리턴 값 미존재 함수 | 리턴값 존재 함수 |
|---|---|
| 임시 메모리 공간 미생성 | 임시 메모리 공간 생성 |
| (함수 실행 후 값 반환을 위해) | |
| 함수 실행 시 CPU 제어권 할당 | |
실행 종료 후 CPU 제어권 반환 |
함수 실행 시 CPU 제어권 할당 |
실행 종료 후 CPU 제어권 & 리턴값 반환 |
// code - 작성한 모든 코드
class Yoonds {
// data - 전역 변수 선언(외부에서 접근 가능)
var dataArea: Int = 5
func addNum(a: Int) -> Int { // stack 영역 - 파라미터 a
let b = 10 // stack 영역
dataArea = 20 // data 영역에 존재하는 변수(dataArea)이기에 접근 가능
/*
전달받은 a값을 저장하기위해 스택 프레임 내 임시 메모리 생성
리턴 타입이 있는 관계로 리턴 값을 임시 저장할 스택 프레임 내 임시 메모리 생성
*/
return a + b
}
b = 20 // error 발생 - b는 공유 불가한 stack영역에 존재하기에 접근 불가
}
/*
실제 인스턴스는 heap에 적재되지만
heap에 적재된 메모리 주소(ex: 10xE100)를 갖고있는 지역변수 yoonds는 stack에 적재된다.
즉, yoonds를 까서 보면 heap에 할당된 인스턴스의 주소를 갖고 있다.
(이 부분은 공부하면서 좀 흥미로웠다.)
*/
let yoonds = Yoonds() // 메모리 주소 예: e123d
// addNum 함수 실행 시 해당 함수를 stack영역 내 스택프레임 생성
yoonds.addNum(a: 5) // 15
heap의 경우 메모리 제한이 없고 stack의 경우 제한이 있다. 제한이 있는 stack에 너무 많은 데이터를 적재하려고 하면 많이 들어봤을 stack over flow가 발생하게된다. 즉, 무한 재귀함수 같이 stack 영역을 무제한 사용하려하면 crash가 발생할 수 있다.
추가적으로 네가지의 영역이 메모리에 물리적으로 쪼개져 나눠져있는것이 아니다.
특정 부분을 code로 활용, 또 남은 부분은 stack으로 활용하는 등 논리적으로 구분하여 사용할 뿐이다.
무조건 기능 개발만 완성한다고 진정한 개발자가 아니라 생각하며 기초가 탄탄해야 된다고 생각하며 학습한 시간을 가져봤다.