Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[16일차 Kotlin] Companion 본문

Computer/Kotlin

[16일차 Kotlin] Companion

Wise-99 2023. 5. 18. 17:31

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Companion이란?

  • 클래스를 정의할 때 변수나 메서드를 정적 멤버로 정의하면 객체를 생성하지 않고 사용할 수 있다.
  • Java에서는 static을 사용하는데 Kotlin은 companion객체를 사용하며 다른 점이 없다.
  • 클래스 내에 companion 멤버로 정의된 요소들은 객체 생성 없이 사용이 가능하며 companion 변수의 경우 딱 하나만 생성되어 사용할 수 있다.
  • 만약 Kotlin에서 정의한 Companion 멤버 중 Java에서 사용할 수 있도록 하기 위해서는 @JavaStatic으로 정의해야 한다.

 

📖 예제 코드

JavaMain.java

public class JavaMain {

    public static int JavaA1 = 100;

    public static void javaMethod1(){
        System.out.println("javaMethod1");
    }

    public static void main(String[] args){
        // kotlin에서 정의한 companion 멤버 사용
        int a1 = TestClass1.Companion.getKotlinA3();
        System.out.printf("a1 : %d\n", a1);
        TestClass1.Companion.kotlinMethod3();
    }
}

✔️ 코드 해석

  • int a1 = TestClass1.Companion.getKotlinA3();
    • kotlin 파일에 있는 TestClass1에서 Companion 멤버의 getKotlinA3()을 호출하여 kotlinA3의 값을 가져와 사용한다.

 

 

 

main.kt

fun main() {

    // 일반 멤버 변수나 메서드를 반드시 객체를 생성해야 사용할 수 있다.
    val t1 = TestClass1()
    println("t1.a1 : ${t1.a1}")
    t1.testFun1() 

    println("TestClass1.a2 : ${TestClass1.a2}")
    TestClass1.testFun2()

    //java 파일에 정의된 static 멤버 사용
    println("JavaMain.javaA1 : ${JavaMain.JavaA1}")
    JavaMain.javaMethod1()
}

class TestClass1{
    // 일반 멤버 변수
    var a1 = 100

    // companion 멤버
    companion object{
        var a2 = 200

        @JvmStatic var kotlinA3 = 300

        @JvmStatic fun kotlinMethod3(){
            println("KotlinMethod3")
        }

        fun testFun2(){
            println("testfun2")
            println("a2 : $a2")
            testFun1()           <<< 오류 발생
            println("a1 : $a1")  <<< 오류 발생
        }
    }

    // 일반 메서드
    fun testFun1(){
        println("testfun1")
        println("a1 : $a1")
        
        testFun2()
        println("a2 : $a2")
    }
}

✔️ 코드 해석

  • testFun1() 내부의 testfun2()
    • 객체(t1)입장에서는 companion 멤버가 메모리에 올라가 있다는 것을 보장받을 수 있으므로 사용이 가능하다.
  • testfun2() 내부의 testfun1()과 println("a1 : $a1")
    • companion object 입장에서 봤을 때 클래스를 가지고 객체를 생성했다는 것을 100% 보장받을 수 없기 때문에 일반 멤버의 접근이 불가능하다.
  • main()의 println("TestClass1.a2 : ${TestClass1.a2}")과 TestClass1.testFun2()
    • companion 멤버는 객체 생성 없이 클래스 이름으로 사용이 가능하다.
    • 변수의 경우에는 프로그램 전체에서 딱 하나만 사용하는 값을 저장할 때 사용한다.
  • println("JavaMain.javaA1 : ${JavaMain.JavaA1}")
    • java 파일에 있는 static 변수인 JavaA1을 사용하여 출력한다.
  • @JvmStatic var kotlinA3 = 300 ...
    • companion 멤버를 자바에서 사용할 수 있게 해주는 어노테이션(@JvmStatic)을 붙여준다.

'Computer > Kotlin' 카테고리의 다른 글

[16일차 Kotlin] Generic  (0) 2023.05.18
[16일차 Kotlin] Data Class  (0) 2023.05.18
[15일차 Kotlin] 인터페이스(Interface)  (0) 2023.05.17
[15일차 Kotlin] 추상화(abstract)  (0) 2023.05.17
[15일차 Kotlin] Any  (0) 2023.05.17