Coding Memo

Kotlin 오브젝트 본문

Language/Kotlin

Kotlin 오브젝트

minttea25 2021. 1. 3. 14:10

오브젝트 (Object)

 

생성자 없이 객체를 만들어낼 수 있다. 즉 그 자체가 객체이다.

Java에서의 static과 같다고 보면 된다.

Java의 Math.random()을 사용했던 것을 떠올려보자.

Math 클래스를 따로 생성하지 않고 random() 함수를 실행시켰었다.

 

Singleton 패턴의 객체를 정의한다.

fun main() {
    //x^2-3x+2
    val e1:Array<Int> = arrayOf(1, -3, 2)

    //x^2-9
    val e2:Array<Int> = arrayOf(1, 0, -9)

    var x11 = GetX.getQuadraticEquation1(e1[0], e1[1], e1[2])
    var x12 = GetX.getQuadraticEquation2(e1[0], e1[1], e1[2])
    println("e1: $x11, $x12, count: ${GetX.count}")

    var x21 = GetX.getQuadraticEquation1(e2[0], e2[1], e2[2])
    var x22 = GetX.getQuadraticEquation2(e2[0], e2[1], e2[2])
    println("e2: $x21, $x22, count: ${GetX.count}")
}

object GetX {
    var count = 0 //호출한 횟수

    fun getQuadraticEquation1(a: Int, b:Int, c:Int) : Double {
        count++
        return  (-b + (sqrt(b.toDouble().pow(2) - 4*a*c)))/(2*a)
    }
    fun getQuadraticEquation2(a: Int, b: Int, c: Int) : Double {
        count++
        return  (-b - (sqrt(b.toDouble().pow(2) - 4*a*c)))/(2*a)
    }
}

Object 예시 출력 결과

GetX를 2차 방정식의 근을 구해주는 Object로 선언하였다.

내부 변수(속성) 및 함수는 static으로 봐도 무방하다.

따라서 main 함수에서 GetX라는 객체를 생성하는 것 없이 getQuadraticEquation 함수를 수행할 수 있다.

count 변수는 내부 함수가 한번 호출 될 때마다 1씩 증가하도록 했는데 2번씩 호출 됐으므로 각각 2, 4가 출력되는 것을 알 수 있다.

object는 프로그램에서 최초로 사용할 시에 메모리에 올라간다.

 

익명의 객체를 선언시에도 사용하는데 안드로이드와 같은 UI가 있을 때 유용하다.

val obj = object : MouseAdapter() {
    override fun mouseClicked(event: MouseEvent) { ... }
    
    override fun mouseEntered(event: MouseEvent) { ... }
    }

Companion Object

 

클래스 안에서도 object를 만들고 사용이 가능하다.

companion object를 이용한다.

Java에서의 static과 비슷한 역할을 한다.

fun main() {
    var cat = Animal("Cat")
    cat.add()
    cat.add()
    var dog = Animal("Dog")

    println("Animal.totalCount: ${Animal.totalCount}")
    println("cat.count: ${cat.count}")
    println("dog.count: ${dog.count}")
}

class Animal(val name: String) {
    var count = 0 //마릿수

    companion object {
        var totalCount = 0 //동물 전체 마릿수
    }
    init {
        totalCount++
        count++
    }

    fun add() {
        count++
        totalCount++
    }
}

Companion Object 예시 출력 결과

class 내부의 companion object를 호출 할 때는 클래스명을 통해 바로 참조한다.

인스턴스로 만들어진 객체에서는 참조할 수 없다. (cat과 dog에서는 totalCount를 참조할 수 없다.)

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

Kotlin 문자열  (0) 2021.01.05
Kotlin 옵저버 패턴  (0) 2021.01.03
Kotlin 스코프 함수  (0) 2021.01.02
Kotlin 인터페이스  (0) 2021.01.02
Kotlin 고차 함수 / 람다 함수  (0) 2020.12.31