메모리를 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
일반적으로 우리가 만든 Class는 static 영역에 생성되고 new 연산을 통해 생성한 객체는 Heap영역에 생성한다.
static 영역에 있는 메모리는 Heap영역과는 달리 GC 영향을 받지 않고 모든 객체가 공유하는 메모리로 사용할수 있다. 하지만 프로그램이 끝날때까지 메모리가 할당된 채로 존재 하기 때문에 지나치게 사용하게 되면 퍼포먼스에 영향을 줄수가 있다.
static변수와 메소드는 Static 메모리 영역에 존재하므로 객체가 생성되기 이전에 이미 할당이 되어 있음 그렇기 때문에 객체의 생성없이 바로 접근 가능하다.
코틀린에서는 static이란 용어를 사용하지 않는다.
그 대신 companion object 라는 키워드를 사용하여 static을 대체 한다.
class CompanionObjectClass{
companion object{
val TAG = "CompanionObject"
fun createCompanionObject(){
println("this is companion Object")
}
}
}
public class StaticClass {
static String TAG = "Static";
static void createStatic() {
System.out.println("this is static");
}
}
public class callValueClass {
public static void main(String[] args) {
System.out.println(StaticClass.TAG);
StaticClass.createStatic();
System.out.println(CompanionObjectClass.Companion.getTAG());
CompanionObjectClass.Companion.createCompanionObject();
}
}
/*
결과
Static
this is static
CompanionObjectClass
this is companion Object
*/
그럼 companion object는 static과 동일 한 것일까?
아니다 static처럼 보일 뿐 static이 아니다 위 코드를 보면 코틀린에서 compaion object에 접근 하기 위해 CompanionObjectClass.Companion으로 쓰는 것을 확인 할수 있다.
이것을 통해서 대충 눈치를 챘을수도 있겠지만 companion object는 객체이다. CompanionObjectClass로 생성 할 때 마다 주소값이 다르다. 그래서 변수에 할당할 수 있다. 그 할당한 변수에서 CompanionObject에 정의된 companion object 멤버에 접근 할수 있다.
※ companion object 안에 const val 또는 @JVMStatic, @JVMField 로 선언한 변수는 Java에서 static 으로 선언하게 된다