티스토리 뷰

scala

[Scala] 동반 객체(Companion Object)

sungjine 2017. 12. 24. 15:49
반응형

동반 객체 혹은 짝 객체라고 불린다.

 

동반 객체는 class나 trait과 동일한 이름을 가지는 object가 Class나 trait과 같은 파일에 있을 때 동반 객체라고 한다.

class LearnScala {
}

object LearnScala {   // 동반 객체
}

혹은

trait LearnScala {
}

object LearnScala {   // 동반 객체
}

 

object는 class의 private 한 변수나 함수에 접근할 수 있다.

class LearnScala {
    private val privateValue: Int = 1
}

object LearnScala {
    val learnScala = new LearnScala

    def hardStudy: Int = {
        learnScala.privateValue
    }
}

 

object에서 apply 메서드를 정의하여 클래스인 TestClass를 new를 통해서 생성되도록 하면 new를 사용하지 않아도 클래스인 TestClass를 생성하여 사용할 수 있다.

class TestClass {
}

object TestClass {
    def apply() = new TestClass
}

class Main {
    val a: TestClass = TestClass()
}

 

Scala에는 static 키워드가 없고 object를 통해서 Java의 클래스의 static을 대체할 수 있다.

class LearnScala {
}

object LearnScala {
    val StaticValue: String = "Static Value"
    
    def StaticDef: String = "Static Def"
}

object Main extends App {
    LearnScala.StaticValue
    LearnScala.StaticDef
}

 

위에서 private 한 변수나 함수에 접근할 수 있다고 적혀있는데 접근할 수 없는 예외가 있다.

class TestClass(b: Int) {
    private[this] def a = 1
    private val c = 3
}

object TestClass {
    val test = new TestClass(1)
    
    def aaa: Int = test.b    // 생성자의 파라미터는 접근할 수 없다. "Cannot resolve symbol b" 라는 에러 발생
    def aaaa: Int = test.a   // private[this] 한 변수는 접근할 수 없다. "Symbol a is inaccessible from this place" 라는 에러발생
    def aaaaa: Int = test.c  // 접근 가능하다.
}

 

object를 통해서 객체가 생성되기 때문에 클래스 메서드 패턴을 사용하는 것과 같은 효과를 가진다.

반응형

'scala' 카테고리의 다른 글

[Scala] sealed 제어자  (0) 2018.06.23
[Scala] unapply 메서드  (0) 2018.05.05
[Scala] apply 메서드  (0) 2018.03.24
[Scala] val, var, def의 차이  (0) 2018.02.28
[Scala] Option  (0) 2017.11.11
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30