-
[Android Studio] 코틀린의 정적 변수 개념 알아보기 - const, companion object개발 끄적끄적/Android 2020. 10. 7. 21:27반응형
코틀린(Kotlin)은 자바(Java)와 유사하며 100% 호환되는 언어이지만, 문법이 다른 만큼 조금씩 다르게 사용해야 하는 부분들이 있습니다.
그 중 하나인 정적 개념에 대해 짚어보겠습니다.
정적 변수란?
정적으로 할당되는 변수이며, 프로그램 실행 전반에 걸쳐 변수의 수명이 유지되는 것입니다.
멤버가 정적(static)으로 선언되면, 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지 관리됩니다.
자바와 다르게 Kotlin에선 static 이라는 예약어를 사용하지 않습니다.
코틀린에서의 정적 변수 사용 방법 중 두 가지 방법, const와 companion object 에 대해 알려드리겠습니다.
1. const val
const val tmp : String = "변수" class MainActivity{ }
'const val'을 사용하면 자바의 'public static final'와 같은 기능을 합니다.
하지만 const 선언은 String 타입과 원시 타입에서만 사용이 가능합니다. 이 외의 타입에 대해서도 정적 선언을 하기 위해선 아래와 같이 @JvmField 처리를 해줘야 합니다.
@JvmField val tmp : Test? = null class Test(){ }
위처럼 const를 @JvmField로 대체하면 다양한 타입에 대해서 처리가 가능합니다.
2. Companion Object
companion object를 사용하면 자바에서 정적 변수/메소드를 사용한 것과 동일하게 사용할 수 있습니다.
companion object는 static과 유사하게 어떤 클래스의 모든 인스턴스가 공유하는 객체를 만들고 싶을 때 사용하며, 클래스당 한 개만 가질 수 있습니다.
class Main{ companion object { val tmp = 1 fun fTmp(){ } } }
위와 같이 companion object를 이용해 선언된 변수 및 함수는 (클래스이름).(변수이름) 으로 호출할 수 있습니다.
즉, 위 예제에선 Main.tmp 혹은 Main.fTmp()로 호출이 가능한 것입니다.
그런데 Main.tmp와 Main.fTmp()는 사실 축약된 표현으로써 원래는 Main.Companion.tmp 와 Main.Companion.fTmp() 입니다.
위와 같은 축약 표현 때문에 Companion Object가 static과 같다고 착각이 들 수 있지만 Companion Object는 static과 다른 객체입니다. 따라서 아래와 같이 변수에 할당할 수 있으며, 할당한 변수에서 .으로 companion object에 선언된 멤버에 접근할 수 있습니다.
class MyClass{ companion object{ val tmp = "companion object" } } fun main(){ val comp = MyClass.Companion println(comp.tmp) }
단, 위와 같이 companion object를 사용해 구성한 코드를 자바에서 사용하려면 해당 변수, 함수가 자바의 필드/메소드로 해석될 수 있게 해주어야 합니다.
class Main{ companion object { const val tmp = 1 @JvmStatic fun fTmp(){ } } }
위처럼 변수에 const, 함수에 @JvmStatic 어노테이션을 사용 선언하면 자바에서도 사용할 수 있습니다.
마치며..
안드로이드에서 뷰에서 사용하는 고정된 길이 값, 각종 유틸리티 클래스 내 메소드 등의 경우에 정적 변수 및 메소드를 주로 사용합니다.
위 경우는 선언된 클래스와 밀접하기 때문에 클래스 외부에 별도로 선언하기엔 모호합니다.
따라서 위와 같은 경우엔 companion object를 사용하시길 추천드립니다.
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Studio] 액티비티의 활동 수명 주기(Activity LifeCycle) 알아보기 - onCreate(), onStart() 등 (0) 2020.10.06 [Android Studio] Kotlin의 람다 표현식, Member Reference을 이용해 코드의 가독성을 높혀보자 (0) 2020.09.28 [Android Studio] Kotlin 변수와 데이터 타입 알아보기 (0) 2020.09.25 [Android Studio] 안드로이드 개발 환경 구축하기 - Android Studio 사용방법 및 구조 이해하기 (0) 2020.09.22 [Android Studio] 안드로이드 개발 환경 구축하기 - Android Studio 설치 (0) 2020.09.18