본문 바로가기
개발언어/Kotlin : 코틀린

코틀린 익히기 6 - 프로퍼티와 object

by 개발자D 2023. 9. 25.

코틀린 익히기 6 - 프로퍼티와 object

프로퍼티

지난 글에서 공부했던 프로퍼티에 대해 더 자세히 알아봅시다. 프로퍼티는 객체의 구성요소로서 객체가 가지는 데이터들을 뜻합니다.

코틀린의 프로퍼티는 자동으로 게터와 세터가 생성되어 인스턴스.프로퍼티 로 객체에 접근하거나 값을 변경하는 것이 가능합니다.

만약, 게터와 세터를 직접 지정하고 싶다면 다음과 같은 방법을 사용합니다.

value : 외부로부터 받아온 값
field : 프로퍼티를 참조하는 변수

var 프로퍼티명: 프로퍼티타입 = 매개변수로 받아온 프로퍼티
	get() = field
	set(value) {
		field = value
	}

 


지연 초기화 lateinit, lazy

코틀린 익히기 2 - 자료형, 연산자에서 짧게 다뤘던 지연초기화를 기억하시나요? 생성과 동시에 초기화하기 어려운 경우 lateinitlazy 키워드를 사용하여 지연 초기화합니다. 

 

lateinit 

lateinit var 변수명: 자료형

 

lateinit의 제한

  • var에서만 사용할 수 있습니다.
  • Int, Long, Short, Double, Float, Boolean, Byte 자료형은 사용할 수 없습니다.
  • 프로퍼티에 대한 게터와 세터를 사용할 수 없습니다

lateinit의 특징

  • 사용 전 원하는 시점에 초기화할 수 있습니다.

 

lazy 

val 변수명: 자료형 by lazy {
	...
}

 

lazy의 제한

  • val에서만 사용할 수 있습니다.

lazy의 특징

  • 변수가 처음으로 사용되는 시점에 by lazy 블록 {} 이 실행되며 리턴값이 초기값으로 할당됩니다.

 


위임 Deligation

지연 초기화의 lazy에서 앞에 by라는 키워드를 붙여 사용했죠. by는 위임 역할을 합니다. 위임이 무엇이고 어떻게 위임할 수 있는지 알아봅시다.

 

by를 통한 위임

위임은 책임을 넘겨주는 것입니다.

 

프로퍼티 위임

프로퍼티의 위임은 게터, 세터의 책임 특정 객체에게 넘겨주는 것을 의미합니다. 따라서 by lazy를 사용하여 lazy 객체에게 초기화 권한을 넘길 수 있었던 것이죠.

<val|var> 프로퍼티 이름: 자료형 by 프로퍼티를 대신할 객체

 

 

클래스 위임 (인터페이스 구현 위임)

클래스의 위임은 구현의 책임특정 객체에게 넘겨주는 것을 의미합니다. by 위임으로 인터페이스를 구현하지 않고도, 이미 인터페이스를 구현한 클래스의 메서드를 사용할 수 있습니다.

class 클래스 이름 : 인터페이스 by 인터페이스를 구현한 클래스의 객체

 

observable() 메서드의 위임

import kotlin.properties.Delegates

프로퍼티를 감시하고 있다가 특정 코드의 로직에서 변경이 일어날 때 호출되는 콜백함수입니다.

import kotlin.properties.Delegates

class Student {
	var name: String by Delegates.observable("Cheolsu") {
		prop, old, new ->
			println("$old -> $new") // 이벤트가 발생할 때 실행
	}
}

fun main () {
	val student = Student()
	student.name = "Younghee" 
  	student.name = "Minju"
}

// Cheolsu -> Younghee
// Younghee -> Minju

 

vetoable() 메서드의 위임

import kotlin.properties.Delegates

프로퍼티를 감시하고 있다가 특정 코드의 로직에서 변경이 일어날 때 람다식의 반환값이 true일 때만 변경을 허락합니다.

import kotlin.properties.Delegates

class Student {
	var name: String by Delegates.vetoable("Cheolsu") {
		prop, old, new ->
			new.length > old.length
	}
}

fun main() {
	val student = Student()
    println(student.name)
	student.name = "Younghee"
    println(student.name)
  	student.name = "Minju"
    println(student.name)
}

// Cheolsu
// Younghee
// Younghee

 


컴패니언 객체 (이름 △, 싱글톤 O)

컴패니언 객체는 프로퍼티나 메서드를 자바의 static 멤버처럼 사용할 수 있게 합니다. 클래스 안에 companion object 키워드로 선언합니다. 컴패니언 객체는 싱글톤으로 생성되며 클래스명.companion object의 멤버로 접근할 수 있습니다. [companion object 이름] 처럼 뒤에 이름을 붙여 사용하는 것이 가능합니다.

class 클래스명 {
    companion object {
    	프로퍼티
        메서드
    }
}

 

❓ 싱글톤이란 무엇인가요?

- 싱글톤이란 하나만의 객체를 생성하고 어디에서든 그 객체를 참조할 수 있게 만드는 디자인 패턴입니다.

object 선언 (이름 O, 싱글톤 O)

class 대신 object로 선언하면 컴패니언 객체처럼 인스턴스를 만들지 않고 object이름.멤버로 접근할 수 있습니다. 생성자는 사용할 수 없지만 init 초기화 블록은 사용할 수 있습니다. object 접근 시에 싱글톤으로 객체가 생성됩니다. 

전역으로 사용할 수 있는 싱글톤 객체를 만들고 싶을 때 사용합니다. 

object OCar : Car {
	fun drvie() = {}
	init {
		println()
	}
}

fun main() {
	OCar.drvie() 
}

 

❗ 위에서 배운 컴패니언 객체는 사실 Companion이라는 이름의 object선언과 같습니다. 즉, object Companion {} 과 같습니다. 

 

object 표현식 (이름 X, 싱글톤 X)

자바의 익명객체와 같이 사용할 수 있는 object 표현식입니다. object 표현식은 object 선언과 달리 싱글톤으로 생성되지 않습니다. 이름이 없기 때문에 재사용이 불가능 합니다.

일회성으로 사용할 객체를 만들고 싶을 때 사용합니다.

// 상속받거나 구현하고 싶을 때 

object: 상속받을 클래스() 혹은 구현할 인터페이스 {
	override ...
}

// 그냥 일회용으로 사용할 객체를 만들 때

object {}

 


앞선 글들을 공부하셨다면 지속적으로 언급되는 프로퍼티에 대해 궁금하셨겠죠? 이번글에서는 프로퍼티의 생성과 초기화 등에 대해 자세히 알아보았습니다.

자바를 먼저 공부하신 분들께서는 static 변수에 대응되는 것이 무엇인지도 궁금하셨을 것 같습니다. 코틀린에서는 companion object를 사용합니다. object선언과 표현식은 클래스 대신 아주 유용하게 사용될 수 있습니다. 다음 글에서는 다양한 클래스와 인터페이스로 찾아오겠습니다.

 

코틀린 익히기 7 - 다양한 클래스와 인터페이스

코틀린의 다양한 클래스 - 추상 클래스, 데이터 클래스, 내부 클래스, 열거형 클래스, 실드 클래스 추상 클래스 abstract class : 추상 프로퍼티, 추상 메서드, 일반 프로퍼티, 일반 메서드 abstract class

devdharu.tistory.com