상세 컨텐츠

본문 제목

[Kotlin] Object & Companion Object

Programming language/Kotlin

by choiDev 2021. 9. 21. 16:02

본문

Object 키워드란?

 

Kotlin에서 class와 object 키워드의 용도는 비슷하지만 전혀 다른 역할로 사용되고 있습니다.

class는 클래스를 정의하는 경우 사용하며, object는 싱글턴 패턴이 적용되어 객체가 한개만 생성됩니다.

object 키워드 단 하나로 싱글턴 생성이 가능하며 보일러플레이트(boilerplate)를 작성하지 않아도 되어 

많은 문법 오류와, 수정 범위를 줄여줍니다. 그리고 object 키워드는 익명 객체를 구현할때도 사용됩니다.

 

Object 특징

 - object 객체는 주생성자, 부생성자 모두 사용 불가

 - object는 상속 시 부모가 될순 없지만 자녀로서 상속을  받을 수 있습니다. 

 - Java에서 Kotlin의 object를 사용할때는 {클래스}.INSTANCE.{함수 or 변수명} 으로 사용하면 된다.
    예1) Navigation.INSTANCE.printMyName()
    예2) Navigation.INSTANCE.name


Object 선언 및 호출 예제

//아래와 같이 object를 생성하며 클래스 선언과 동시에 객체가 생성됩니다.

object User {
    val name :String = "choi"
    
    fun printMyName() {
        println(name)
    }
}


//Singleton인 User는 외부에서 아래와 같이 호출합니다.
User.printMyName()

 


Object 익명 객체 구현 예제

//interface 등록
interface Navigation {
    fun showNetworkError()
}

//익명객체 생성
val navigation: Navigation = object : Navigation {
    override fun showNetworkError() {
        println("네트워크 에러 발생")
    }
}

//익명객체 실행
fun main(args: Array<String>) {
    navigation.showNetworkError()
}

중첩 object 구현 예제

import kotlin.Comparator

data class User(val id: Int, val name: String) {
    //object를 중첩으로 사용
    object UserComparator : Comparator<User> {
        override fun compare(o1: User, o2: User): Int {
            return o1.id.compareTo(o2.id)
        }
    }
}

fun main(args: Array<String>) {
    val userList = listOf(
        User(1024, "choi"),
        User(1023, "kim"),
        User(1025, "Lee")
    )
    //UserComparator 중첩을 사용해 정렬
    println(userList.sortedWith(User.UserComparator))
}

Companion Object란?

 - 어떤 클래스의 모든 인스턴스가 공유하는 객체를 만들고 싶을 때 사용하며, 클래스당 1개만 가질 수 있다.

 - companion Object는 이름을 가질수 있다. 
     companion object Constant {
           const val MAX_LEVEL:Int = 100
     } 

 - companion Object는 상속을 받을 수 있다. 
    companion object: Comparator {
        override fun compare(o1:Int, o2:Int){ 
             return o1.compare(o2)
         }
    }

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

[Kotlin] Data Class (데이터 클래스)  (0) 2021.09.21
[Kotlin] 표준함수  (0) 2020.12.06
[Kotlin] 문자열  (0) 2020.12.05
[Kotlin] 익명 함수와 함수 타입  (1) 2020.12.05
[Kotlin] 함수(Function)  (0) 2020.12.04

관련글 더보기