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 키워드를 사용하자.
'Kotlin' 카테고리의 다른 글
[Kotlin] 반복문( for문, while문 ) (0) | 2023.11.05 |
---|---|
[Kotlin] 조건문 (if~else 문, when 문) (0) | 2023.11.04 |
[Kotlin] Sealed Class (0) | 2023.08.22 |
[Kotlin] 코틀린 Enum Class, 이늄(이넘) 클래스 (0) | 2023.08.21 |
[Kotlin] 코틀린 Data Class, 데이터 클래스 (0) | 2023.08.18 |