자바와 함께 사용하기
이름없는 함수
이 프로그램은 이해하기 쉽지만 조금 더 다듬을 수도 있다. 함수 timeFiles는 오직 함수 oncePerSecond에 인자로 넘겨지기 위해 정의 되었다는 것에 주목하자. 이러한 한번만 사용되는 함수에 이름을 붙여 준다는 것은 필요 없는 일일 수 있다. 더 행복한 방법은 oncePerSecond에 함수가 전달되는 그 순간 이 함수를 생성하는 것이다. Scala에서 제공하는 무명함수를 사용하면 된다.
main 함수 안에 오른쪽 화살표 => 가 있는 곳이 무명함수이다. 오른쪽 화살표는 함수의 인자와 함수의 내용을 분리 해주는 역할을 한다.
클래스에 대하여
Scala의 클래스 정의는 Java의 클래스 정의와 유사하다. 한가지 중요한 차이점은 Scala클래스의 경우 파라미터들을 가질 수 있다는 것인데 아래 복소수 예제에 잘 나타나 있다.
이 복소수 클래스는 두개의 인자를 받는다. 하나는 복소수의 실수 부분이고 다른 하나는 복소수의 허수 부분에 해당하든 값이 된다. 이 인자들은 Complex 클래스의 인스턴스를 생성할 때 이처럼 반드시 전달 되어야 한다. new Complex(1.2, 2.3) 클래스는 re와 im라는 두 함수를 가지고 있는데 각각의 함수를 통해 복소수를 구성하는 해당 부분의 값을 얻을 수 있다.
이 두 함수의 리턴타입은 명시적으로 나타나 있지 않다는 사실에 주목하자. 컴파일러는 이 함수들의 오른편을 보고 둘 다 Double 타입을 리턴 한다고 자동으로 유추해 낸다.
하지만 컴파일러가 언제나 이렇게 타입을 유추해 낼 수 있는 것은 아니다. 그리고 불행하게도 어떤 경우 이러한 타입 유추가 가능하고 어떤 경우 불가능 한지에 관한 명확한 규칙도 존재하지 않는다. 일반적으로 이러한 상황은 별 문제가 되지 않는다.
인자없는 함수
함수 re와 im의 사소한 문제는 그들을 호출하기 위해 항상 뒤에 빈 괄호를 붙여 주어야 한다는 것이다.
실수 부분과 허수 부분에 접근 할 때에 마치 그들이 필드인 것 처럼 함수 마지막에 빈 괄호를 붙이지 않을 수 있다. 그저 인자를 제외하고 함수를 정의하면 된다. 이런 종류의 함수는 인자가 0개인 함수와는 다른데, 인자가 0개인 함수는 빈 괄호가 따라 붙는 반면 이 함수는 정의 할 때도 이름 뒤에 괄호를 붙이지 않는다.
상속과 재정의
모든 Scala의 클래스들은 항상 상위 클래스로부터 상속된다. 만약 Complex 예제처럼 상위 클래스가 존재하지 않을 경우는 묵시적으로 scala.AnyRef를 상속한다.
Scala에서는 물론 상위 클래스에 정의된 함수를 오버라이드 하는 것도 가능하다. 그러나 의도하지 않는 실수를 방지하기 위하여 다른 함수를 오버라이드 하는 함수는 override 지시자를 꼭 적어주어야 한다.
자바 프로그래머를 위한 스칼라 튜토리얼
'SCALA' 카테고리의 다른 글
Scala - apply 함수는 무슨 일을 하는 것일까? (0) | 2013.05.21 |
---|---|
함수적 프로그래밍의 장점 (0) | 2013.05.06 |