swift에서의 struct vs class
우선 스택과 힙 메모리에 대해 알아보자.
메모리: 스택과 힙 영역
변수에 값을 할당할때마다 메모리가 할당된다.
프로그램은 총 4가지 영역의 메모리 구성을 가진다.
- 스택: 지역 변수 저장
- 힙: 동적 할당을 위한 공간
- 데이터: 전역 변수 저장
- 코드(텍스트): 실행할 코드를 저장함
스택은 함수 코드가 실행될때마다 지역 변수가 스택에 하나씩 저장된다. 메모리에도 순서대로 저장된다. 함수가 종료되면 스택에 저장된 지역 변수들이 자동 할당 해제된다.
힙은 사용자(개발자)에 의해 관리되는 영역이다. 즉 필요한 만큼 메모리를 할당하고, 직접 해제하기 전까지 힙 영역에 남아있는다.
언어마다 이 메모리 관리에 대해 다르지만 몇몇 c언어 계열을 제외하면 대부분 garbage collector가 관리해주는 것 같다.
힙에 할당하면 그 객체의 인스턴스는 힙에 저장되고, 인스턴스를 가리키는 주소는 지역변수에 저장되므로 스택에 저장된다.
만약 인스턴스에 할당된 메모리를 할당해제 하지 않고 함수가 종료되면 메모리 누수(memory leak)가 발생한다.
메모리 누수는 작은 프로그램에서는 큰 일이 아니지만, 오랫동안 작동해야하는 서버 같은 경우 전체 머신을 느리게 만들거나 크래시가 발생하는 원인이 된다.
스택은 할당되고 해제되는 순서가 정해져있지만, 힙은 순서없이 사용자의 관리에 따라 해제되므로 메모리가 파편화된다. 이걸 방지하기 위한 메모리 할당 정책들이 있다
struct vs class in swift
swift에서 구조체는 스택에 저장되고 클래스 인스턴스는 힙에 저장된다.
구조체와 클래스를 비교하면
구조체는
- 빠르고
- 데이터가 모두 카피되고
- 완전한 불변성이다.
- 메모리 leak이 없고
- 쓰레드 세이프 하다.
클래스는
- 상속을 할 수 있고
- 오브젝트 c 코드와 함께 사용가능하다.
애플은 커스텀 객체가 필요하면 우선 구조체로 먼저 만들고, 상속이 필요하거나 오브젝트c코드 사용이 필요할때만 클래스로 바꿀 것을 권고하고 있다