관리 메뉴

HAMA 블로그

스칼라 강좌 (30) - type projection ( # 에 관하여) 본문

Scala

스칼라 강좌 (30) - type projection ( # 에 관하여)

[하마] 이승현 (wowlsh93@gmail.com) 2016. 12. 6. 23:26


Type projection


개요:

타입 안의 (nested) 타입 멤버를 레퍼런싱 하기 위한 문법이다.
T#x 라고 지칭하며, 타입 T 안의 x 라는 이름의 타입 멤버를 나타낸다.


예제: 


아래에 보면 클래스 내부에 또 하나의 클래스 (nested class) 가 있는 것을 볼 수 있다.

class A {
  class B

  def f(b: B) = println("Got my B!")
}

 아래와 같이 시도해보면 

scala> val a1 = new A
a1: A = A@2fa8ecf4

scala> val a2 = new A
a2: A = A@4bed4c8

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

클래스 내부의 클래스를 정의하는데 A.B 는 안되며,  a1.B 와 a2.B 로 정의하는데, 보는 바와 같이 a1 과 a2 각각 가지고있는 class B 는 동일하지 않다.


여기서 #  의 쓰임새가 나오는데 # 은 다른 nested 클래스에 대한 참조를 할 수 있도록 만들어준다. 
A.B 아닌 A#B 로 말이다. 이것의 의미는 아무 A 기반의 인스턴스 내의 B 클래스를 말한다.

다시 만들어서 시도해보면 

class A {
  class B

  def f(b: B) = println("Got my B!")
  def g(b: A#B) = println("Got a B.")
}
scala> val a1 = new A
a1: A = A@1497b7b1

scala> val a2 = new A
a2: A = A@2607c28c

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

scala> a2.g(new a1.B)
Got a B.

잘된다.


참고) 


http://stackoverflow.com/questions/9443004/what-does-the-operator-mean-in-scala

Comments