13장 packages and imports - codeport/scala GitHub Wiki
13.0
kingori
one way to minimize coupling is to write in a modular style.
- inside of module: implementation
- outside of module: interface
nephilim
13.1 Putting code in packages
kingori
- scala도 자바와 마찬가지로 package 구조를 가짐. 자바와 동일하게 package키워드 사용함.
- c#과 유사하게 packaging이라는 문법도 제공함.
    package a {
       package b {
           class A
           package test {
               class ATest
           }
       }
    }
daclouds
- 파일 내의 모든 코드를 맨 윗 줄에 적힌 패키지 안에 넣는 방법
    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의 코드와 같은 효과를 냄.
13.2 Concise access to related code
kingori
- 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 참고. 난 그냥 안쓸래~
daclouds
- 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.
13.3 Imports
kingori
- 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
13.4 Implicit imports
###kingori
- 기본적으로 import 되는 패키지: java.lang., scla., Predef._
- Predef object는 type, method, implicit conversion 등을 담고 있음
 
- 동일 클래스라면 scala가 java.lang에 우선함. ex) scala.StringBuilder > java.lang.StringBuilder
13.5 Access modifiers
###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는 하위 클래스를 가질 수 없으므로
 
13.6 Package objects
###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에 저장하는 것을 권장.
nephilim
- pakage object 는 Scala 2.8에서 도임
- Package Object 소개 문서 by Martin Ordersky
13.7 Conclusion
###kingori
skip