최근부터 스칼라에 관심이 생겨 스칼라에 대해서 공부 중이다.

간단한 예시를 통해 살짝 살펴보자.

본격적으로 다루는 건 차후에 별도의 포스트를 통해 문법을 살펴보도록 하겠다.
FPIS 책을 이용하여 공부하고 있다보니 간단히 살펴본다

이 장에서는 문법을

  object MyModule {
    def abs(n: Int): Int =
      if (n < 0) -n
      else n


    private def formatAbs(x: Int) = {
      val msg = "The absolute value of %d is %d"
      msg.foramt(x, abs(x))
    }

    def main(args: Array[String]): Unit =
      println(formatAbs(-42))
  }

위의 예제를 자바로 표현하면 다음과 같다

  class MyModule {
    public int abs(int n) {
      if(n < 0) return -n;
      else return n;
    }

    private String formatAbs(int x) {
      return String.format("The absolute value of %d is %d", x, abs(x));
    }

    public static void main(String[] args) {
      System.out.println(formatAbs(-42));
    }
  }

과 비슷하다고 할 수 있다.

다만 scalaobjectjavaclass와는 의미가 다르다

object Keyword를 java에서 찾아보자면 singleton pattern과 유사하다.

object keyword는 singleton 형식을 생성하기 때문이다.

혹은 static과 유사하다고 봐도 될 것이다.

클래스로 비교를 하자면,

anonymous class(익명 클래스)와 유사하다

고 봐도 될 것이다.

자 그럼 하나 하나 뜯어보자.

    def abs(n: Int): Int =
      if (n < 0) -n
      else n

이 메서드를 보면,

def abs(n: Int): Int = 는 다음과 같은 형식이다.

def 함수이름(argument name : argument type): return type =

= 등호 뒤에 메서드의 본문이 나온다.

명명하기로 등호 왼쪽에 있는 것

즉, def abs(n: Int): Int 이 부분을 좌변(left-hand side) 또는 서명(signature)라고 한다.

scala에는 명시적인 return keyword가 없기 때문에 우변 즉 메서드 본문의 평가 결과가 메서드의 반환(return)값이다.

다음 메서드를 살펴보자.

    private def formatAbs(x: Int) = {
      val msg = "The absolute value of %d is %d"
      msg.foramt(x, abs(x))
    }

이 메서드를 보면 return type이 지정되어 있지 않다.

스칼라가 메서드의 반환 형식을 추론할 수 있는 경우일 때는 반환 형식을 생략할 수 있다.

또,

private 이므로 type을 생략해도 된다.

그래서 return type이 없다.

그러나 이 메서드를 보면 뭘 리턴할지는 바로 추론이 가능하다.

이 함수는 순수함수이다.

여기서 val을 이용해 변수를 선언하고 있는데 Javafinal과 같다고 봐도 될 것 같다.

scala에서 val은 불변이 변수를 말한다.

    def main(args: Array[String]): Unit =
      println(formatAbs(-42))

자 마지막 main 메서드이다.

main 메서드는 부수효과가 있기 때문에 순수함수가 아니다.

순수함수가 아닌 함수를 불순함수라고 한다.

그리고 main은 잘 알겠지만 특별하다.

Java에서는 public static void가 있어야 한데 scala도 동일하다.

scala에서는 def main(args: Array[String]): Unit 형태여야 한다.

UnitJava에서 void와 비슷한 용도이다.

Unit은 값을 ()와 같이 빈 괄호가 쌍으로 있는 리터럴을 리턴해주고 ‘유닛’ 혹은 ‘단위’라고 칭한다.

통상적으로 Unit이 반환형식일경우 메서드가 부수효과가 있는 메서드임을 알린다.

앞에서도 말했지만 scala의 문법은 나중에 자세히 다뤄보도록 하겠다.