티스토리 뷰

반응형

 

 

 


BidirectionalCollection
양방향 컬렉션

후방, 전방 순회를 둘 다 지원하는 컬렉션(Collection) Protocol

 

 

 


양방향컬렉션 프로토콜 선언

 

 


Overview
개요

양방향 컬렉션(Bidirectional Collection)은 전방 뿐만 아니라 후방의 유효한 인덱스에서 순회하는것을 지원합니다. startIndex 필요 없이 말이죠.

양방향컬렉션은 이렇듯 전방순회뿐만 아니라 후방 순회가 가능한데요. 이에 따른 추가적인 연산기능을 제공하고 있습니다. 마지막 요소를 효율적으로 접근할 수 있도록 하는 기능, 역순으로 요소들을 얻을 수 있게 해주는 reversed() 메서드 등이 그 예입니다. 그 뿐만 아니라, 양방향 컬렉션은 suffix(_:)와 같은 메서드를 사용할 수 있게 해줍니다.

suffix(_:) 메서드의 사용 예시는 아래와 같습니다. 

 

 

str 변수는 "Hello, playground"라는 문자열을 갖고 있습니다. str변수는 String 타입으로 양방향컬렉션에 해당합니다.

str변수는 String 타입이자 Bidirectional Collection이기에, suffix(_:)메서드를 접근하여 사용할 수 있습니다. 위의 코드는 str문자열의 뒤에서 10자리의 문자열을 반환하여 출력하는 코드가 되겠습니다.

suffix(_:) 메서드는 양방향컬렉션인 String에서 사용이 가능하지만, Array와 같은 랜덤접근컬렉션(RandomAccessCollection)에서도 사용이 가능합니다. 인자값이 k라고 할 때, 양방향컬렉션인 String의 경우 suffix(_:) 시간복잡도는 O(k), 랜덤접근컬렉션인 Array의 경우 시간복잡도는 O(1)입니다.

 

 


Conforming to the BidirectionalCollection Protocol
양방향컬렉션 적용, 준수하기

만약 만든 커스텀 타입에 양방향컬렉션, BidirectionalProtocol을 추가 및 적용하기 위해서는 Collection 프로토콜의 요구사항을 충족함과 동시에 index(before:) 메서드를 구현해야합니다.

양방향컬렉션 상에서 앞, 뒤로 움직이는 색인들은 각각의 방향에 대해서 동일한 양으로 움직입니다. 이 말은 즉, 양방향컬렉션 collection에 대한 임의의 인덱스 idx는 아래와 같이 그 범위가 정의될 수 있습니다. 

if idx >= collection.startIndex && idx < collection.endIndex,
	collection.index(before: collection.index(after: idx)) == idx
if idx > collection.startIndex && idx <= collection.endIndex,
	collection.index(after: collection.index(before: idx)) == idx

 

 

 


지금까지 Swift의 양방향컬렉션에 대한 개요를 읽어보았습니다.
양방향컬렉션의 대표적인 예는 String 타입이 되겠습니다. 그러므로 String은 앞, 뒤로 인덱스를 갖고 접근할 수 있으며, suffix(_:)등의 메서드를 사용해서 문자열을 처리 할 수 있습니다.

다만, 양방향컬렉션은 컬렉션길이를 연산하는데 모든 요소들을 순회해야 하는 특성으로 O(N)의 시간복잡도를 갖는 다는 단점이 있습니다. 그러므로 String또한 그 길이(count)를 얻기위해서는 O(N)의 시간복잡도가 걸립니다. 이는 일반적인 컬렉션의 count 연산이 O(1)인 것과 큰 차이점을 갖고 있습니다.

지금까지 BidirectionalCollection, 양방향컬렉션에 대해서 알아봤습니다. 즐거운 하루 되세요! 🤗

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함