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);
}
'scala' 카테고리의 다른 글
[scala] jad로 디컴파일(decompile)하기, javap, scalac 사용하기 (0) | 2016.03.26 |
---|---|
[scala] 암시적 타입 변환(implicit type conversion) 예시 (0) | 2016.03.25 |
[scala] =과 함수 선언 (0) | 2016.03.23 |
[Scala] List의 sort는 deprecated, sortWith, sortBy, sorted 활용 예시 (0) | 2016.03.22 |
[Scala] ImmutableList의 remove() (0) | 2016.03.22 |