자바에서의 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 어노테이션을 붙여줘야 한다.
코틀린에서 싱글톤은 클래스 앞에 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();
}