스터디에서 Scala의 import문에 대한 질문이 나와서 메일링에서 오간 의견을 바탕으로 테스트를 해보면서 관련내용을 약간 정리했습니다. Scala의 import문은 자바와 유사하지만 약간 다른 점들이 있습니다.
Scala에서는 기본적으로 다음 3가지를 자동적으로 임포트 합니다.
- java.lang
- scala
- scala.Predef
그리고 \* 대신에 _ 를 씁니다.
1
2
|
// in Java
import java.util.*;
|
1
2
|
// in Scala
import java.util._
|
같은 팩키지의 여러 클래스를 임포트 할때는 하나로 묶을 수 있습니다.
1
2
3
4
|
// in Java
import java.util.Date;
import java.util.Collection;
import java.util.List;
|
1
2
|
// in Scala
import java.util.{Date, Collection, List}
|
임포트 하면서 다른 이름으로 변경할 수도 있습니다.
1
2
3
|
// in Scala
import java.util.{Collection => Coll}
// Coll을 사용합니다.
|
또한 Static 메서드와 변수에 접근하기 위해서 사용하는 자바5의 import static은 import문으로 동일하게 사용합니다.
1
2
3
4
5
6
7
8
|
// A.scala
package Test
class A {
def methodA() {
println("in methodA")
}
}
|
1
2
3
4
5
6
7
8
9
|
// B.scala
package Demo
import Test.A
object B extends App {
val a = new A
a.methodA()
}
|
1
2
3
|
$ scalac A.scala B.scala
$ scala B
in methodA
|
일반적인 import의 사용입니다. B 오브젝트에서 A 클래스를 임포트해서 객체를 생성하고 A 클래스의 메서드를 실행합니다. 컴파일하고 실행하면 정상적으로 출력이 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
// A.scala
class A {
def methodA() {
println("in methodA")
}
}
object A {
def methodB() {
println("it's static method")
}
}
|
1
2
3
4
5
6
|
// B.scala
import A.methodB
object B extends App {
mehtodB()
}
|
1
2
3
|
$ scalac A.scala B.scala
$ scala B
it's static method
|
A 클래스의 companion object를 생성해서 static 메서드 methodB를 정의하였습니다. 그리고 B.scala에서 이 static 메서드를 static import하고 호출하였습니다. 정상적으로 static 메서드라 실행되었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
// C.scala
import A.methodB
object C extends App {
def doSomething(a: A) {
import a.methodA
methodA()
methodB()
}
doSomething(new A)
}
|
1
2
3
4
|
$ 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를 사용합니다.

Comments