static 함수와 변수
Java
public class JavaPerson {
private static final int MIN_AGE = 1;
public static JavaPerson newBaby(String name);
return new JavaPerson(name, MIN_AGE);
}
private String name;
private int age;
private JavaPerson(String name, int age) {
this.name = name;
this.age = age;
}
Kotlin
class Person private constructor(
private val name: String,
private val age: Int,
) {
companion object {
private val MIN_AGE = 0
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
}
}
- static 대신 companion object를 사용
- static : 클래스가 인스턴스화 될 때 새로운 값이 복제되는게 아니라 정적으로 인스턴스끼리 값을 공유
- companion object : 클래스와 동행하는 유일한 오브젝트
class Person private constructor(
private val name: String,
private val age: Int,
) {
companion object {
**private val MIN_AGE = 0 // 런타임시 변수 할당
private const MIN_AGE = 0 // 컴파일 시 변수 할당**
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
}
}
fun main() {
println(Person.newBaby("name1")
}
- companion object에서 const키워드를 붙이면 컴파일 시 변수가 할당됨
- 진짜 상수에 붙이기 위한 용도
- 기본 타입과 String에 붙일 수 있음
- 기본적인 static 함수 사용법은 Java와 같음
class Person private constructor(
private val name: String,
private val age: Int,
) {
companion object Factory : Log {
**private val MIN_AGE = 0 // 런타임시 변수 할당
private const MIN_AGE = 0 // 컴파일 시 변수 할당**
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log(){
println("LOG")
}
}
}
- companion object는 이름처럼 하나의 객체로 간주됨(동반 객체)
- 때문에 이름을 붙일 수 있고, interface를 구현할 수 있음
- companion object에 유틸성 함수들을 넣어도 되지만 최상단 파일을 활용하는 것을 추천함(11장)
// Java code
Person person = Person.newBaby("A");
// 둘 중 하나만 사용 가능
Person person = Person.Factory.newBaby("A"); // companion object에 이름(Factory)이 있을 경우
Person person = Person.Companion.newBaby("A"); // companion object에 이름이 없을 경우
companion object Factory : Log {
**private val MIN_AGE = 0 // 런타임시 변수 할당
private const MIN_AGE = 0 // 컴파일 시 변수 할당
@JvmStatic**
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log(){
println("LOG")
}
}