개발 언어/코틀린

코틀린(Kotlin) | object (like static)

jjiiiinn 2019. 6. 22. 18:07
728x90

object

  • 자바에서 객체를 생성시 클래스를 정의한후 new키워드를 이용해 객체를 생성해야한다.
  • 코틀린도 위와 같지만 object키워드를 사용하면 바로 객체를 생성할 수 있다.
  • 일반 객체처럼 .(dot)을 이용해서 프로퍼티 및 메서드에 접근 가능하다.
  • 클래스와 다르게 생성자(constructor)가 존재하지 않는다.
object Person {
    val name = "park jin"
    var age = 31

    fun printInfo() {
        println("name : $name, age: $age")
    }
}

fun main() {
    Person.printInfo() // name : park jin, age: 31

    Person.age = 0
    //Person.name = "" // error
    Person.printInfo() // name : park jin, age: 0

    // 바로 변수에 대입도 가능
    val student = object {
        val name = "student"
        val age = 21
    }
}

 

싱글톤 패턴

  • 선언과 동시에 객체가 되므 동일한 객체를 공유해서 사용하게 된다. (싱글톤)
/**
 * 하나의 Person 객체만 가질수 있다.
 * 적절하지 않은 예시 일수 있음;;;
 */
class Person private constructor() {
    var friends = mutableListOf<String>()

    object Instance {
        private val person: Person = Person()
        fun getInstance() = person
    }
}

fun main() {
    val person1 = Person.Instance.getInstance()
    person1.friends.add("park jin1")

    val person2 = Person.Instance.getInstance()
    person2.friends.add("park jin2")

    println(person1.friends) // [park jin1, park jin2]
    println(person2.friends) // [park jin1, park jin2]
}

 

동반 객체 (companion object)

  • 위와 같이 클래스 내부의 object를 접근하려면 object의 이름을 작성하여 접근할 수 있다.
  • companion object키워드를 사용하면 object의 이름을 생략 할 수 있다.
  • 이를 가지고 자바의 static 메서드를 흉내낼수 있다.
class Person private constructor() {
    
    val name = "park jin"
    
    companion object {
        fun init() = Person()
        // static 메서드와 마찬가지로 클래스의 인스턴스 변수에는 접근 불가
        //fun getName() = this.name // error
    }
}

fun main() {
    val person = Person.init()
}

 

익명 클래스 (Anonymous Class)

  • 내부 클래스 사용시 object 키워드를 사용한다.
  • 익명 클래스로 사용시 싱글톤이 아닌 실행될때 마다 객체를 생성한다.
interface Movable {
    fun move()
}

class Person(private val movable: Movable) {
    fun walk() = movable.move()
}

fun main() {
    val person = Person(object : Movable {
        override fun move() {
            println("person walk!!")
        }
    })

    person.walk() // person walk!!
}

 

자바와 다른점은 코틀린의 경우 익명함수 내에서 외부 클래스의 로컬 변수가 final이 아니더라도 접근 및 수정이 가능하다.
Java
public class PersonJava {

    public void move() {
        String name = "park jin"; // no final
        new Movable() {
            @Override
            public void move() {
                name = "jinn"; // error
                System.out.println(name + " is move"); // error
            }
        }.move();
    }
}
Kotlin
interface Movable {
    fun move()
}

class Person {
    fun walk() {

        var name = "park ijn" // no final

        object : Movable {
            override fun move() {
                name = "jinn" // 수정 가능
                println("$name is move") // 접근 가능
            }

        }.move()
    }
}

fun main() {
    val person = Person()
    person.walk() // jinn is move
}

 


출처

...더보기
728x90