iOS-30thStudy / iOS_study

30기 3조 스터디 레포
1 stars 0 forks source link

[2주차] Array, dictionary는 무슨 타입인가요? #4

Open Seokki-Kwon opened 4 months ago

Seokki-Kwon commented 4 months ago

🕜 2024.02.13

Seokki-Kwon commented 4 months ago

Array, dictionary는 무슨 타입인가요?

Array, dictionary는 Collection Type 이며 추가적으로 Set 또한 Collection Type에 속함

Array: 순서가 지정된 값 모음 Dictionary: 정의된 순서 없이 컬렉션에 있는 동일한 유형의 키와 동일한 유형의 값 간의 연관을 저장

값타입은 메모리에 값이 항상 복사되는데 더 느린 거 아닌가요?

Swift에서 Struct, enum이 값타입(Value Type) 이며 유일하게 Class가 참조타입(Reference Type)이다. 두개의 타입은 저장되는 공간도 다르며 할당과 해제되는 과정또한 다르다. 느리다 빠르다는 곧 성능과 직결되는 이야기 이며 성능에 영향을 미치는것은 아래의 3가지라고 한다.

참조타입

Memory Allocation

값타입과 참조타입의 차이점중 하나는 메모리 공간할당 과정이다. 참조타입의 경우 Heap에 값을 할당시에 적절한 공간을 찾아내는 과정이 필요하기 때문에 할당 과정에서도 값타입에 비해서 복잡한 과정을 거친다.

Reference Counting

Swift는 ARC라는 시스템으로 내부적으로 Heap의 인스턴스를 메모리에서 해제할지 여부를 결정한다고 한다 하지만 해당 인스턴스 주소를 복사하는 변수가 생길때마다 Reference Counting이 이루어지며 이또한 속도를 저하시키는 요인중 하나이다.

Method dispatch

클래스가 인스턴스의 메서드를 수행하는 과정은 Class의 실제 type을 얻고 해당 class type의 테이블 내의 메서드 주소를 찾은뒤 메서드를 호출해야한다. 문제는 이러한 과정이 runtime시에 일어나는 과정이다.

정리하며

값타입과 참조타입은 메모리 할당 과정, 참조횟수 카운팅 여부, 메서드 호출방식 추가적으로 Thread-Safety를 보장하기 위한 추가적인 작업여부의 차이가 존재하며 결론적으로 값타입이 느리다고 할 수 없다고 생각한다. 값타입의 경우 값전체를 복사하기 때문에 참조횟수 카운팅을 할필요도 없으며 각각 개별적인 값을 가지기 때문에 데이터경쟁에서 안전하기 때문에 Thread-Safe 하다고 할 수 있다. 그렇기 때문에 상속이 필요하지 않은 작업이나 각각의 데이터를 담을때에는 구조체를 사용하는게 더 효율적이라고 생각한다.

chldudqlsdl commented 4 months ago

Array, dictionary는 무슨 타입인가요?

이들은 컬렉션 타입이다. 컬렉션 타입은 여러 데이터를 하나로 묶은 것을 의미한다. 컬렉션 타입은 아이템을 추가, 삭제 또는 변경을 할 수 있다. swift 에서는 Array, Set, Dictionary 의 세가지 컬렉션 타입을 지원한다.

값타입은 메모리에 값이 항상 복사되는데 더 느린 거 아닌가요?

Collection Type 들은 기본적으로 값 타입이다. 하지만 내부적으로는 값타입의 기능과 참조타입의 기능을 같이 사용한다. Array 의 경우 많은 값을 내부에 포함하고 있는데, 복사할 때마다 이 많은 값들을 다 복사하려면 시간과 공간의 부담이 크다.

그렇기에 Swift는 Copy-on-write 이라는 방식을 사용한다. 이는, 값을 새로운 변수에 할당할 때 복사본을 만들지 않고, 참조 타입처럼 메모리 주소값만 공유한다. 그리고 만약 새로운 변수의 값이 변경되면 새로운 복사본을 만들고 값을 변경한다.

이로써 참조 타입의 효율성과 값 타입의 불변성을 둘다 활용할 수 있다.

의견

두번째 문항이 질문이 좀 애매하게 되어 있는데, 컬렉션 단원이라 수업중에 다룬 Copy-on-write 에 대한 질문인가하고 관련 내용 적었습니다~ Copy-on-write 참조 : https://velog.io/@eddy_song/Swift-Value-Reference

zxcvb2002 commented 4 months ago

2주차


hyeji-K commented 4 months ago

Array, dictionary는 무슨 타입인가요?

Array와 dictionary는 구조체로 구현되어 있으며 값타입(Value Type)입니다. 값타입은 필요시에 메모리 값이 복사되어 사용이 되므로 원본의 값은 변하지 않습니다.

값타입은 메모리에 값이 항상 복사되는데 더 느린 거 아닌가요?

컴퓨터 프로그래밍에서 복사 동작을 할 때 COW(Copy-On-Write) 방식을 채택하여 사용합니다. 이는 수정이 일어날 경우 복사하는 것으로 수정되기 전까지는 복사를 하지 않고 하나의 메모리 값을 공유해서 사용합니다. 따라서 COW를 통해 불필요한 복사를 줄일 수 있으며, 항상 복사가 일어나는 것은 아닙니다.