scala 2.11.8에서 테스트한 코드이다.



* Singleton Object (싱글톤 객체) : class 대신 object 키워드로 정의하고 static 멤버가 없는 객체. 

- static method를 가진다.

- new 로 인스턴스 초기화를 할 수 없다.

- 파라미터를 받을 수 없다.

- first class (1급 계층) 객체이다.

- 타입을 정의하지 않는다. 

- 슈퍼 클래스를 확장(extend)하고, trait를 믹스인(mix in)할 수 있다.




object
Calculator {

def plus(a : Int, b : Int): Long = {
a + b
}
}


- 실행 코드

object Hello {
def main(args: Array[String]): Unit = {
Console.out.println(Calculator.plus(1, 1));
}
}



Companion Class (동반 클래스) : (객체 관점) 클래스의 이름이 싱글톤 객체의 이름과 같다. 


* Companion Object (동반 객체) :  (클래스 관점) 싱글톤 객체의 이름이 클래스의 이름과 같다. 

  - 팩토리 패턴에 유용하다. 



- 예시

class Calculator2(version : String)

object Calculator2 {
def apply(version : String) = new Calculator2(version)
}




* Standalone Object (독립 객체) :  동반 클래스가 없는 싱글톤 클래스이다. 



---------------


컴파일된 scala 객체를 javap로 테스트한다.

Scala 컴파일러는 싱글톤 객체 scala에 대해서 이름 뒤에 $에 붙은 클래스를 생성한다. 총 2개의 .class가 생성된다.

그리고, 일반 클래스는 클래스만 생성한다.총 1개의 .class가 생성된다.



$ javap Calculator.class

Compiled from "Calculator.scala"

public final class Calculator {

  public static long plus(int, int);

}


$ javap Calculator$.class

Compiled from "Calculator.scala"

public final class Calculator$ {

  public static final Calculator$ MODULE$;

  public static {};

  public long plus(int, int);

}


자바에서 스칼라를 호출하는 구조는 Calculator$.MODULES$.plus(int, int)를 호출하는 형태가 될 것이다.


------

Calculator2 동반 객체를 javap로 테스트한다.


$ javap Calculator2.class

Compiled from "Calculator2.scala"

public class Calculator2 {

  public static Calculator2 apply(java.lang.String);

  public Calculator2(java.lang.String);

}


$ javap Calculator2$.class

Compiled from "Calculator2.scala"

public final class Calculator2$ {

  public static final Calculator2$ MODULE$;

  public static {};

  public Calculator2 apply(java.lang.String);

}




Posted by '김용환'
,