프로토콜 지향 프로그래밍 POP
참조타입을 조심해야 된다. 클래스는 참조타입이지. 그리고 참조타입을 잘못 쓰다가는 원본을 참조하는 여러 인스턴스가 까딱하면 원본 데이터를 변경해버리기 때문이다.
그래서! 애플은 구조체를 권장하는 거다. 물론 다른 이유도 있겠지..
구조체로 이루어진 많은 내부 타입들은 프로토콜 채택을 통해 기능들을 구현한다.
매번 채택하고 내부 메소드와 프로퍼티를 구현하는 걸까? 그건 아니다.
어떻게 해결하냐? 바로 Extension을 통해 가능하다. Extension을 통해 초기 기능을 구현해둔다. 그리고 각각의 실제 구현부에서 적합하도록 기능을 구현한다.
스택은 가장 마지막에 들어온 게 가장 먼저 나가는 단순한 구조라서 메모리 할당이랑 해제가 편하다. 스택은 스택 포인터로 할당, 해제를 처리하는데 여하튼 스택이 그래서 단순한 구조를 가져서 시간복잡도가 낮아 속도가 무척 빠르다고 한다.
힙은 어떨까? 힙은 스택보다는 복잡한 구조다.
힙은 힙 영역에서 사용하지 않은 블록을 찾아서 메모리 할당을 처리한다.
할당을 해제하려면 할당 메모리를 적절한 위치로 다시 삽이하고, 여러 스레드가 동시에 힙에 메모리를 할당할 수 있기 때문에 locking 또는 동기화 메커니즘을 사용해서 무결성을 보호해야 한다.
그래서 벌써 설명해둔 줄글수만 봐도 스택은 힙보다 비용이 더 적게 들고 속도도 더 빠른 할당 방법이다.
구조체가 대표적인 값을 따르고
값타입들의 인스턴스는 스택에 할당된다.
구조체 인스턴스를 생성해서 다른 인스턴스를 할당하면, 전체 값은 그대로 복사가 된다.
복사된 인스턴스는 기존 인스턴스랑 구분되어서 스택에 저장되기 때문에 내부 값을 변경해도 원래 값에 영향을 주지 않는다.
Point라는 구조체 내의 x, y 프로퍼티가 있고
point1 인스턴스를 생성해 Point 구조체 초기화를 해줬다. 각각 값을 줬고,
point2 인스턴스는 point1 인스턴스를. 가져와 할당해줬는데 대신 point2.x는 5로 값을 변경했다.
그렇지만 구조체는 값을 복사해서 서로 다른 공간에 구분해서 저장되기 때문에 원래 값인 0은 변하지 않다.
힙을 사용하지 않아서 레퍼런스 카운팅도 사용하지 않는다.
클래스는 참조타입이다.
참조인 주소값을 할당하고, 실질적인 데이터는 힙에 할당한다
클래스는 구조체가 인스턴스 내부의 변수 개수에 맞춰서 즉, point1이라는 인스턴스, point2라는 인스턴스 하나씩 스택에 할당되는 것과 다르게 힙에서는 point1, point2 모두 같은 곳에 할당된다.
항상 하나의 Identity를 갖는다. Point 클래스의 인스턴스를 생성하고 복사하게 되면 힙에는 레퍼런스, 주소값이 복사되어서 point1, point2는 모두 하나를 향해서 같은 값을 갖게 된다. 그렇기 때문에 복사된 인스턴스를 수정하면 인스턴스 데이터도 함께 변경되는 것처럼 보인다. 그래서 복사된 인스턴스를 수정하면 원래 인스턴스도 함께 변경이 되는 것이다.
그래서 클래스를 사용하면 힙 할당을 사용해서 구조체보다 더 많은 비용을 사용하게 되는 것이다.
그래서 클래서의 성능이 필요하지 않으면 구조체를 쓰는 것이 낫다.
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[Swift] ReusableViewProtocol로 뷰컨/셀 식별자 사용하기 (0) | 2022.08.02 |
---|---|
[Swift] Class와 Struct 그리고 부스러기 개념들 (0) | 2022.07.29 |
[iOS] DataSource, Delegate | TextView Placeholder | WebKit (0) | 2022.07.29 |
[iOS] PickerView (0) | 2022.07.28 |
[iOS] 프로토콜 (0) | 2022.07.28 |