Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Scala의 import문에 대해서...

스터디에서 Scala의 import문에 대한 질문이 나와서 메일링에서 오간 의견을 바탕으로 테스트를 해보면서 관련내용을 약간 정리했습니다. Scala의 import문은 자바와 유사하지만 약간 다른 점들이 있습니다.

Scala에서는 기본적으로 다음 3가지를 자동적으로 임포트 합니다.

  • java.lang
  • scala
  • scala.Predef
그리고 * 대신에 _ 를 씁니다.

// in Java
import java.util.*;


// in Scala
import java.util._


같은 팩키지의 여러 클래스를 임포트 할때는 하나로 묶을 수 있습니다.

// in Java
import java.util.Date;
import java.util.Collection;
import java.util.List;


// in Scala
import java.util.{Date, Collection, List}


임포트 하면서 다른 이름으로 변경할 수도 있습니다.

// in Scala
import java.util.{Collection => Coll}
// Coll을 사용합니다.

또한 Static 메서드와 변수에 접근하기 위해서 사용하는 자바5의 import static은 import문으로 동일하게 사용합니다.

// A.scala
package Test

class A {
  def methodA() {
    println("in methodA")
  }
}


// B.scala
package Demo

import Test.A

object B extends App {
  val a = new A
  a.methodA()
}



$ scalac A.scala B.scala
$ scala B
in methodA



일반적인 import의 사용입니다. B 오브젝트에서 A 클래스를 임포트해서 객체를 생성하고 A 클래스의 메서드를 실행합니다. 컴파일하고 실행하면 정상적으로 출력이 됩니다.


// A.scala
class A {
  def methodA() {
    println("in methodA")
  }
}

object A {
  def methodB() {
    println("it's static method")
  }
}



// B.scala
import A.methodB

object B extends App {
  mehtodB()
}



$ scalac A.scala B.scala
$ scala B
it's static method



A 클래스의 companion object를 생성해서 static 메서드 methodB를 정의하였습니다. 그리고 B.scala에서 이 static 메서드를 static import하고 호출하였습니다. 정상적으로 static 메서드라 실행되었습니다.




// C.scala
import A.methodB



object C extends App {
  def doSomething(a: A) {
    import a.methodA
    methodA()
    methodB()
  }
  doSomething(new A)

}


$ scalac A.scala B.scala
$ scala B
in methodA
it's static method




여기서 더 나아가 Scala는 static 메서드가 아닌 경우에도 static import를 할 수 있는데 위 코드가 그 예제입니다. C 오브젝트를 정의하여 앞서 정의한 A 클래스를 사용하였습니다. static 메서드인 methodB의 사용은 동일한데 보는 것처럼 doSomething에서 A 객체를 파라미터로 받아서 그 안에서 이 객체를 static import하면 그 다음부터는 리시버없이 static 메서드처럼 메서드를 호출할 수 있습니다.


추가적으로 REPL에서 현재 import된 클래스를 확인하고 싶으면 :import를 사용합니다.

REPL에서 import되 리스트를 확인한 화면
2011/09/02 02:26 2011/09/02 02:26