public class JavaPerson {
private static final int MIN_AGE = 1;
public static main.com.etc.java.JavaPerson newBaby(String name) {
return new main.com.etc.java.JavaPerson(name, MIN_AGE);
}
private String name;
private int age;
private JavaPerson(String name, int age) {
this.name = name;
this.age = age;
}
}
class Person private constructor(
val name: String,
var age: Int,
) {
companion object {
private const val MIN_AGE = 1
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
}
}
코틀린에는 static 키워드가 없다.
대신에 companion object라는 키워드를 사용하여, 해당 블록 안의 변수와 함수가 자바의 static 변수와 함수처럼 사용된다.
자바의 static을 다시한번 정리하고 가자면, 클래스가 인스턴스화 될 때 새로운 값이 복제되는 것이 아니라 정적으로 인스턴스끼리의 값을 공유하도록 선언하는 것을 static 키워드를 사용하여 구현할 수 있다.
이와 비슷하게, companion object는 클래스와 동행하게되는 유일한 오브젝트이다. 인스턴스가 여러개 생기더라도 해당 클래스와 계속하여 동행하게 되는 object이다.
위 코틀린 코드에서 상수인 MIN_AGE에 붙은 const 키워드는, 해당 키워드를 붙이게 되면 변수에 값이 런타임 시에 할당되는것이 아니라 컴파일시에 할당될 수 있도록 하는 키워드이다.
그래서 이 const라는 키워드는 진짜 상수에 붙이기 위한 용도로 사용된다.
const는 기본타입과 String에만 붙일 수 있다.
코틀린에서도 자바와 마찬가지로 companion object 안의 변수와 함수들은 인스턴스를 새로 생성 할 필요없이 Person.MIN_AGE, Person.newBaby() 등으로 사용할 수 있다.
자바와 다른점은, companion object도 하나의 객체로 간주된다. 그렇기 때문에 이름을 붙일 수도 있고, interface를 구현할 수도 있다.
companion object Factory : Log {
private const val MIN_AGE = 1
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
println("나는 Person 객체의 동행 객체입니당.")
}
}
자바에서 코틀린 companion object를 사용하는 방법은 동행객체의 이름이 있을때와 없을때가 다르다.
동행 객체의 이름이 없는 경우
public static void main(String[] args) {
Person.Companion.newBaby("ABC");
}
이름이 없지만 ‘@JvmStatic’ 이라는 어노테이션을 붙여 Companion 키워드 없이 사용할수도 있다.
companion object : Log {
private const val MIN_AGE = 1
@JvmStatic
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
println("나는 Person 객체의 동행 객체입니당.")
}
}
public static void main(String[] args) {
Person.newBaby("ABC");
}
동행 객체의 이름이 있는 경우
companion object Factory : Log {
private const val MIN_AGE = 1
@JvmStatic
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
println("나는 Person 객체의 동행 객체입니당.")
}
}
public static void main(String[] args) {
Person.Factory.newBaby("ABC");
Person.newBaby("ABC");
}
자바에서의 싱글톤(여러가지 싱글톤 구현 방법이 있지만 여기에서는 간단한 예제를 사용하겠음)
public class JavaSingleton {
private static final JavaSingleton INSTANCE = new JavaSingleton();
private JavaSingleton() {}
public static JavaSingleton getInstance() {
return INSTANCE;
}
}