본문으로 바로가기

Kotlin In Action #5

category Programming/Kotlin 2022. 1. 10. 21:10

Kotlin In Action #5


클래스, 객체, 인터페이스

object 키워드: 클래스 선언과 인스턴스 생성

코틀린에서 object 키워드를 다양한 상황에서 사용하지만 모든 경우 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 공통점이 있음.

  • 객체 선언은 싱글턴을 정의하는 방법 중 하나.
  • 동반 객체는 인스턴스 메서드는 아니지만 어떤 클래스와 관련 있는 메서드와 팩터리 메서드를 담을 때 사용.
    • 동반 객체 메서드에 접근할 때는 동반 객체가 포함된 클래스의 이름을 사용할 수 있음.
  • 객체 식은 자바의 무명 내부 클래스 대신 쓰임.

객체 선언: 싱글턴 쉽게 만들기

자바에서는 클래스의 생성자를 private로 제한하고, 정적 필드에 그 클래스의 유일한 객체를 저장하는 형태로 구현.

코틀린은 객체 선언 기능을 통해 싱글턴을 언어에서 기본 지원.

object Payroll {
    
    val allEmployees = arrayListOf<Person>()
    
    fun calculateSalary() {
        for (person in allEmployees) {
            ...
        }
    }
}
  • 객체 선언은 클래스를 정의하고 그 클래스의 인스턴스를 만들어서 변수에 저장하는 모든 작업을 한 문장으로 처리.
  • 클래스와 마찬가지로 객체 선언 안에도 프로퍼티, 메서드, 초기화 블록 등이 들어갈 수 있음.
  • 생성자는 객체 선언에 쓸 수 없음.
import java.io.File

object CaseInsensitiveFileComparator: Comparator<File> {

    override fun compare(o1: File?, o2: File?): Int {
        return o1!!.path.compareTo(o2!!.path, ignoreCase = false)
    }
}


println(CaseInsensitiveFileComparator.compare(File("/User"), File("/user")))

동반 객체: 팩토리 메서드와 정적 멤버가 들어갈 장소

class A {
    companion object {
        fun bar() {
            println("Companion Object called")
        }
    }
}
  • 코틀린 클래스 안에는 정적인 멤버가 없음.
  • 대신 코틀린에서는 패키지 수준의 최상위 함수와 객체 선언을 활용.
  • 클래스 안에 정의된 객체 중 하나에 companion 이라는 특별한 표시를 붙이면 그 클래스의 동반 객체로 만들 수 있음.
class User private constructor(val nickname: String) {
    companion object {
        fun newSubscribingUser(email: String) = User(email.substringBefore('@'))
        
        fun newFaceBookUser(accountId: Int) = User(getFacebookName(accountId))
    }
}

클래스를 확장해야 하는 경우 동반 객체 멤버를 하위 클래스에서 오버라이드할 수 없으므로 여러 생성자를 사용하는 편이 더 나은 방법.

'Programming > Kotlin' 카테고리의 다른 글

[당근마켓 밋업 정리] - Kotlin Coroutines 톺아보기  (0) 2022.01.09
Kotlin In Action #4  (0) 2022.01.05
Kotlin In Action #3  (0) 2021.12.22
Kotlin In Action #2  (0) 2021.12.11
Kotlin In Action #1  (0) 2021.12.06