[scala] method 와 function의 차이

오현우·2022년 9월 11일
0

Eta expansion

스칼라에서 공식 독스를 찾아보면 아래와 같은 형태가 많이 보인다.

def map[B](f: (A) => B): List[B]

위의 경우는 f에 함수를 넣어야 하는데 method를 넣어도 정상적으로 수행이 된다.

구체적으로 아래와 같다.

def time10(i: Int) = i * 10 // 이부분이 메소드
List(1, 2, 3).map(times10) // List(10, 20, 30) 이 출력될 것이다.

이러한 작업이 동작하는 이유는 에타 익스펜션덕분이다. 이것은 모든 메소드 타입을 함수 타입으로 바꿔줘 모든 동작들을 매끄럽고 탈없게 만들어준다.

이러한 것들이 직접적으로 와 닿지 않을 수 있다.

그렇다면 먼저 함수와 메소드의 차이를 알아보자.

메소드와 함수의 차이

전통적으로 메소드는 클래스의 한 부분으로 정의되어 있지만, 스칼라는 와부나 최상위 레벨에서도 정의할 수 있다.

이와 달리 함수는 완전한 오브젝트 자체이며 그것들을 첫번째 클래스 엔티티로 만든다.

문법 자체도 다른데 아래를 보면 더욱 이해하기 쉽다.

def isEvenNethod(i: Int) = i % 2 == 0 // method
val isEvenFunction = (i: Int) => i % 2 == 0 // function

함수의 경우 하나의 객체로 변수로 정의되어 있어서 리스트 내부에 넣어도 정상적으로 동작한다.

val fuctions = List(isEvenFunction)

그러나 메소드의 경우는 기술적으로 오브젝트가 아니며, 스칼라 2 까지는 리스트에 넣을 수 없었다.

때문에 우리는 위의 메소드를 함수로 일일히 변환해줬어야 했는데 스칼라 3에 오면서 에타 변환이 도입이 되면서 가능하게 되었다.

결론

스칼라 3으로 오면서 메소드와 함수의 경계가 많이 사라졌다.
그럼에도 불구하고 스칼라 2를 사용하는 곳이 많으므로 메소드와 함수의 차이를 알아 놓는 것은 매우 중요하다.

profile
핵심은 같게, 생각은 다르게

0개의 댓글