단순히 어떠한 데이터를 휘발성으로 임시보관하고 있는 장소로만 알고 있으며 정확히 ‘메모리가 무엇인가’ 또한 ‘메모리가 어떤 일을 수행하는가’에 대해서 심층적으로 이해하기 위해 학습하게 되었다.

메모리

각 영역의 설명

코드로 각 메모리의 사용 영역을 살펴보자

// 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으로 활용하는 등 논리적으로 구분하여 사용할 뿐이다. 무조건 기능 개발만 완성한다고 진정한 개발자가 아니라 생각하며 기초가 탄탄해야 된다고 생각하며 학습한 시간을 가져봤다.