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

  • privateprotected만 있음. 아무것도 안 쓰면 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

13.7 Conclusion

###kingori

skip