2015. 5. 28. 14:39ㆍProgramming/Scala
Package
자바, C#과 마찬가지로 Scala에서도 namespace 격인 package가 존재한다.
Scala에서는 아래와 같은 3가지 방법으로 package를 선언하고 사용할 수가 있다.
자바에서의 package 사용 용법
1. 자바와 비슷한 형태
package com.jufactory
class factory1
2. C#과 비슷한 형태
package com.jufactory {
class factory1
}
3. 중첩 형태
package com {
package jufactory {
class factory1
package otherfactory{
class factory2
}
}
}
만약에 아래와 같은 중첩 코드라면 package의 scope가 어떻게 될까??
package com {
class Factory1
}
package net {
package test {
package com {
class Factory2
}
class Create {
val factory1 = new _root_.com.Factory1
val factory2 = new com.Factory2
val factory3 = new net.test.com.Factory3
}
}
package com {
class Factory3
}
}
위의 코드는 개념을 설명하기 위한 예시이며, 이렇게 짜지는 말자... (너무 모호함)
우선 Create 클래스를 보자. Create 클래스에서 Factory3 객체를 생성하고 싶다면 어떻게 할까?? Factory3은 쉽다. net.test.com.Factory3이라고 명확히 명시해 주면 된다.
Factory2는 어떨까?? com.Factory2라고 하면 현재 패키지 경로를 기준으로 그 하위의 com.Factory2를 찾게 된다.
그럼 최상위 package인 Factory1에 접근하기 위해서는 어떻게 해야 할까??
Scala에서는 모든 최상위 패키지를 _root_ 패키지의 맴버로 취급한다. 하여, _root_.com.Factory1이라고 하면 최상위 패키지의 경로에 접근할 수가 있다.
Import
패키지와 그 안에 있는 맴버는 import를 통해 가져올 수 있다. Scala import는 자바와는 다르게 import 맴버의 범위를 정할 수가 있다.
import Factory.{Factory1, Factory2}
위의 예제는 Factory 객체 내에서 Factory1과 Factory2의 맴버만 접근할 수 있다.
또한 import한 객체의 맴버 이름을 바꿀수가 있는데 그 방법은 아래와 같다.
import Factory.{Factory1 => F1, Factory2}
Factory 내의 Factory1과 Factory2를 가져오는데 Factory1의 이름은 F1로 변경해서 가져온다. 사용자가 Factory1에 해당하는 함수를 사용할때에는 F1.xxx() 이런 식으로 접근하면 된다.
import Factory._
_로 호출하면 Factory내의 모든 맴버를 가져올 수 있다.
import Factory.{Factory1 => _, _}
Factory 내에 있는 변수를 가져오는데, Factory1만 빼고 가져오고 싶을 때는 위와 같이 사용한다. '<이름> => _' 형태는 어떤 맴버를 제외시킬 때 사용한다.