[ Intro.. ]

android kotlin 코드 예시를 찾아보면 이런 구조의 Companion object를 간혹 발견할 수 있다.
그냥 oncreate 위에 val gap = " " 로 구성해도 같은 결과일 것 같은데,
왜 Companion object에 사용할까??
답부터 말하면,
1. 메모리에 올라가는 타이밍이 빨라짐.
2. Companion object 는 "객체" 로 관리됨 (자바의 Static과 비교됨).
(저번 포스팅에서는 Companion Object와 비교되는 Java의 Static과 JVM에 대해 공부했으니 참고해주세요! https://pudroid.tistory.com/8)
3. 싱글톤으로 관리됨.
4. 따라서 공통 데이터 관리가 가능하고, 상황에 따라 메모리 관리 효율적.
이번 포스팅에서는
1. Companion Object에 대해 알아보고,
2. 두 개의 차이점과 초기화 타임을 JVM Loader 와 관련해서 알아보려한다.
3. 추가적으로, Const와 Object 클래스, Singleton에 대해서도 얕게 다루겠다.
[ Companion object ]

Companion Object는 다음과 같이 쓰인다.
종종 코드를 보면 보이는 녀석인데..
이게 무슨 역할을 하며 왜 쓰일까??
한줄로 표현하면 다음과 같다.
" 클래스에서 공통적으로 관리되야 할 데이터 및 함수를 정의하기 위해 사용하는 싱글톤 객체 "
싱글톤 객체 : 여러번 생성해도 처음 한번만 메모리에 올라가 생성되는 객체로 이후 객체 생성 시, 기존 객체가 연결되며,
보통 앱이 종료될때까지 남아있게된다.
이해가 어려울 수 있으니 예를들어 설명해보려한다.
[Companion Object 예시]
1. 버튼을 누르면 점수가 올라가는 앱이 있다고 해보자

(간단하게 이런 모양일것이다.)
열심히 눌러서 점수를 높이다가 실수로 화면 전환을 전환하면 어떻게 될까??
안드로이드 Activity 생명주기에 의해,
Activity가 사라졌다가 새로 생성되는 과정을 거치며
위와 같은 Count 변수가 전부 초기화 될것이다.
2. 만약 같은 Fragment를 여러 개 띄어야 할 상황이고,
공통으로 관리되어야 할 데이터가 존재한다면 어떤 방법이 있을까?


이 문제들을 ViewModel 로서 극복할 수 있지만,
관리할 양이 작을 경우와 같이 간단한 사항일 경우 과한 대처일 수 있다.
이때 사용하는게 바로 Companion Object이다.
[Companion Object 의 특징 정리]
1. Companion Object는 객체이기에 다음과 같이 접근이 가능하다.

Java Static의 경우 객체가 아니기 때문에 다음과 같은 참조가 불가능하지만,
Companion Object는 가능하다.
2. Companion Object는 속해있는 클래스를 생성하지 않고도 참조가 가능하다!


다음과 같이, Activity 에서 TestClass의 Companion Object 변수에 접근하게 되면

TestClass가 생성될때 찍히는 '나 만들어졌어' log 없이도 값을 가져올 수 있다.

만약 다음과 같이 Log를 찍은 후 Test Class 객체를 만들게 되면,

이러한 결과를 보인다.
즉, Companion Object 객체는 부모 클래스 생성없이도 만들어지는 특징이 있다.
또한, Companion Object 참조 없이 TestClass 객체를 생성해도 Companion Object 객체는 따라서 생성된다.
3. Companion Object가 메모리에 올라가는 위치

Companion Object 는 앞서 말한것과 같이, 참조될때와 포함된 클래스가 생성될 때 메모리에 올라간다 했다.
메모리에 올려주는 친구는 JVM의 Class Loader가 담당하는데 절차는 다음과 같다.
1. Class Loader가 클래스 로딩을 진행하는데 이때 Class의 각종 정보와 Companion Object 객체를 Method Area에 올림.
2. 그 후 Class 객체를 만들어 Heap 영역에 올림
학부생 레벨에서 쓴 글로, 다소 부족한 부분이 있을 수 있으니 친절한 피드백을 매우 환영합니다.
'Android' 카테고리의 다른 글
| [Android] JVM 과 Static 멤버의 특징 (메모리, 초기화 ..) (2) | 2023.07.13 |
|---|---|
| [Android] Context 의 정의와 종류.. 근데 잘못쓰면 메모리 누수?! (0) | 2023.06.25 |
| [Android] Fragment의 정의와 필요성, Lifecycle 및 이에 따른 대응. (0) | 2023.06.25 |
| [Android] Activity Lifecycle 과 화면회전 시 변화 (0) | 2023.06.22 |
| [Android] Activity 가 있는데 Fragment는 왜 써? (0) | 2023.06.05 |