[ Intro.. ]

android kotlin 코드 예시를 찾아보면 이런 구조의 Companion object를 간혹 발견할 수 있다.
이녀석이 무엇일까 고민하던 중 JAVA Static과 비교는 글이 되게 많아 간단히 다뤄보려한다.
이번 포스팅에서는
1. Kotlin Companion Object 와 비교되는 Java의 Static 과 특징
2. JVM에 의한 메모리 초기화
에 대해 다룬다.
(사용법은 다루지 않는다!)
[ Java의 Static ]
Static 키워드란?
"특정 멤버(변수, 메소드)를 클래스 수준으로 선언하고 공유하는데 써먹는 키워드"
이것만 봐서는 무슨 말인지 이해가 안될것이다.
Static 사용 예시
예를 들어서 설명해보겠다.

Static를 쓰는 예시는 다음과 같다.
위 예시와 같이 Util 클래스를 구성할 경우
new 키워드를 사용해 Util 클래스를 인스턴스화 하여 써먹게된다. (인스턴스화 = 객체화)
이때 만들어진 Util 1 객체가 메모리에 올라가며, 그 객체 안에 데이터를 담고 관리하며 써먹을 수 있다.

만약 new 키워드를 두 번 더 사용하여 Util 2, Util 3 객체를 만든다면 어떻게 될까?

아무리 같은 Class 에서 찍어낸 객체라고 하더라도
메모리상에는 각각의 공간 (Util1, Uitl2 Util 3)을 할당받아 사용되게 될것이다.
(이 예시에서는 힙, 스택 등을 생각하지 않는다!)
그럼 만약
수정할 일이 없는 고정된 값 "변수 A"가 Util 클래스에 존재한다면, 어떻게 될까?
메모리 상에 변수 A가 세 개나 존재할 것이다.

위 그림은 메모리상 비효율적이다.
어차피 바뀌지 않을 값인데 쓸데없이 세 자리나 차지하고 있기 때문이다.
이는 작은 변수면 큰차이 없겠지만,
값이 커진다면 비효율적인 메모리 사용이다.
위 예시처럼 바뀌지 않을 값이거나,
여러 인스턴스에 참조해야 하는 값이라면,
한 곳에서 관리하는게 더 효율적이지 않을까?
이때 써먹는것이 Static 키워드 이다.
Static 키워드를 사용할 경우, 아래와 같이 메모리를 할당받아 공유하게 된다!

[ Static의 또 다른 특징 ]
앞서 Static은 값을 공유시켜주고 메모리에 하나만 적재되는 특징을 가졌다고 언급했다.
이 밖에도 Static의 큰 특징이 몇개 더 있다.
1. "Static 멤버는 속해있는 클래스의 객체를 만들지 않고도 참조할 수 있다."
2. "Static 멤버는 메모리에 할당된 후 프로그램 종료 시 까지 메모리에 존재한다."
위에서 말한것처럼 객체를 생성한 후 접근도 가능하지만,
객체를 만들지 않고도 Static 멤버에 접근할 수 있다.
Static 멤버는 반드시 클래스에 속해는데,, 어떻게 이런게 가능할까??
분명 new 연산자로 객체를 생성해야 사용이 가능하다고 알고있는데..
이를 알기 위해선 JVM의 동작 방식을 조금은 알아야한다.

JVM은 JAVA 코드는 JAVA 컴파일러를 통해 자바 바이트 코드로 변환시켜주는 가상 머신이다.
(JVM에 대해선 요 포스팅에서 다뤘다. https://pudroid.tistory.com/1)
쉽게 말해서, 우리가 짜놓은 코드를 이해하고 객체 생성부터 메모리 할당, 메모리 정리 등 다양한 역할을 담당한다.
이때 객체 생성을 담당하는 녀석이 바로 Class Loader 이다.
JVM의 Class Loader는 런타임(프로그램 동작) 중 객체 생성을 담당한다.
Class Loader의 동작은 다음과 같다.
이때 Class Loader가 Static 멤버를 Method Area에 같이 올라가게 되고,
이 멤버는 첫 객체 생성부터 Runtime(프로그램 실행)이 끝날때까지 메모리에 유지된다.
클래스의 객체는 어느곳에서도 쓰이지(참조하지) 않을경우 GC에 의해 메모리에서 지워지는것과는 다르게 메모리 Method Area에 끝날때까지 보관된다는 점이 차이점이다.
만약 어느 한 시점에,
아직 인스턴스를 만들지 않은 클레스의 값을 사용해야 할 경우
그 값을 Static으로 만들어서 사용하면
객체를 통째로 만들어 메모리에 올리는것보다 효율적이게 된다.
상황에 따라 사용하면 효과적이다.
그러나 메모리에 끝까지 남는다는 단점이 존재하여
메모리를 아낄려고 하는것보다 낭비되는것이 많을 수 있다.
따라서 무분별한 Static 사용은 위험하다.
[ 정리 ]
1. 멤버 A 를 하나 이상의 곳에서 공유하거나, 고정된 값으로서 메모리를 효율적 사용을 도와주는 키워드
2. Static 멤버는 메모리에 할당된 후 프로그램 종료 시 까지 메모리에 존재한다.
3. Static 멤버는 객체를 만들지 않고도 참조할 수 있다.
학부생 레벨에서 쓴 글로, 다소 부족한 부분이 있을 수 있으니 친절한 피드백을 매우 환영합니다.
'Android' 카테고리의 다른 글
| [Android] Companion Object 와 초기화 타이밍!! (2) | 2023.07.25 |
|---|---|
| [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 |