스칼라 슬라이스 함수
오늘은 스칼라 슬라이스 함수에 대해 알아보겠습니다.
스칼라 슬라이스
Scala 슬라이스 기능은 다음 API 클래스에서 사용할 수 있습니다.
- 스칼라 배열 API
- 문자열 API
- 스칼라 컬렉션 API
각 API를 선택하고 다음 섹션에서 적합한 예제와 함께 심층적으로 논의할 것입니다.
Scala 슬라이스 함수 사용법
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
여기서 "ScalaAPIClass\는 Scala 컬렉션 클래스(Seq, List 등과 같은 인덱스 기반 액세스를 지원함), 문자열, 배열 클래스를 의미합니다. 예:- 다음 함수는 Scala 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). |
슬라이스 함수는 'first-index'(포함)부터 'until-index'(제외)까지 요소를 추출합니다. 여기에서 숫자 배열에 대한 요소 번호, 문자열에 대한 문자, 컬렉션에 대한 객체입니다.
스칼라 어레이 슬라이스
Scala API에서 Array 클래스는 슬라이스 기능을 다음과 같이 정의합니다.
def slice(from: Int, until: Int): Array[T]
여기서 'from'은 Array의 시작 인덱스(Inclusive)이고 'until'은 Array의 종료 인덱스(Exclusive)입니다. 배열 슬라이스 함수 예:
scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)
5개의 값을 가진 Array의 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()
위와 같이 start 및 end에 동일한 값을 제공하면 빈 배열이 생성됩니다. 이유는 무엇입니까? 시작 인덱스 = 3 끝 인덱스 = 3 - 1 = 2 배열에서 3개에서 2개 인덱스까지 요소 집합을 검색하는 것은 불가능합니다.
scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)
-ve 값을 주면 위와 같이 사용 가능한 인덱스로 시작합니다.
scala> marksArray.slice(0,5)
res4: Array[Int] = Array(56, 79, 60, 99, 71)
위와 같이 사용 가능한 인덱스를 넘어 두 번째 매개 변수 값을 지정하면(marksArray의 사용 가능한 최대 인덱스 값은 길이 = 5이므로 4입니다) 해당 값을 무시하고 사용 가능한 인덱스까지만 반환합니다. 참고:- Java와 달리 ArrayIndexOutOfBoundsException을 발생시키지 않습니다.
스칼라 컬렉션 슬라이스
Scala의 표준 API에서 대부분의 클래스는 인덱스 기반 요소 액세스를 지원하는 이 슬라이스 함수를 정의합니다. 예를 들어 List 클래스는 이 함수를 아래와 같이 정의합니다.
def slice(from: Int, until: Int): List[A]
목록 조각 함수 예제:- Array 예제와 동일하며 모든 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 API에서 "StringOps\ 클래스는 scala.collection.immutable 패키지에 정의되어 있습니다. 아래와 같이 슬라이스 기능을 정의합니다.
def slice(from: Int, until: Int): String
참고:- Scala에서는 Java의 String 클래스를 사용합니다. 그러나이 클래스에는 슬라이스 기능이 없습니다. Java의 String 객체에 대해 슬라이스 함수를 사용할 때 Scala Compiler는 내부적으로 이 String 객체를 StringOps 클래스 객체로 변환하여 이 슬라이스 함수를 사용합니다. (슬라이스 함수 뿐만 아니라 더 많은 정보가 있습니다. 자세한 내용은 Scala API를 참조하십시오.) 즉 "StringOps\는 String 클래스의 암시적 클래스입니다. 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를 의미합니다(배타적이므로 index = 8까지만 고려해야 합니다).
scala> str.substring(6,9)
res12: String = I'm
여기서 str.slice(6,9)와 str.substring(6,9)은 모두 같은 값을 반환합니다. 슬라이스 Vs 하위 문자열 String 클래스의 슬라이스와 하위 문자열 함수의 차이점
- 기능 및 구문 측면에는 차이가 없습니다.
- 성능은 거의 비슷하고 무시할 수 있습니다.
참고:- 스칼라에서는 아래와 같이 배열 요소처럼 문자열 문자에 액세스할 수 있습니다.
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
참고:- 범위를 벗어난 문자열 문자에 액세스하려고 하면 위와 같이 StringIndexOutOfBoundsException이 발생합니다. String의 문자 액세스는 Char를 반환하고 하위 문자열 및 슬라이스 함수는 아래와 같이 String을 반환합니다.
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
"Scala의 슬라이스 함수\ 사용에 대한 모든 것입니다. 다음 게시물에서 더 많은 Scala 개념에 대해 논의할 것입니다. 참조: Scala API Doc