ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 프로그래머를 위한 Scala 따라해 보기 #1
    기술 관련/Scala 2021. 1. 12. 16:06

    시간이 좀 지나긴 했지만 한동안 놓고 있었던 Java 프로그래밍에 대해 볼 수 있는 기회가 생겼다. 하는 김에 함수형 언어인 Scala도 공부해 보고 싶어서 자료를 찾아 보았더니 이런 글이 있어 하나씩 해 보면서 참고하려고 한다.


    docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html

     

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

    Michel Schinz, Philipp Haller 지음. 이희종 (heejong@gmail.com) 옮김. 시작하면서 이 문서는 Scala 언어와 그 컴파일러에 대해 간단히 소개한다. 어느 정도의 프로그래밍 경험이 있으며 Scala를 통해 무엇을 할

    docs.scala-lang.org

    참고로, 실습 측면에서 repl.it/ 을 이용하면 온라인 웹을 통해서도 코드를 작성하고 동작을 확인해 볼 수 있다. 다만, Scala의 경우는 beta 서비스로 제공하고 있다.

     

    다음은 기본으로 제공하는 Hello World 예제다.

    object Main {
      def main(args: Array[String]): Unit = {
        println("Hello world!")
      }
    }
    

     

    일단 눈에 띄는 특징으로 Java 클래스를 시작하는 method인 static main 함수가 없다. 또한 파일 확장자가 .java가 아니라 .scala이며 컴파일도 javac가 아닌 scalac로 한다.

     

    아니 뭐 이 정도면 그냥 다른 언어 아닌가? 라고 생각 할 수 있다. 그렇다 하더라도 scalac로 컴파일된 변환된 결과물은 Java Class 형태가 되며 결국 JVM에서 실행 가능하다. Java VM에서 실행되는 결과물을 프로그래밍 언어인 Java와 다른 모습을 가지는 경우가 좀 신기하기도 하지만, C나 JavaScript와 같은 다른 언어들도 결국 Machine 위에서 실행되는 Runnable을 만들어내는 것이니 너무나도 이상한 상황은 아니긴 하다.

     

    Scala는 OOP(Object Oriented Programming) 뿐만 아니라 FP(Functional Programming) 도 가능하도록 지원하는 것이 큰 특징이라고 볼 수 있다. 최근 Java8의 경우는 Funtional Interface가 포함되며 함수형 언어의 특징을 어느 정도 수용하는 형태가 되었지만, Scala의 자유도를 넘지는 못하는지라 기존 Scala 사용자들은 그대로 이어나가고 있다. 약간 EJB vs Spring의 느낌도 들긴한다.

     

    다시 튜토리얼로 돌아와 보자. scalac로 컴파일을 하고 나면 이렇게 Main 클래스가 생성되어 있는 것을 볼 수 있다.

     

    결과적으로는 Scala든 Java든 Class라는 형태가 되는 것을 확인 할 수 있다. 이 때문에 Scala의 코드에서 기존 Java 코드로 작성된 훌륭한 라이브러리를 그대로 사용 할 수 있으며, Scala로 작성된 코드도 Java 코드에 호출하여 사용 할 수 있다.

     

    그렇다면, 과연 정말 그렇게 되는지 확인해 볼 차례다.

     

    먼저, Scala에서 java.util 패키지의 클래스를 호출하는 예제를 따라해 보자

    Scalac로 만들어진 클래스와 Javac로 만들어진 클래스 결국은 JVM에서 실행되는 클래스다

    Scala로 만들어진 코드는 scalac 명령으로 컴파일 할 수 있다. FrenchDate라는 클래스를 만들어내는 소스 코드의 French.scala FrenchDate가 정의되어 있으며 scalca로 컴파일하면, FrenchDate.class가 생성되는 것을 볼 수 있다. 이는 Scala가 가진 특징으로 Source에 정의된 Object를 기반으로 Class를 생성하기 때문이다. 

     

     

    그리고, Scala에서 외부 클래스를 import 할 때 해당 패키지의 모든 클래스를 가져올 때 문자가 Java와 다르다. Java는 '*' 문자(asterisk)를 이용하지만, Scala는 '_' 문자 (underbar)를 사용한다. Scala에서는 '*' 문자가 식별자로 인식하기 때문이라는데 관련 부분은 나중에 다시 살펴보아야겠다.

     

    소스 코드를 보면 df format now 라는 부분을 볼 수 있다. 이 표현과 동일한 표현은 다음과 같다.

    df.format(now)

     

     

    Scalar에서는 함수 호출 할 때 기본적으로 Java의 호출 방식을 따르지만 추가적으로 정의된 표기법이 있다. parameter가 1개 이하인 경우 점과 괄호를 생략하여 표기 할 수 있다. 이를 Infix notation이라고 한다. 모든 method에 대해 적용하는 것은 아니지만 코드 입력을 줄여 업무 효율이 높아질 수 있겠다는 생각이 든다.  이 부분은 메소드 호출 부분에서 다시 살펴볼 기회가 있을 듯 하다.

     

    튜토리얼에는 없는 내용이긴 한데 Java에서 Scala를 불러 쓸 때는 어떻게 할까?

     

    MyTest.java 파일을 다음과 같이 생성하고 

    public class MyTest {
      public static void main(String[] args) {
        System.out.println("Hello, World");
      }
    }

    repl.it의 Shell 화면에서 javac Test.java 명령을 실행하면 Java 코드가 컴파일되어 MyTest.class가 생성되는 것을 볼 수 있다. 

    참고로, Scala 환경을 구성하면 JDK가 필수 설치요건이므로 java와 javac 를 호출 할 수 있다.

    그럼 이제 Scala에서 만든 Object를 호출해 보자.

     

    public class MyTest {
      public static void main(String[] args) {
        System.out.println("Hello, World");
        KoreanDate.main(args);
      }
    }

    그리고 Shell에서 javac MyTest.java 그리고 java MyTest 명령으로 실행하면 다음과 같이 오류가 발생한다.

     

    Scala 라이브러리가 없기 때문인데 이를 위해 다음 명령으로 실행하면 정상 동작하는 것을 볼 수 있다

    java -cp /usr/local/lib/scala-library.jar:. MyTest

     

    그도 그럴것이 Scala로 만들어진 클래스가 Java로 만들어진 클래스에  1:1로 대응되는 것이 아니므로 관련 Library가 Classpath에 있어야 정상적으로 실행된다.

    댓글

Designed by Tistory.