Scala

Java와 Scala를 비교하였을 때 표현, 문법 등에서 대표적으로 다른 점을 정리하였습니다.

1. Scala는 순수한 객체지향적 언어이다.

Java에서는 기본적인 타입과 참조 가능한 타입이 분리되어 있지만,

scala는 숫자와 함수를 포함한 모든 것이 객체이다.

1 + 2 * 3

사실 이 표현식은

1.+(2.*(3))

함수 호출로만 이루어져있다.

위처럼 +, * 는 scala에서의 식별자가 된다.

2. 하나의 인자를 가지는 함수는 이항연산자처럼 표현

위에서의 +, * 의 경우와 같이, 다른 함수들도 하나의 인자를 가질 경우에, 이항연산자처럼 표현이 가능하다.

Thread.sleep(1000)

이 경우에는 다음과 같이 표현 할 수 있다.

Thread sleep 1000

3. 인자 없는 함수

class A(x: Double, y: Double) {
  def a() = x
  def b() = y
}

위의 코드에서 a와 b에 접근할 때에는 아래와 같이 괄호를 붙혀줘야 한다.

val a = new A(1.2, 3.2)
println(a.a())

필드인 것처럼 빈 괄호를 붙히지 않고 접근하려면 다음과 같이 바꿀수 있다.

class A(x: Double, y: Double) {
  def a = x
  def b = y
}

이러한 함수는 정의할때도 사용할 때도 빈 괄호를 붙히지 않는다.

4. 상속과 재정의

모든 클래스들은 항상 상위 클래스로부터 상속된다. 만약 상위 클래스가 존재하지 않을 경우에는scala.AnyRef 를 상속한다.

상위 클래스의 함수를 오버라이드 할 때에는 다음과 같이 선언한다.

override def toString() = ""

5. 트레잇(trait)

클래스는 상속을 받는 것 뿐만 아니라, 트레잇에서 코드를 불러 올 수 있다.

Java에서는 비교 가능한 객체들이 Comparable 인터페이스를 구현하게 된다.

하지만 Scala에서는 다음과 같이 우아하게 표현할 수 있다.

trait Ord {
  def < (that: Any): Boolean
  def <= (that: Any): Boolean = (this < that) || (this == that)
  def > (that: Any): Boolean = !(this <= that)
  def >= (that: Any): Boolean = (this < that)
}