개발 언어/코틀린
코틀린(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