안드로이드 개발자의 창고
[16일차 Kotlin] Companion 본문
출처 : 안드로이드 앱스쿨 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 |