티스토리 뷰

Programming Language/Kotlin

[Kotlin] object 키워드

SdardewValley 2022. 8. 18. 22:10
반응형

싱글턴

  디자인 패턴중 싱글턴 패턴이 있다. 싱글턴 패턴은 객체를 하나만 생성할 수 있는 클래스이다. 싱글턴 구현 방법은 중 필드에 객체를 생성하고 private 생성자를 통해서 새로운 객체 생성을 막는 방법이 있다.

  코틀린에는 객체 선언(object declaration) 기능을 통해서 싱글턴을 지원한다.

 

 

object declaration

  스다듀밸리라는 클래스에 농부 정보를 저장하는 기능을 생각해보자. 스다듀밸리는 하나만 있는 농장이므로 싱글턴 패턴을 적용할 수 있다.

 

object SdardewValley {
  val farmers = arrayListOf<Person>()

  fun countFarmers() : Int = farmers.size
}

  객체 선언은 object로 시작을 한다. object 안에는 주 생성자나 부 생성자와 같은 생성자를 작성할 수 없다. 싱글턴 객체는 생성자 호출 없이 즉시 만들어졌기 때문에 생성자 정의가 따로 필요 없다.

 

fun main() {
  println(SdardewValley.countFarmers())
}

  싱글턴 객체의 프로퍼티나 메서드를 사용하기 위해서는 마침표(.)를 사용하면 된다. 마치 자바의 static 메서드를 호출하는 방식과 동일하다.

 

  객체 선언도 다른 클래스나 인터페이스를 상속할 수 있다. 싱글톤은 공유되기 때문에 상태가 필요하지 않는 경우에 이 방법을 사용하면 유용하다.

 

 

companion object

  코틀린은 static 키워드를 제공하지 않는다. 코틀린에서 static 키워드를 사용하고 싶은 경우 companion object를 사용하면 된다.

 

class CompanionObject {
    companion object {
        fun call() {
            println("companion object called!")
        }
    }
}

fun main() {
    CompanionObject.call()
}

  CompanionObject 클래스 안에 companion object가 있다. companion object는 이름을 지정하지 않아도 된다. companion object의 프로퍼티나 메서드를 호출은 마침표(.)를 사용하면 된다.

 

class User private constructor(val nickname: String) {
    companion object {
        fun newUser(email: String) = User(email.substringBefore('@'))
    }
}

  companion object를 사용해서 팩토리 메서드를 구현할 수 있다. private constructor을 사용해서 직접적으로 User 인스턴스를 생성하지 못하게 하고 companion object의 newUser을 활용하는 것이다. companion object는 private 접근 제어자를 가지는 클래스의 프로퍼티나 메서드에 접근할 수 있기 때문에 생성자를 사용할 수 있다.

 

class File(val fullName: String) {
    companion object Concat {
        fun createFileName(fileName: String, extension: String) = File("$fileName.$extension")
    }
}

fun main() {
    File.createFileName("text", "txt")
    File.Concat.createFileName("image", "png")
}

  companion object에는 이름을 붙일 수도 있다. 이렇게 이름을 붙인 경우에도 동반 객체의 이름을 지정하지 않아도 메서드를 호출할 수 있다. companion object 이름을 지정하지 않는 경우에 companion object의 이름은 자동적으로 Companion이 된다.

 

 

참고

  • Kotlin IN ACTION
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함