본문 바로가기
CS/Computer Basic

[CS/Basic] 메모리 영역, Heap과 Stack엔 어떤 데이터가 쌓일까?

by iosdevlime 2023. 2. 23.

메모리 구조의 4가지 영역 중,

Heap Stack 영역을 조금 더 자세히 살펴보고자 합니다.

 

해당 두 영역의 개념을 다시 한번 상기하고,

Swift 메모리 상에서 데이터가 쌓이는 과정을 알아보겠습니다!

 

 

본 포스팅의 경우, 메모리 구조와 관련된 추가적인 학습 이후

개념상 맞지 않은 부분이 있다면 지속적으로 보완 할 예정입니다. 

 

 


 

 

 

Heap 과 Stack 메모리 영역은 어떻게 할당할까?

메모리 내 저장(할당)되는 기준은 바로 Semantics!

 

앞서 메모리 구조에서 다룬

Heap과 Stack에 대한 내용을 되짚어 보자면..

 

  • Heap ➟ 컴파일단계에 사용자에 의해 할당/해제하는 영역
    • Class, Closure와 같은 참조타입이 저장
  • Stack ➟ 런타임 단계에서 프로그램이 자동으로 할당/해제하는 영역
    • 함수 호출 시, 지역변수 / 매개변수 / 리턴값이 저장

 

하지만, 위와 같은 내용으로 봤을 때

메모리 상에 실제로 어떻게 저장이 되는 것인지 구분하기 매우 어렵습니다🤷🏻‍♂️

 

 

 

 

그래서, 어떻게 할당되는데요?

  • 메모리 할당 시, Heap 혹은 Stack에 저장되는 기준은 'Semantics' 입니다. 
    • Semantics란, 프로그래밍 분야에선 '코드의 의미'로 통용됩니다.
    • 다시 말해, "무엇을 어디에 할당을 해야 의미가 있는 것인가?" 란 의미로 작용합니다.
  • 여기서의 '무엇'은 객체(인스턴스)이자 데이터이며, 이는 타입에 따라 구분됩니다. 
    • 타입(Type)이란, 데이터의 메모리 저장과 처리방식을 알리는 역할을 담당합니다.
    • 결과적으로, ①타입체크②Semantics 확인③메모리 할당 순서를 거치게 됩니다.

 

Stack과 Heap의 저장하는 기준은 타입(Type)에 따른 데이터의 의미(semantics)이다.
Stack과 Heap의 저장하는 기준은 타입(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)

 

Stack에는 인스턴스의 주소가, Heap에는 실질적인 데이터가 담김
Stack에는 인스턴스의 주소가, Heap에는 실질적인 데이터가 담김

 

 

  • woman 이란 새로운 인스턴스를 생성한 후, 기존 man 인스턴스를 할당한다면?
    • 클래스 인스턴스이므로, Heap에 담긴 데이터 값을 참조합니다.
    • 또한, woman의 age에 새로운 값을 할당하게 되면 man&woman 모두 값이 변경됩니다.
...

var man: Human = Human(age: 23, number: 7848)
var woman = man
woman.age = 45

Stack 영역에 woman 인스턴스의 주소가 추가되고, 참조(상태공유)로 인해 age값이 변경됨
Stack 영역에 woman 인스턴스의 주소가 추가되고, 참조(상태공유)로 인해 age값이 변경됨

 

 


 

 

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)

Stack에 실질적인 man 인스턴스의 데이터가 쌓임 (Heap은 반응이 없다!)
Stack에 실질적인 man 인스턴스의 데이터가 쌓임 (Heap은 반응이 없다!)

 

 

  • woman 이란 새로운 인스턴스를 생성한 후, 기존 man 인스턴스를 할당한다면?
    • 구조체 인스턴스이므로, 새로운 복사본으로서 별도의 값을 가지게 됩니다.
    • Stack 영역에 woman이란 인스턴스의 공간과 데이터가 새롭게 할당됩니다.
...

var man: Human = Human(age: 23, number: 7848)
var woman = man
woman.age = 35

 

man 이외, woman 인스턴스가 새롭게 공간을 차지했다!
man 이외, woman 인스턴스가 새롭게 공간을 차지했다!

 

 

 


 

 

다소 복잡하고, 어려운 데이터 구조에 대한 내용을 다뤄보았습니다.

 

다음 포스팅에서는 메모리를 관리하는 방식인

Heap 영역과 관련된 ARC에 대한 내용을 가지고 돌아오겠습니다.

 

 

 

 

- Reference(참고)

 

iOS :: Swift 메모리의 Stack과 Heap 영역 톺아보기

 

iOS :: Swift 메모리의 Stack과 Heap 영역 톺아보기

안녕하세요! 상어입니다. 최근에 공부를 하면서 이 부분에 대해서는 꼭 블로그에 써야겠다라는 생각이 들었는데 그건 바로 Stack과 Heap입니다! 아마 많은 분들이 해당 부분에 대해서는 학교에서

shark-sea.kr

 

댓글