Collection, Copy On Write, isKnownUniquelyReferenced

나이든별 / Oldstar·2022년 5월 18일
0

Think about Keywords

목록 보기
20/37

공부한 것

  • Collection
  • Copy On Write
  • isKnownUniquelyReferenced

고민한 점 및 생각해본 점

  • 상술한 세 가지는 모두, 이 책에서 연결 리스트를 만들 때, 리스트를 좀더 'Swift스럽게' 만들 때 사용한 것들이다.
  • 먼저 Collection는 프로토콜이다. 심지어, 많은 빌트인 자료형에 쓰이고 있다.
    • 여러 개의 데이터를 모아 놓은 것에 대한 프로토콜 중 2번째 티어.
    • 공식 문서에서 소개하는 Collection 프로토콜의 기능은, 데이터 모음의 특정 위치에 있는 원소에 접근할 수 있다는 것이며, 해당 데이터 모음의 일부분에 대해서도 이 성질이 유지된다는 것이다.
    • Index에 관련된 기능을 한다고 생각하면 편하다.
    • 해당 도서에도, 유한한 데이터의 모음을 나타내며 내부의 데이터를 손상시키지 않고 접근해 값을 얻어낼 수 있게 해 주는 프로토콜이라고 나와 있다.
  • 다음으로 Copy On Write는 클래스와 구조체에 대해 배울 때 잠시 나왔던 개념이다.
    • 복사 동작에 대한 퍼포먼스를 향상시키기 위한 방법이다.
    • 원칙적으로 값 타입은 복사되었을 때 완전히 새로운 인스턴스가 복사되어야 한다. 하지만, 매번 이렇게 하는 것은 효율이 떨어진다.
    • 그래서 복사한 척 하고, 처음으로 내용이 바뀌었을 때 비로소 복사를 하는 식으로 복사를 미룬다. 이렇게 하면, 똑같은 내용을 여러 번 복사했을 때 매번 복사하는 것보다 효율적으로 컴퓨터의 자원을 사용할 수 있다.
    • 책에서 예시로 나온 경우는, LinkedList<Value> 구조체가 의존하는 Node<Value>가 클래스였기 때문에, 리스트의 '복사' 개념을 구현해주기 위해 사용되었다. 두 개의 리스트를 생성해도, 노드들이 서로 같은 곳을 참조하고 있기 때문에, 하나의 값을 바꾸면 두 개가 다 바뀌는 현상이 일어났다.
  • isKnownUniquelyReferencedCollections와 관련된 메서드이다. 아까 위에서 말헀던 '데이터 모음' 관련된 메서드.
    • 공식 문서에 따르면, 주어진 오브젝트가 하나의 강한 참조만을 가지고 있을 때 True를 반환하는 메서드이다.
    • 이 말인즉, 상술한 경우처럼 두 개 이상의 오브젝트가 같은 곳을 참조하고 있을 때 false를 반환한다는 뜻이다.
    • 이걸 왜 사용하는가? 책에 제시된 예시에서는, isKnownUniquelyReferenced를 적용하지 않은 상태에서는 값을 더하거나 뺄 때마다 리스트 전체를 복사해야 한다. 모든 리스트의 메서드에 대해 O(n)만큼의 시간이 걸리게 되는 것이다. 무서움!
    • 실제로 공식 문서에서도 Copy On Write를 값 타입에 적용할 때 유용하다고 써 있다.
    • 단! 복수의 쓰레드에서 해당 오브젝트에 접근할 때나, 약한 참조만을 가지고 있을 때는 여전히 True를 반환할 수 있다고 한다. 이것은 이제 비동기에서 Race Condition이 일어나는 과정이나, 이런 것들이랑 연관이 있으리라 생각된다.

참조

https://developer.apple.com/documentation/swift/collection (Collection 프로토콜)
https://www.hackingwithswift.com/example-code/language/what-is-copy-on-write (Copy On Write)
https://developer.apple.com/documentation/swift/2429905-isknownuniquelyreferenced (isKnownUniquelyReferenced)

profile
함께 나아가고자 하는 사람

0개의 댓글