Kotlin

[Kotlin] 코틀린 Object, Companion Object

별볼일있는 개발자 2023. 8. 25. 11:27

1. Object

 : object 키워드는 여러개가 아닌 단 하나의 인스턴스만 필요할 때 사용하는 키워드이다. 싱글톤 패턴과 비슷하다

 

일반 클래스는 인스턴스를 만들기 위한 틀이라고 할 수 있다. 그래서 그 클래스 내부에 있는 속성이나 함수를 사용하기 위해서는 생성자를 통해서 인스턴스 객체를 만들어야 한다.

 

하지만 여러개의 인스턴스가 필요하지 않고 단 하나의 인스턴스만 필요한 경우에는 굳이 class를 쓸 필요없이 object 키워드를 통해서 단 하나의 인스턴스만 생성되도록 할 수 있다. 자바의 싱글톤 패턴과 같다고 보면 된다.

 

  • 객체 선언은 object 키워드로 시작한다.
  • 생성자가 필요없다.
  • 일반 클래스와 마찬가지로 object 클래스 안에도 프로퍼티, 메서드, 초기화 블록 등이 들어갈 수 있다.
  • 변수와 마찬가지로 객체 선언에 사용한 이름 뒤에 마침표(.)를 붙이면 객체에 속한 메서드와 프로퍼티에 접근할 수 있다.
  • object 클래스는 최초 사용되기 전까지는 초기화가 되지 않고, 최초 사용될 때 초기화가 된다.

 

아래 코드를 보면 일반 클래스인 Test1 클래스와 object 클래스인 Test2가 있다.

main 함수에서 Test1 클래스를 두 번 생성해서 각각 test1과 test2 변수에 담고,

Test2 클래스를 각각 test3과 test4에 각각 담아서 출력하는 코드이다.

아래 결과를 보면 일반 클래스인 Test1은 호출될 때마다 별개의 인스턴스가 생성되기 때문에 총 두 개의 인스턴스가 생성된 것을 알 수 있다.

 

그리고 아래쪽에 Test1 이름으로 생성된 인스턴스의 메모리 주소가 서로 다른 것을 알 수 있다.

 

하지만 Test2는 객체를 한 번만 생성하기 때문에, 변수에 아무리 여러번 담아도 인스턴스는 하나만 생성되는 것을 확인 할 수 있다.

 

아래쪽에 Test2의 인스턴스 주소값도 같은 주소값을 참조하는 것을 보아, object 클래스는 인스턴스를 하나만 생성하는 것을 알 수 있다.

 

 

 

한 가지만 더 봐보면, 아래 코드에서는 Number 라는 object 클래스가 있고 그 안에 num 변수와 num을 플러스, 마이너스 하는 함수가 있다.

메인함수에서 아래 코드와 같이 실행하면 어떻게 될까?  당연히 예상한대로, 0과 2가 출력된다. 

 

 

2. Companion Object

 : 클래스의 인스턴스 기능은 그대로 사용하면서, 인스턴스 간의 공용으로 사용할 변수나 함수를 만드는 기능

 

위의 예제와 비슷한 아래 코드를 보면 Number 이라는 일반 클래스가 있고 그 안에 companion object 키워드를 사용해서 인스턴스간 변수 num을 공유하도록 되있다.

 

메인 함수를 보면 Number 클래스를 생성해서 각각 num1과 num2에 담았다. Number 클래스는 일반 클래스이기 때문에 num1과 num2에는 서로 다른 인스턴스가 들어있다.

이 상태에서 num1 에서 plus 함수를 두번 호출하고 출력하고

num2에서 마이너스 함수를 한번 호출하고 변수값을 출력한다.

결과는 어떻게 나올까?

 

 

num1에서 plus 함수를 호출을 2번 했으니 예상했던대로 2가 나온다.

그 상태에서 num2를 호출하면 1이 나온다. 

num1과 num2는 다른 인스턴스이기 때문에 두번째 출력에서는 -1을 예상할 수도 있지만

인스턴스가 서로 달라도 companion object 키워드로 변수 num 을 공유하고 있기 때문에 -1이 아닌 1이 나오는 것을 알 수 있다.

 

자바의 static 과 비슷한 기능이다. 서로 다른 인스턴스간의 공유해야 할 프로퍼티가 있으면 companion object 키워드를 사용하자.