본문 바로가기

SCALA

[Scala] 자바프로그래머를 위한 Scala - 작성중


첫 번째 예제
object 선언은 싱글턴 객체를 생성하는데, 이는 하나의 인스턴스만을 가지는 클래스라 할 수 있다. 
예제에서 main 함수는 static이 아니다. Scala에는 정적멤버(함수든 필드든)라는 개념이 아얘 존재하지 않는다. 클래스의 일부로 정적 멤버를 정의하는 대신에 Scala 프로그래머들은 정적이기 원하는 멤버들을 싱글턴 객체 안에 선언한다.



자바와 함께 사용하기

첫번째 줄과 같이 중괄호를 사용하면 같은 패키지에서 여러개의 클래스를 선택적으로 불러 올 수 있다.
Scala 임포트 구문의 또 한가지 특징은 패키지나 클래스에 속한 모든 이름들을 불러 올 경우 별표(*)대신 밑줄(_)을 사용한다는 것이다. 별표는 Scala에서 합법적인 식별자(함수명 등에 사용 가능한)로 사용된다.
따라서 세번째 줄의 임포트 구문은 DateFormat 클래스의 모든 멤버를 불러온다. 이렇게 함으로써 정적 함수 getDateInstance와 정적 필드 LONG이 바로 사용 가능하게 된다.

마지막 줄은 Scala 문법의 재미있는 특성을 보여준다. 오직 하나의 인자를 갖는 함수는 마치 이항연산자 같은 문법으로 호출이 가능하다. 
df format now == df.format(now)

모든 것은 객체다

함수마저 객체다
1. 함수에 함수를 인자로 넘기거나, 
2. 함수를 변수에 저장하거나, 
3. 함수가 함수를 리턴하는 것도 가능하다. 
이처럼 함수를 값과 동일하게 다루는 것은 매우 흥미로운 프로그래밍 패러다임인 함수형 프로그래밍의 핵심요소 중 하나이다.

아래 프로그램에서 타이머 함수의 이름은 oncePerSecond이다. 이 함수는 콜백 함수를 인자로 받는다. 인자로 받는 함수의 타입은 () => Unit 인데, 이 타입은 인자를 받지 않고 아무것도 돌려주지 않는 모든 함수를 뜻한다(Unit 타입은 C/C++에서 void와 비슷하다). 


이름없는 함수

이 프로그램은 이해하기 쉽지만 조금 더 다듬을 수도 있다. 함수 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 지시자를 꼭 적어주어야 한다. 











출처 - http://ddoong2.com/771 

자바 프로그래머를 위한 스칼라 튜토리얼


'SCALA' 카테고리의 다른 글

Scala - apply 함수는 무슨 일을 하는 것일까?  (0) 2013.05.21
함수적 프로그래밍의 장점  (0) 2013.05.06