오늘은 스칼라의 slice 함수에 대해 알아보겠습니다.
스칼라의 slice 함수
스칼라의 slice 함수는 다음과 같은 API 클래스에서 사용할 수 있습니다:
- 스칼라 Array API
- 문자열 API
- 스칼라 Collection API
다음 섹션에서 각 API를 선택하고 적절한 예제와 함께 상세히 설명하겠습니다.
스칼라 slice 함수 사용법
스칼라 API에서 ‘slice’ 함수는 요소의 간격을 선택하는 데 사용됩니다. “Int” 유형의 두 매개변수를 취하고 원본 컬렉션 (또는 문자열 또는 배열)의 하위 집합, 전체 또는 아무 요소도 반환합니다. 실제 슬라이스 시나리오:- 우리는 아래와 같이 평소의 현실 세계에서도 이 슬라이스 기능을 사용할 수 있습니다. 여기서 Bread.slice(0,10)는 0부터 9까지의 빵 조각을 가져오는 것을 의미하므로 총 10개의 빵 조각입니다. (여기서는 스칼라의 슬라이스 함수를 닮기 위해 제로를 사용했지만, 이것을 하나로 가정하세요.) 슬라이스 함수 구문: 스칼라 표준 라이브러리 (API)에서이 슬라이스 함수는 다음과 같이 정의됩니다:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
여기서 “ScalaAPIClass”는 Seq, List 등의 인덱스 기반 액세스를 지원하는 모든 스칼라 컬렉션 클래스 (String, Array 클래스)를 의미합니다. 예제:- 다음 함수는 스칼라 API의 Seq 클래스에 정의되어 있습니다.
def slice(from-index: Int, until-index: Int): Seq[A]
슬라이스 함수 매개변수: “슬라이스” 함수 매개변수의 사용법은 다음 표에 설명되어 있습니다:
S.No. | Function Params | Usage |
---|---|---|
1. | First Parameter | Starting index (Inclusive). It should be zero or any any positive integer less than the length of the Collection or String or Array. |
2. | Second Parameter | Ending index (Exclusive). |
슬라이스 함수는 ‘첫 번째 인덱스'(포함)부터 ‘until 인덱스'(배제)까지의 요소를 추출합니다. 숫자 배열의 경우 요소 번호, 문자열의 경우 문자, 컬렉션의 경우 객체입니다.
스칼라 배열 슬라이스
스칼라 API에서 배열 클래스는 다음과 같이 슬라이스 함수를 정의합니다:
def slice(from: Int, until: Int): Array[T]
여기서 ‘from’은 배열의 시작 인덱스(포함)이고 ‘until’은 배열의 끝 인덱스(배제)입니다. 배열 슬라이스 함수 예제:
scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)
5개의 값을 갖는 배열의 Int가 생성되었으므로 인덱스 시작 값은 0이고 인덱스 끝 값은 4입니다. 길이는 5입니다. 이제 슬라이스 함수를 사용해 봅시다.
scala> marksArray.slice(0,2)
res0: Array[Int] = Array(56, 79)
첫 번째 요소인 0번 인덱스부터 시작하여 인덱스 2까지 모든 요소를 검색하면 인덱스 1까지 모든 요소를 가져오기 때문에 0번 요소와 1번 요소를 여기서 얻을 수 있습니다.
scala> marksArray.slice(3,4)
res1: Array[Int] = Array(99)
어떤 인덱스 범위에서도 액세스할 수 있습니다.
scala> marksArray.slice(3,3)
res2: Array[Int] = Array()
위와 같이 시작 및 끝에 같은 값을 지정하면 빈 배열이 반환됩니다. 왜냐하면 시작 인덱스 = 3이고 끝 인덱스 = 3 – 1 = 2이기 때문에 배열에서 3부터 2까지의 요소 세트를 검색하는 것은 불가능합니다.
scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)
음수 값을 지정하면 사용 가능한 인덱스부터 시작됩니다. 위와 같이 표시됩니다.
scala> marksArray.slice(0,5)
res4: Array[Int] = Array(56, 79, 60, 99, 71)
2번째 매개 변수 값을 사용 가능한 인덱스를 초과하여 지정하면(위의 marksArray에서 사용 가능한 최대 인덱스 값은 길이 = 5이므로 4입니다), 해당 값을 무시하고 사용 가능한 인덱스까지만 반환됩니다. 참고:- Java와 달리 ArrayIndexOutOfBoundsException을 throw하지 않습니다.
스칼라 컬렉션 슬라이스
스칼라의 표준 API에서 대부분의 클래스는 이 슬라이스 함수를 정의하여 인덱스 기반 요소 액세스를 지원합니다. 예를 들어 List 클래스는 아래와 같이 이 함수를 정의합니다:
def slice(from: Int, until: Int): List[A]
리스트 슬라이스 함수 예제:- 배열 예제와 마찬가지로, 모든 Collection API에 대해 동일한 결과를 얻을 것입니다.
scala> val list = List(56, 79, 60, 99, 71)
list: List[Int] = List(56, 79, 60, 99, 71)
scala> list.slice(0,2)
res5: List[Int] = List(56, 79)
scala> list.slice(3,4)
res6: List[Int] = List(99)
scala> list.slice(3,3)
res7: List[Int] = List()
scala> list.slice(-1,3)
res8: List[Int] = List(56, 79, 60)
scala> list.slice(0,5)
res9: List[Int] = List(56, 79, 60, 99, 71)
빈 리스트에 접근하면 아래와 같이 빈 리스트만 얻을 것입니다.
scala> val list2 = List()
list2: List[Nothing] = List()
scala> list2.slice(0,1)
res10: List[Nothing] = List()
Scala 문자열 슬라이스
Scala API에서는 “StringOps” 클래스가 scala.collection.immutable 패키지에 정의되어 있습니다. 다음과 같이 슬라이스 함수를 정의합니다:
def slice(from: Int, until: Int): String
주의:- Scala에서는 Java의 String 클래스를 사용합니다. 그러나 이 클래스에는 슬라이스 함수가 없습니다. Java의 String 객체에 슬라이스 함수를 사용할 때 Scala 컴파일러는 내부적으로 이 String 객체를 StringOps 클래스 객체로 변환하여 이 슬라이스 함수를 사용합니다. (슬라이스 함수뿐만 아니라 더 많은 함수가 있습니다. 자세한 정보는 Scala API를 참조하십시오.) “StringOps”는 String 클래스의 암시적 클래스입니다. 문자열 슬라이스 함수 예제:-
scala> val str = "Hello I'm doing good. How are you?"
str: String = Hello I'm doing good. How are you?
scala> str.slice(6,9)
res8: String = I'm
문자열 인덱스가 0부터 시작한다는 것을 알고 있듯이 여기서 from-index = 6은 until-index = 9를 의미합니다 (이는 배제적이므로 인덱스 = 8까지만 고려해야 함). 문자열의 substring 함수는 아래와 같이 슬라이스 함수와 동일하게 작동합니다:
scala> str.substring(6,9)
res12: String = I'm
여기서 str.slice(6,9)와 str.substring(6,9) 모두 동일한 값을 반환합니다. 슬라이스 대 substring 문자열 클래스의 슬라이스와 substring 함수의 차이
- 기능적으로나 구문적으로 차이가 없습니다
- 성능은 거의 유사하며 무시할 수 있습니다.
NOTE:- Scala에서는 아래와 같이 배열 요소처럼 문자열 문자에 액세스할 수 있습니다:
scala> str(0)
res0: Char = H
여기서 Char을 반환하지만 String은 아닙니다.
scala> str(-1)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)
... 33 elided
scala> str.length
res2: Int = 34
scala> str(34)
java.lang.StringIndexOutOfBoundsException: String index out of range: 34
at java.lang.String.charAt(String.java:658)
at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)
... 33 elided
NOTE:- 문자열 문자를 범위를 벗어나서 액세스하려고 하면 위에서 보여진 대로 StringIndexOutOfBoundsException이 발생합니다. 문자열의 문자 액세스는 Char을 반환하며 substring 및 slice 함수는 아래에서 보여진 대로 String을 반환합니다.
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
이것으로 “Scala의 slice 함수” 사용에 관한 모든 것입니다. 다음 포스트에서 몇 가지 더 많은 Scala 컨셉을 논의할 것입니다. 참조: Scala API Doc
Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function