개발일지

Kotlin in A..Z (18) - companion object, object, 싱글톤 본문

Kotlin (코틀린)

Kotlin in A..Z (18) - companion object, object, 싱글톤

강태종 2020. 7. 16. 01:28

싱글톤

싱글톤 패턴이란 전역 변수를 사용하지 않고 객체 하나만 생성하여 어디서든 참조할 수 있는 패턴입니다.

객체가 서로 동일한 정보를 가질 때 하나의 메모리만 유지해서 메모리 낭비를 막을 수 있습니다.

 

- object

  • object는 접근 시점에서 하나의 객체가만 생성됩니다. 그렇기 때문에 주 생성자, 부 생성자를 정의할 수 없습니다.
  • object 객체를 초기화 하기 위해선 init블록을 사용하면 되고 접근할 때 처음에만 실행됩니다.
  • 자바에서 object를 접근하려면 INSTANCE 키워드를 사용하면 됩니다. (자바파일에서)

코드

object Math {
    fun sum(vararg args: Int): Int {
        var result = 0
        for(num in args) {
            result += num
        }

        return result
    }
}

fun main() {
    println(Math.sum(1, 2, 3))
}

 

결과

6

 

- object 표현식

 

코드

open class Man {
    open fun fly() {
        println("I Can't Fly")
    }
}

fun main() {
    val superman = object : Man() {
        override fun fly() {
            println("I Can Fly")
        }
    }

    superman.fly()
}

 

결과

I Can Fly

 

- companion object

자바에서 static의 나열이 아닌 하나의 객체로 취급하여 좀더 명확한 의미를 지니고 싱글톤 패턴에 적합하다.

 

  • static처럼 동작할 뿐 사실 static이 아닌 객체이다 (Companion 키워드로 접근 가능)
  • 클래스 내 딱 하나만 쓸 수 있다.
  • 인터페이스 내에도 정의할 수 있다.
  • 상속 관계에서 companion 멤버는 가려진다.
  • 코틀린 파일에 멤버 변수는 @JavaField를 명시하고, 멤버 함수는 @JavaStatic을 명시하면 자바 파일에서도 사용할 수 있다.

코드

class Parent {
    companion object {
        fun action() {
            println("Parent")
        }
    }
}

class Child {
    companion object {
        fun action() {
            println("Child")
        }
    }
}

fun main() {
    Parent.action()
    Child.action() // Child Companion Object의 action을 호출
    Child.Companion.action() // 객체 처럼 사용
}

 

결과

Parent
Child
Child

 

- 이름이 있는 companion object

 

코드

class Base {
    // companion object에 이름 붙이기
    companion object Test {
        fun action() {
            println("Base Test")
        }
    }
}

fun main() {
    Base.Test.action()
    Base.action()   // 이름을 생략하여 호출 가능
}

 

결과

Base Test
Base Test

 

- const val

상수 표현식으로 primitive type과 String형에만 사용가능하며 컴파일 시간에 상수처리를 하는 표현식이다.

object, companion object, main함수 밖에만 사용할 수 있다.

 

코드

const val start = 0
const val end = 5

fun main() {
    for(i in start..end) {
        println(i)
    }
}

 

결과

0
1
2
3
4
5
Comments