Kotlin

Kotlin object

dev_roach 2021. 11. 15. 22:01
728x90

코틀린에는 object 라는 새로운 키워드가 도입되었다.

자바에는 이 키워드가 없는데 코틀린에서는 object 가 어떤 역할을 하게 되는지 알아보자.

 

백문이 불여일견 코드를 한번 작성해보자.

위의 코드는 급여를 계산하는 간단한 object 코드이다.

코틀린에는 자바와는 다르게 static keyword 가 존재하지 않는다.

 

그래서 object 로 선언해서 생성하게 되면 클래스 선언과 동시에 객체가 생성된다.

일단 object 는 싱글톤으로 구현되는 장점이 있다.

어떻게 Singleton 으로 구현되는 것일까? 컨버팅된 자바코드를 한번보자.

위의 코드를 컨버팅한 자바코드이다.

 

위를 보면 INSTANCE 에 Payroll 객체를 집어 넣는 모습이다. 

하지만 위에 만 본다고 해서 전혀 싱글톤이 될거 같지는 않다. 그렇담 이걸 쓰는 부분에서 다르게 쓰고있을 것이다. 메인문을 보자.

메인 문을 보니 INSTANCE 에 붙어서 모든 메소드나 값들에 접근하고 있다.

위와 같이 이제 싱글톤이 어떻게 가능한 것인지 코틀린 코드를 자바코드로 컨버팅해서 알수 있게 되었다.

 

근데 하나 생각해봐야할 점은 Kotlin 에서 static method 를 써야할 때 가 있다.

 

Java 를 공부해봤으면 알겠지만, static 키워드는 클래스 멤버임을 증명하기 위해 사용된다. 

즉, static 이 붙어 있는 멤버들은 클래스가 메모리에 적재될때 같이 적재되므로 '.' 을 통해서 바로 접근할 수 있게된다.

 

코틀린에는 static 이라는 키워드가 없는데, 이를 최상단 함수로도 타파할 수 있지만.

클래스 멤버를 구성하기 위해서는 다른 방법이 필요하다.

 

그래서 위의 Java static 멤버들처럼 Class 가 메모리에 Load 될때 함께 생성될 클래스 멤버들을 표기해주어야 한다.

그래서 Kotlin 에서는 companion object 라는 키워드를 도입하였다.

내 생각에는 같이 동반하여 적재되기에 companion 이라는 단어를 쓴것이 아닐까 싶다.

 

한번 간단하게 코드를 한번 작성해보자.

위와 같이 companion object 를 통해서 Java 의 static method 처럼 사용할 수 있다.

그렇다면 companion object 는 단순히 static 하게 쓸수 있게 해주는걸까?

한번 Java 코드를 살펴보자.

살펴보니 Roach 라는 클래스안에 Companion 이라는 전역 객체를 하나 만들어버린다.

과연 Main 에서는 이를 어떻게 부르고 있을까?

여기서 한가지 코드를 보고 추측할 수 있는 것이 있다.

첫번째로는 Roach.Companion 이 companion object instance 를 전달하는 것 같아보인다는 점이다.

이를 한번 실험해보자.

이를 통해 우리는 객체를 전달받는 다는 점을 알았다.

 

자바의 static 과는 따라서 다르다는 것을 알 수 있다. 

Java 의 static 은 이런식으로 참조를 받는 것이 불가능하다.

이를 통해서 kotlin 의 companion object 는 클래스 멤버이지만 하나의 독립된 객체로서 여길 수 있다는 사실을 알게되었다.

 

두번째로 추측할 수 있는 점은 Companion 이라는 이름이 Default 같다는 점이다.

한번 Naming 을 바꿔보자.

이렇게 코드를 변경해보았다.

이제 자바코드를 한번보자.

이제 Dodo 로 바뀐 것을 확인할 수 있다.

따라서 companion object 는 기본적으로 default name 이 Companion 임을 알 수 있다.

 

이처럼 Companion object 에 대해서 이제 기본적인 부분들을 안것같다.

그렇담 만약에 상속이 된다면 어떻게 될까? 한번 실험해보자.

우리의 예상처럼 결과가 출력되는 모습을 확인할 수 있다.

Child 의 method1 을 보면 부모에서 getParent() 를 호출하는 모습을 볼 수 있다.

 

그렇다면 두개 속성의 이름을 똑같이 같이한다면 어떻게 될까?

위와 같은 결과가 도출된다.

 

우리는 이를 통해서 어느정도 다형성을 만족하고 있음을 알기 위해서는 Parent Type 에 Child 를 넣을 수 있는지 한번 확인해보자.

위와 같이 Type 을 넣는것도 가능

하지만 Child 의 Props 가 아닌 Parent 의 Props 가 나오게 된다.

이는 다형성에 위배되는 것이다. 따라서 Child 의 Props 가 나오게 하기 위해 override 를 해보자.

이젠 child 의 props 가 나오게 된다.

 

오늘은 간단하게(?) companion object 의 대해 알아보았다.

오늘 정리된 글을 이해한다면 java 의 static 과는 다른 개념이라는걸 알 수 있을 것이다.

728x90

'Kotlin' 카테고리의 다른 글

[Mac] Kotlin 설치 및 CLI 에서 사용하기  (0) 2021.12.06
Kotlin Null 처리  (0) 2021.11.18
Kotlin JPA - 상속 관계 맵핑  (0) 2021.11.17
Kotlin JPA  (0) 2021.11.16
Kotlin 변수 선언  (0) 2021.11.13