이 글은 Manning Functional Programming in Scala의 2.5절 Polymorphic functions를 읽고 작성한 글입니다.
Manning Functional Programming in Scala
책에서 이전까지의 챕터에서는 단일형, 즉 동형 함수들에 대해서 정리했었다. 하지만, 제네릭을 사용한다면 타입 역시 추상화시켜 다양한 타입에 대해 동일한 로직을 갖는 함수를 작성할 수 있다.
만약 어떠한 배열 내에서 해당 원소가 있는지 확인하고 만약 해당 원소가 존재한다면 해당 원소의 인덱스를 리턴한다. 만약 존재하지 않는다면, -1을 리턴하는 함수를 작성한다.
def findFirst(arr:Array[String], key: String): Int = {
@annotation.tailrec
def loop(n:Int):Int = {
if(n >= arr.length) -1
else if(arr[n] == key) n
else loop(n+1)
}
loop(0)
}
위와 같은 형태의 코드로 작성될 것이다. 그런데 굳이 String
타입이 아니어도 다른 모든 타입에 대해 로직이 변하지 않을 것이다. 이렇게 된다면, 데이터 타입을 추상화하는 것이 좋을 것이다.
def findFirst[A](arr: Array[A]: p: A=> Boolean):Int = {
@annotation.tailrec
def loop(n:Int): Int =
if(n >= arr.length) -1
else if(p(arr[n])) n
else loop(n+1)
loop(0)
}
p
는 match를 찾는 함수이다. 이때 눈에 띄는 점은 데이터 타입이 A
인 것이다. 이는 제네릭으로, 원하는 데이터 타입을 넣을 수 있다. 따라서 같은 로직에 대하여 재사용성을 높일 수 있다.