[TIL] Memory Structure in Swift (Class, Struct)
Swift 에서 비슷한 Class와 Struct 비슷한 역할을 하지만 무엇이 다른지 보다가 여기까지 오게되는 여정
우선 Class 와 Struct 는 무엇이 다른가 ❓
Swift 에서 Class 와 Struct 유형의 Instance(인스턴스)에 적용되는 기능을 주로 설명을 합니다. 그렇기에 Object 보다는 일반적인 용어 Instance로 사용합니다.
Class 는 상속을 통해 한 클래스가 다른 클래스의 특성을 상속할 수 있으며, 참조 타입입니다.
Struct 는 값 유형입니다.
참조 유형은 변수나 상수에 할당되거나 함수에 전달될 때 복사되지 않고 기존 인스턴스에 대한 참조
값 유형은 변수 또는 상수에 할당되거나 함수에 전달될 때 값이 복사되는 유형입니다
Struct 와 Class 어느걸 써야 하나 ❓
기본적으로는 Struct를 사용
데이터의 ID를 제어해야하는 경우 Class 사용
기능(행동)을 공유하는 방식에서는 Struct 에 Protocol 을 채택
공식 문서 : 링크
WWDC 2016 - Understanding Swift Performance (링크)
Stack 영역은 끝에서만 추가하거나 제거할 수 있는 구조(LIFO: Last In, First Out)입니다.
함수를 호출할 때 공간을 만들기 위해 스택 포인터를 약간 감소시키는 것으로 메모리를 할당 가능
함수 실행이 끝나면 스택 포인터를 호출하기 전의 위치로 다시 증가시켜 메모리 할당을 간단하게 해제 가능
Stack 할당은 정말 빠릅니다.
스택 끝에 있는 포인터를 스택 포인터라고 부릅니다
Heap 영역은 동적이지만 효율성이 떨어집니다.
할당을 하려면 적절한 크기의 '사용되지 않은 블록'을 찾아야 합니다.
해제를 하려면 적절한 위치에 다시 삽입
Stack 보다는 더 많은 것이 관련됩니다. (큰 비용)
번역 참고 : 링크
성능 향상을 위해서 Instance 가 Memory structure 에서 Stack 영역에 할당되는지 Heap 영역에 할당되는지 알아야 합니다. 이러한 것을 알아야 더욱 빠른 Swift 코드를 작성할 수 있게 됩니다.
Swift 에서는 ARC(Automatic Reference Counting : 링크)에 의해서 사용자를 대신해서 자동으로 메모리를 할당 및 할당 해제합니다. ARC는 최소 하나라도 Instance 에 대한 참조가 있는 경우 그 메모리에서 해제를 하지 않습니다.
제대로 관리를 안하게 되면 메모리가 누수가 발생되며, 메모리 부족으로 사용되는 앱이 느리게 실행되다가 앱이 다운될 수 있습니다.
Reference Type과 관련된 Value Type
- 값 유형을 포함하는 참조 유형
스택 할당 섹션에서 관련 참조 유형이 없는 값 유형은 스택을 사용하여 메모리 관리된다고 구체적으로 언급했습니다.
그 이유는 값 형식 멤버를 포함하는 참조 형식이 있는 경우 참조 형식이 힙에서 메모리 관리되기 때문입니다. 따라서 참조 유형이 할당 해제되기 전에 할당이 해제되지 않도록 관련 값 유형도 힙에 유지되어야 합니다. 이 유형의 매우 일반적이지만 종종 간과되는 예는 클로저 내부에서 사용되는 값 유형입니다.
- 참조 유형을 포함하는 값 유형
이 경우 값 유형은 힙에 할당되지 않지만 이제 내부에 참조 유형을 보유하므로 연관된 참조 계산 논리가 필요합니다. 그 이유는 그렇지 않은 경우 값 유형 자체가 참조를 보유하고 있더라도 내부에 보유하고 있는 참조 유형이 할당 해제될 수 있기 때문입니다.
참고 블로그 : 링크
추가적으로 살을 붙여야 하는 것 !!
WWDC 번역에서 나와있는 String 구조체에서도 Heap 영역에 할당되는 이유와 방식을 바꾸는 과정
메모리 구조 : 참고 링크