ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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()
    }
Designed by Tistory.