-
[Kotlin] object코틀린 공부/코틀린 기초 2024. 5. 23. 15:30
object는 코틀린에서 클래스를 정의함과 동시에 객체를 생성하는 것이다.
object는 Singleton Pattern을 언어 차원에서 지원한다고 생각하면 이해가 더 쉬울 것 같다.
object로 생성된 객체의 특징
- class 키워드 대신 object 키워드를 사용해서 클래스를 정의함과 동시에 객체를 생성한다.
- 일반 클래스처럼 프로퍼티, 메소드, 초기와 블록을 가질수 있지만, 생성자는 가질 수 없다.
- 클래스를 상속 받을 수 있고, 여러개의 인터페이스를 갖을 수 있다.
그래서 object는 kotlin에서 크게 3가지 방식으로 사용이 가능하다
Fig1 . usage of object keyword 1. 객체 선언(Object Declaration)
객체 선언은 Singleton pattern을 쉽게 구현할 수 있게 해준다.
object로 선언된 객체는 최초 사용시 자동으로 생성되며 이후에는 코드 전체에서 공용으로 사용될 수 있으므로 프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는 것이 좋다.
object ObjectCounter { var count = 0 fun countUp() { count++ } }
println("1. ${ObjectCounter.count}") ObjectCounter.countUp() ObjectCounter.countUp() println("2. ${ObjectCounter.count}") 결과 : 1. 0 2. 2
위와 같이 class 키워드 대신 object를 사용하면 객체가 단 하나 만들어지는 클래스를 만들 수 있고, 추가로 그 객체를 사용할 떄는 이름을 통해서 사용할 수 있다.
2. 동반 객체 (Companion Object)
class 안에도 object를 만들어 사용 가능하다. 그것이 companion object 다
class의 instance 기능은 그대로 사용하면서 instance간에 사용되는 공용 속성 및 함수를 별도로 만드는 기능이다.
기능적으로는 자바에서 사용하는 static 맴버와 비슷하다고 생각해도 된다.
class ObjectFoodPoll(val name: String) { companion object { var total = 0 } var count = 0 fun vote() { total++ count++ } }
val objectFoodPollA = ObjectFoodPoll("치킨") val objectFoodPollB = ObjectFoodPoll("피자") objectFoodPollA.vote() objectFoodPollA.vote() objectFoodPollB.vote() objectFoodPollB.vote() objectFoodPollB.vote() println("${objectFoodPollA.name} : ${objectFoodPollA.count} / ${ObjectFoodPoll.total}") println("${objectFoodPollB.name} : ${objectFoodPollB.count} / ${ObjectFoodPoll.total}") // 결과 : 치킨 : 2 / 5 피자 : 3 / 5
total은 companion object 중괄호 안에 넣었기 때문에 class의 인스턴스를 새로 만드는 것과 상관없이 공유되는 숫자를 사용할 수 있다.
https://rnathsus.tistory.com/335
3. 객체식 (Object Expression)
객체식은 객체를 반환한다. 여기서 반환하는 객체는 이름 없는 무명 객체이다.
객체식은 1회용으로 사용할 때 유용하다.
무명객체는 자바의 무명 내부 클래스랑 같다고 생각하면 된다.
자바에서 무명 내부 클래스 선언한 예제 :
button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked! 안녕"); } });
코틀린에서 무명 객체 구현한 예제 :
button.addActionListener(object : java.awt.event.ActionListener { override fun actionPerformed(e: java.awt.event.ActionEvent) { println("Button clicked! 안녕") } })
- 객체 식을 정의하면 추상 클래스나 인터페이스를 구현한 객체가 생성되고, 이 객체를 변수에 저장하여 재사용하는 것도 가능하다.
- 익명의 내부 클래스 한개는 여러개의 추상 클래스나 인터페이스를 구현할 수 있고다.
- 익명 객체를 포함하는 함수나 클래스의 프로퍼티에도 접근이 가능하고 수정도 가능하다.
interface InterfaceA { fun methodA() } interface InterfaceB { fun methodB() } fun main() { val instance = object : InterfaceA, InterfaceB { override fun methodA() { println("methodA 실행") } override fun methodB() { println("methodB 실행") } } instance.methodA() instance.methodB() }
'코틀린 공부 > 코틀린 기초' 카테고리의 다른 글
[Kotlin] in out 키워드 (0) 2024.05.27 [Kotlin] 스코프 함수 (Scope Function) (0) 2024.05.23 [Kotlin] 고차함수와 람다함수 (0) 2024.05.22 [Kotlin] 추상 클래스와 인터페이스 (0) 2024.05.21 [Kotlin] 코틀린 class (open, data , sealed, internal class) (0) 2024.05.17