티스토리 뷰

반응형

 

 


Range

Range는 제네릭 구조체로, 반개방 상태의 간격을 표현하는 제네릭 구조체입니다. Range는 최저값을 포함하고, 최대값을 포함하지 않는 간격(A..<B)을 표현합니다.

 

 


Declaration
선언

Range에서 사용할 수 있는 제네릭 타입은 Comparable 프로토콜을 준수하는 타입이면 무엇이든지 가능합니다. 즉, Comparable한 타입의 범위를 표현할때 사용할 수 있습니다.

반개방 형태의 연산자, (..<) 를 통해 Range 인스턴스를 만들어 사용할 수 있습니다. 그 생성 예시는 아래와 같습니다. 

 


위 코드는 0.0이상, 10.0미만의 값 범위를 가진 Range 인스턴스를 생성하는 예시입니다.

해당 Range 인스턴스에 특정 값이 포함되는지를 확인할 수 도 있습니다. 그 방법은 아래와 같습니다.

 


Range 인스턴스에서 접근가능한 contains 멤버 메서드를 통해서 해당 인자값이 Range 인스턴스 내에 포함되는지 유무를 Boolean값으로 판단할 수 있습니다.

Range인스턴스는 텅빈 범위 또한 표현할 수 있습니다. 가령, "0..<0" 와 같은 표현도 가능합니다. 해당 인스턴스는 어떠한 값도 포함하지 않는 범위가 됩니다. 단, Range 인스턴스에서 좌측 값이 우측 값보다 크면 컴파일 에러를 야기합니다.

 

 


Using a Range as a Collection of Consecutive Values
연속 값을 가진 컬렉션에 Range 활용하기

앞서 돌아보았던 Range 인스턴스를 사용할 수 있는 곳은 언제가 있을까요?

바로 연속적인 다수의 값을 가진 컬렉션 값의 특정 범위를 순회할 때가 있겠습니다. Integer Stride을 정의한 Strideable 프로토콜을 준수하는 컬렉션이라면 Range를 사용할 수 있습니다. 아래와 같이 컬렉션의 순회하고 싶은 범위를 지정해서 for 루프 문등에 활용할 수 있습니다. 

 


위의 코드는 0..<array.count의 범위를 지정해서 컬렉션을 순회, 각 값을 출력하고 있는 코드입니다.

array 컬렉션의 크기는 곧 array.count이고, 첨자 접근가능한 최대 범위는 array.count-1이 되므로 즉, 0..<array.count는 array 컬렉션의 전제범위를 순회하는 것이 됩니다. 

컬렉션의 전체 계수가능 범위를 반환해서 순회하는 방법으로는 0..<array.count 이 외에도 위의 코드 하단에서 볼 수 있듯이, 컬렉션의 indices 프로퍼티를 접근해서 사용하는 방법도 있습니다.

컬렉션의 프로퍼티, indices는 Range를 별도의 리터럴값 명시없이 해당 컬렉션의 전체 계수가능 범위를 표현할 수 있는 좋은 방법이 됩니다.

 

정수형 Int 타입과 달리, Float, Double 등의 부동소수점 타입은 그 자체가 Stride 타입이기 때문에, 위와 같은 정수형 범위로서 계산하며 사용할 수 없습니다. 만약 연속적인 부동소수점 값들의 순회가 필요하다면, 부동소수점의 순회를 사용하는데 목적을 두는 메서드, stride(from:to:by:), stride(from:through:by:) 메서드를 사용하시면 됩니다. 

 

 


오늘은 컬렉션의 순회 등에 알게 모르게 사용하고 있는 Range 구조체에 대해서 알아보았습니다. 실전에서 자주 쓰이는 요소인만큼, 특성을 알아두면 좋을 것 같습니다. 🤗

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
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
글 보관함