146
자바에서 코틀린으로
코틀린에서는 이런 최상위 함수뿐 아니라 자바의 정적 멤버와 똑같이 인스턴스가 아닌 클래스
영역에서 정의된 프로퍼티와 함수를 정의할 수도 있다. 이들을 그냥
static
으로 표시하는 대
신 코틀린에서는 스칼라의 방식을 빌려와
object
선언안에 클래스 영역의 멤버 선언을 넣는
다. 이런 유형의
object
선언 (익명 타입을 만들어내는
object
식과 달리)은 싱글턴을 정의한
다. 싱글턴은 인스턴스가 단 하나뿐이고 이 인스턴스에 접근할 수 있는 지점에 전역 영역에 단
하나만 존재한다.
object
의 모든 멤버는 그 객체의 이름과 똑같은 이름의 클래스 안에 멤버로
들어가는데,
@
JvmStatic
으로 지정하지 않는 경우 실제 정적 멤버로 컴파일되지는 않는다. 코
틀린은 싱글턴 객체가 다른 클래스를 확장하거나 인터페이스를 구현하도록 허용하는 데, 정적
선언으로는 그런 일을 할 수 없기 때문이다.
정적 멤버와 비정적 멤버를 한 클래스 안에 모아야 하는 경우, 클래스 안에서 정적인 부분을
companion
object
안에 위치시키면 된다(이를 동반 객체라고 부른다). 동반 객체에 들어있
는 선언은 해당 선언이 속한 파일 안에서 한 그룹으로 묶이며, 동반 객체의 멤버는 동반 객체가
속한 클래스 인스턴스의 비공개 상태에도 접근할 수 있다. 동반 객체도 다른 클래스를 확장하
거나 인터페이스를 구현할 수 있는데, 자바의 정적 멤버에서는 이런 일이 불가능하다. 하지만
자바의 정적 멤버와 비교할 때, 정적 멤버가 한두 가지뿐이면 ...