Companion Object
companion object에 대한 정리에 앞서 먼저 Java의 어떤 기능과 유사한지부터 알아보겠습니다. Java에는 static 키워드가 존재합니다. 해당 키워드가 붙은 변수가 메소드는 클래스 로드 시에 메모리에 할당되며, 프로그램 종료 시까지 유지가 됩니다. 또한 모든 인스턴스에 공유되는 특징을 가지고 있습니다.
Kotlin에서는 static이라는 키워드가 존재하지 않습니다. 대신 companion object 키워드를 가지고 static 키워드를 대신해 처리를 하고 있습니다.
먼저 Java의 코드를 살펴보겠습니다.
public class Test {
public static int count = 0;
public static void print(){
System.out.println("Hello World!!");
}
}
public class MainClass {
public static void main(String[] args) {
//0
System.out.println(Test.count);
//Hello World
Test.print();
}
Java에서는 static 키워드를 활용하여 인스턴스를 생성하지 않고 직접 접근 하여 위 예시처럼 사용을 할 수 있습니다. 위에서 기능하는 동작들을 Kotlin으로 작성해 보겠습니다. 해당 기능은 Java로 구현한 기능과 동일하게 동작하는 것을 알 수 있습니다.
class Test {
companion object {
var count = 0
fun print() {
println("Hello World")
}
}
}
fun main() {
//0
println(Test.count)
//Hello World
Test.print()
}
하지만 현재 count 변수는 변경이 가능합니다. 만약 count 변수의 값이 불변하게 하려면 어떻게 해야할까요? Java에서는 이를 해결하기 위해 final 키워드가 존재합니다. Kotlin에서는 const val 또는 val 키워드를 사용할 수 있습니다.
두 가지 방식 모두 값이 변경되지 않게 설정할 수 있지만 한 가지 차이점이 있습니다. const val는 컴파일 타임 상수이고 val은 런타임 상수입니다.
- 컴파일 타임 상수는 컴파일 시점에 값이 확정되는 상수로, 코드 최적화에 도움을 줍니다.
- 런타임 상수는 실행 중 한 번만 할당되지만, 다양한 표현식 및 객체 생성과 같은 상황에 유연하게 대응할 수 있습니다.
또한 companion object 내부에 선언한 변수나 메소드에 접근할 때 이름을 명시하고 다음처럼 접근을 할 수 있습니다.
class Test {
companion object Number{
var count = 0
fun print() {
println("Hello World")
}
}
}
fun main() {
//0
println(Test.Number.count)
//Hello World
Test.Number.print()
}
이 밖에도 인터페이스를 구현하는 방법도 있습니다.
interface TestInterface{
fun print2()
}
class Test {
companion object: TestInterface{
var count = 0
fun print() {
println("Hello World")
}
override fun print2(){
println("Hello World2")
}
}
}
fun main() {
//0
println(Test.count)
//Hello World
Test.print()
//Hello World2
Test.print2()
}
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
Build (2) | 2025.04.25 |
---|---|
Nested Class, Inner Class (0) | 2025.04.24 |
Null 처리 (2) | 2025.04.23 |