-
Notifications
You must be signed in to change notification settings - Fork 36
13장 packages and imports
nephilim edited this page Nov 12, 2011
·
9 revisions
one way to minimize coupling is to write in a modular style.
- inside of module: implementation
- outside of module: interface
- scala도 자바와 마찬가지로 package 구조를 가짐. 자바와 동일하게
package
키워드 사용함. - c#과 유사하게
packaging
이라는 문법도 제공함.
package a {
package b {
class A
package test {
class ATest
}
}
}
- 파일 내의 모든 코드를 맨 윗 줄에 적힌 패키지 안에 넣는 방법
package a.b
class A
Listing 13.1 - Placing the contents of an entire file into a package.
- C# namespaces과 유사한 방법
package a.b {
class A
}
Listing 13.2 - Long form of a simple package declaration.
13.2에서 보여주는 패키징 방법은 13.1의 코드와 같은 효과를 냄.
- java는 import만 쓸 수 있는 것과 달리 요상한 방법을 제공함. Listing 13.4 참고. 근데 이런 방법을 쓰는 게 좋을까?
- 이런 방식은 package를 nesting해서 쓸 때만 가능함.
- java 스타일로 작성한다면 java와 동일. (같은 package일 경우에만 패키지 명 생략 가능)
- 요상한 방법
- 동일 package의 class는 그냥 접근 가능
- 자기를 포함하고 있는 package 명은 생략 가능 ex) a.C1 클래스는 a.b.C2 클래스를 b.C2 로 참조 가능함
- curly brace packaging syntax를 쓸 경우 packaging 외부에서 접근 가능한 대상은 그냥 접근 가능함
- nesting package에서 top level package를 참조할 땐
_root_
를 사용함. Listing 13.6 참고. 난 그냥 안쓸래~
- class 와 package 의 축약된 접근법
package a {
package b {
class B {
// No need to say a.b.B2
val b2 = new B2
}
class B2
}
class A {
// No need to say a.b.B
val b = new b.B
}
package c {
class C {
// No need to say a.A
def d() { new A }
}
}
}
Listing 13.4 - Concise access to classes and packages
- 숨겨진 패키지 명에 접근
// In file b.scala
package b {
class B
}
// In file a.scala
package a {
package b {
package c {
class C
}
class B {
val c = new c.C
val a = new a.b.A
val b = new _root_.b.B
}
}
package b {
class B
}
}
Listing 13.6 - Access hidden package names.
- java에서 * 만 _ 로 바꾼 듯 하지만, static import가 따로 구분이 없음
import C1 //single type import
import a._ // on-demand import. in scala, * is also identifier.
import a.C1._ //static import
- VB의 with와 비슷한 용도의 import도 가능함. List 13.8
def showFruit(fruit:Fruit) {
import fruit._
println(name) // println(fruit.name)
}
- scala의 import는 java의 import보다 유연함
- 코드 아무데나 출현 가능
- 패키지 import 가능
import java.util.regex //package import
class A { val a = regex.Pattern.compile("a*b"); } //don't need to write java.util.regex
* select 해서 import 가능, rename도 가능
import Fruits.{Apple=>McIntosh, Orange}
import Fruits.{Apple=>McIntosh,_} // rename member
import Fruits.{Pear=>_,_} // all member excludes Pear
###kingori
- 기본적으로 import 되는 패키지: java.lang., scla., Predef._
- Predef object는 type, method, implicit conversion 등을 담고 있음
- 동일 클래스라면 scala가 java.lang에 우선함. ex) scala.StringBuilder > java.lang.StringBuilder
###kingori
-
private
과protected
만 있음. 아무것도 안 쓰면 public. java와 다른 점이 있음! (좀 더 제약적임) - private
- java에선 enclosing class는 enclosed class의 private member에 접근 가능하지만 scala는 안됨. Listing 13.10
- 물론 enclosed class는 enclosing의 private member에 접근 가능함
- protected
- protected member는 subclass만 접근 가능함. java에선 같은 package에선 노출이 되어 있었음.
- modifier에도 qualifier를 붙일 수 있다. private[X], protected[X] : X 내부에선 public, X 외부에선 private/protected
- 이를 이용해 java의 package private, package protected를 흉내낼 수 있다.
- private[this] 도 가능!
- class와 companion object는 동일한 접근 권한을 가짐.
- companion object의 protected member는 의미 없음: singleton object는 하위 클래스를 가질 수 없으므로
###kingori
- package object라는 것도 있군. action script엔 package function이 있었던 것으로 기억...
- package 당 하나만 가질 수 있음
package object aaa {
def bbb() { println("b");}
}
- package-wide type alias, implicit conversion
- package level의 utility class (like Arrays ?)
-
scala
패키지도 package object를 갖고 있음 - package.class로 컴파일 됨. 따라서 일관성을 위해 소스 파일도 가급적 package.scala에 저장하는 것을 권장.
- pakage object 는 Scala 2.8에서 도임
- Package Object 소개 문서 by Martin Ordersky
###kingori
skip