코틀린 object

MSU·2024년 9월 9일

Android

목록 보기
18/36

Companion Object

자바에서의 static을 코틀린에서는 사용할 수 없다.
대신 companion object(동반 객체)라는 것을 사용할 수 있다.

자바 static : 클래스가 인스턴스화 될 때 새로운 값이 복제되는 것이 아니라 정적으로 인스턴스끼리 값을 공유한다.

코틀린 companion object : 클래스와 동행하는 유일한 오브젝트

companion ojbect의 변수에는 const라는 키워드를 붙일 수 있는데 const가 없을때에는 런타임시에 변수에 값이 할당된다면, const를 붙이면 컴파일시에 변수에 값이 할당된다.
주로 진짜 상수에 붙이기 위한 용도로 사용되며, 기본 타입과 String 타입에 붙일 수 있다.

companion object {
	const val MIN_AGE = 0
}

companion object는 하나의 객체로 간주되며, 이름을 붙이거나 interface를 구현할 수도 있다.

class Person private constructor(
	var name: String,
    var age: Int,
) {
    companion object Factory: Log {
        private const val MIN_AGE = 0
        fun newBaby(name: String) {
            return Person(name, MIN_AGE)
        }
        
        override fun log() {
        
        }
    }
}

interface Log {
	fun log()
}

companion object를 활용해 Util성 함수들을 사용할 수 있지만, 최상단 파일을 활용하는 것을 추천한다고 함

companion object의 함수를 호출할 때에는 companion을 직접 명시하거나,
함수이름 위에 @JvmStatic 어노테이션을 붙여서 자바와 같이 클래스.함수명 형태로 호출할 수 있다.


    companion object Factory: Log {
        private const val MIN_AGE = 0
        
        @JvmStatic
        fun newBaby(name: String) {
            return Person(name, MIN_AGE)
        }
        
        override fun log() {
        
        }
    }
    

fun main(){
	// companion object에 이름이 없다면 companion을 직접 명시하여 접근할 수 있고
	Person.companion.newBaby("")
    
    // companion object에 이름이 있다면 이름으로 접근해야 한다.
    Person.Factory.newBaby("")
    
    // 함수 위에 @JvmStatic 어노테이션을 붙인다면
    // companion을 생략할 수도 있다.
    Person.newBaby("")
    
}

자바에서 코틀린의 companion object를 사용하려면 @JvmStatic 어노테이션을 붙여줘야 한다.

Singleton

코틀린에서 싱글톤은 클래스 앞에 object를 붙여주기만 하면 된다.


fun main(){
	println(Singleton.a)
    Singleton.a += 10
    println(Singleton.a)
}

object Singleton{
	var a: Int = 0
}
0
10

코틀린으로 서버를 만들 때 싱글톤을 직접적으로 만드는 일은 거의 없었다고 한다.

익명 클래스

특정 인터페이스나 클래스를 상속받은 구현체를 일회성으로 사용할 때 쓰는 클래스

자바에서는 아래와 같은 형태로 익명 클래스를 구현하지만

public static void main(String[] args) {
	moveSomthing(new Movable() {
    	@Override
        public void move() { System.out.println("움직인다"); }
        @Override
        public void fly() { System.out.println("난다"); }
    });
}

private static void moveSomthing(Movable movable) {
	movable.move();
    movable.fly();
}

코틀린에서는 object를 사용한다.


fun main(){
	moveSomthing(object: Movable {
    	override fun move() {
        	println("움직인다")
        }
        override fun fly() {
        	println("난다")
        }
    })
}

private fun moveSomthing(movable: Movable) {
	movable.move();
    movable.fly();
}
profile
안드로이드공부

0개의 댓글