[Scala] Generic

smlee·2023년 10월 24일
0

Scala

목록 보기
37/37
post-thumbnail

이 글은 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인 것이다. 이는 제네릭으로, 원하는 데이터 타입을 넣을 수 있다. 따라서 같은 로직에 대하여 재사용성을 높일 수 있다.

0개의 댓글