오늘은 companion object에 대해 알아볼 예정이다.
역시나 Java 로 코드를 살펴보고 Kotlin으로 바꿔보도록 하자
Java에서의 상수
public class Person {
public static final int MAX_AGE = 500;
}
public static void main() {
System.out.println(Person.MAX_AGE);
}
간단한 코드이다.
Person 클래스 내부에 MAX_AGE
라는 상수가 public 접근 제한자로 존재하고, 이는 외부에서 Person.MAX_AGE
로 접근할 수 있다.
만약 Person 클래스 내부에서만 접근하게 하고 싶다면 public을 private으로 바꿀 수 있다.
클래스와 인스턴스 관점에서 바라보자면, static 필드인 MAX_AGE는 Person의 인스턴스가 생길때마다 메모리가 추가로 할당되는 것이 아니고, Person 클래스 설계도 자체에 함께 존재하게 된다.
Kotlin에서의 companion object
위의 코드를 Kotlin으로 똑같이 바꿔보자
class Person {
companion object {
const val MAX_AGE: Int = 500
}
}
fun main() {
printf(Person.MAX_AGE)
}
class Person 내부에 companion object
라는 구문이 존재하고 해당 객체 내에 const val
이 붙은 변수가 존재하게 된다.
const
가 붙은 이유는, MAX_AGE는 런 타임이 아니라 컴파일 타임에 500이란 값으로 초기화 되기 때문이다.
또한, 코틀린에서는 기본 접근 제한자가 public
이기 때문에 class
와 const val
앞에 public
을 붙이지 않아도 된다.
Java에서의 static method
자바에는 static 필드 외에도 static method가 존재한다
public class Person {
public static void sayHello() {
System.out.println("안녕하세요~")
}
}
public static void main() {
System.out.println(Person.sayHello());
}
코틀린에서도 비슷한 구현이 가능하다.
Kotlin에서의 companion object
class Person {
companion object {
fun sayHello() {
println("안녕하세요~")
}
}
}
fun main() {
Person.sayHello()
}
하지만 흥미롭게도 코틀린의 companion object에는 다른 점이 두 가지 존재한다.
companion object에 이름 붙이기
companion object도 엄연히(?) 하나의 객체이기 때문에 이름을 붙일 수 있게 된다
class Person {
companion object Constant {
const val MAX_AGE: Int = 500
}
}
이름을 붙였다고 해서 사용법이 달라지지는 않는다.
println(Person.MAX_AGE) // 가능~
println(Person.Constant.MAX_AGE) // 가능~
companion object에서 인터페이스 구현하기
위에서 언급한 것처럼 companion ojbect도 엄연히(?) 하나의 객체이기 때문에 interface를 구현할 수도 있다.
interface Movable {
fun move()
}
class Person {
companion object: Movable {
override fun move() {
println("움직였다!!")
}
}
}
fun main() {
Person.move()
}
여기서 주의해야 할점은 companion object
역시 클래스, 즉 설계도에 붙어 있는 객체이기 때문에 프로세스에서 한 인스턴스만 존재하게된다. (간단히(?) 말해 싱글톤이다)
class Person {
companion object {
var age: Int = 10
}
}
fun main() {
println(Person.age)
Person.age++
println(Person.age)
}
'개발 공부 기록하기 > 01. JAVA & Kotlin' 카테고리의 다른 글
Junit5 Extension 알아보기 (org.junit.jupiter.api.extension) (0) | 2021.09.23 |
---|---|
[코틀린 docs] 코틀린의 타입 (0) | 2021.01.26 |
[코틀린 탐구생활] when, 그리고 클린 코드 (0) | 2021.01.20 |
[코틀린] data class란? (0) | 2021.01.07 |
[코틀린] ?. 연산자, ?: 연산자 (2) | 2021.01.05 |