정의: Java에서, static
은 '클래스 레벨'에서 변수나 메서드를 정의할 때 사용되는 수식어입니다.
특징:
static
멤버는 클래스가 메모리에 로드될 때 초기화됩니다. 그 결과, 클래스의 모든 인스턴스가 공유하는 하나의 메모리 위치에 존재합니다.static
클래스를 정의할 수 없습니다. 오직 변수, 메서드, 중첩된 내부 클래스만 static
으로 선언될 수 있습니다.public class Example {
public static int a = 10;
public static void staticMethod() {
System.out.println("staticMethod 입니다");
}
}
정의: object
는 Kotlin에서 싱글턴 패턴을 직접 구현하는 키워드입니다. 이는 특정 클래스의 단 하나의 인스턴스만을 생성하고 사용하고자 할 때 사용됩니다.
특징:
object
는 첫 접근 시점에 생성되며, 프로그램의 생명주기 동안 그 인스턴스는 유지됩니다.object
는 파라미터를 가진 생성자를 갖지 않습니다.object
는 다른 클래스나 인터페이스를 상속하거나 구현할 수 있습니다.object KotlinSingleton {
val singletonVar: Int = 10
fun singletonMethod() {
println("This is inside a singleton object.")
}
}
정의: companion object
는 Kotlin 클래스 내부에서 '클래스 레벨'의 함수나 변수를 정의하기 위해 사용됩니다.
특징:
companion object
의 멤버들은 해당 클래스의 인스턴스 없이 접근 가능합니다. 이는 Java의 static
과 비슷한 역할을 합니다.Companion
이라는 이름을 갖지만, 필요에 따라 다른 이름을 지정할 수 있습니다.companion object
는 다른 클래스나 인터페이스를 상속하거나 구현할 수 있습니다.static
중첩 클래스의 인스턴스가 생성되는 것이기 때문에 java의 static
변수, 함수와는 엄연히 다릅니다.class KotlinExample {
companion object {
val companionVar: Int = 10
fun companionMethod() {
println("This is inside a companion object.")
}
}
}
// 디컴파일
public final class KotlinExample {
@NotNull
private static final int companionVar = 10;
@NotNull
public static final KotlinExample.Companion Companion = new KotlinExample.Companion((DefaultConstructorMarker)null);
public static final class Companion {
@NotNull
public final String getcompanionVar() {
return User.companionVar;
}
public final void companionMethod() {
println("This is inside a companion object.");
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
}
Java의 static
은 클래스 레벨의 변수나 메서드를 위해 사용되며, Kotlin에서는 companion object
로 동일한 기능을 수행한다고 보시면 됩니다. 다만 **companion object**
는 **static**
과 달리 객체로써 생성이 된다는 것 입니다. 그렇기에 @JvmField
, @JvmStatic
다음과 같은 어노테이션을 통해 자바의 static 변수와 같이 사용할 수 있습니다.
object
는 Kotlin에서 싱글턴 패턴의 구현을 위해 사용되며, 이를 통해 하나의 인스턴스만을 갖는 객체를 생성할 수 있습니다. → 참고: 불필요한 객체 생성의 피해