Coding Memo
Kotlin 오브젝트 본문
오브젝트 (Object)
생성자 없이 객체를 만들어낼 수 있다. 즉 그 자체가 객체이다.
Java에서의 static과 같다고 보면 된다.
Java의 Math.random()을 사용했던 것을 떠올려보자.
Math 클래스를 따로 생성하지 않고 random() 함수를 실행시켰었다.
Singleton 패턴의 객체를 정의한다.
fun main() {
//x^2-3x+2
val e1:Array<Int> = arrayOf(1, -3, 2)
//x^2-9
val e2:Array<Int> = arrayOf(1, 0, -9)
var x11 = GetX.getQuadraticEquation1(e1[0], e1[1], e1[2])
var x12 = GetX.getQuadraticEquation2(e1[0], e1[1], e1[2])
println("e1: $x11, $x12, count: ${GetX.count}")
var x21 = GetX.getQuadraticEquation1(e2[0], e2[1], e2[2])
var x22 = GetX.getQuadraticEquation2(e2[0], e2[1], e2[2])
println("e2: $x21, $x22, count: ${GetX.count}")
}
object GetX {
var count = 0 //호출한 횟수
fun getQuadraticEquation1(a: Int, b:Int, c:Int) : Double {
count++
return (-b + (sqrt(b.toDouble().pow(2) - 4*a*c)))/(2*a)
}
fun getQuadraticEquation2(a: Int, b: Int, c: Int) : Double {
count++
return (-b - (sqrt(b.toDouble().pow(2) - 4*a*c)))/(2*a)
}
}
GetX를 2차 방정식의 근을 구해주는 Object로 선언하였다.
내부 변수(속성) 및 함수는 static으로 봐도 무방하다.
따라서 main 함수에서 GetX라는 객체를 생성하는 것 없이 getQuadraticEquation 함수를 수행할 수 있다.
count 변수는 내부 함수가 한번 호출 될 때마다 1씩 증가하도록 했는데 2번씩 호출 됐으므로 각각 2, 4가 출력되는 것을 알 수 있다.
object는 프로그램에서 최초로 사용할 시에 메모리에 올라간다.
익명의 객체를 선언시에도 사용하는데 안드로이드와 같은 UI가 있을 때 유용하다.
val obj = object : MouseAdapter() {
override fun mouseClicked(event: MouseEvent) { ... }
override fun mouseEntered(event: MouseEvent) { ... }
}
Companion Object
클래스 안에서도 object를 만들고 사용이 가능하다.
companion object를 이용한다.
Java에서의 static과 비슷한 역할을 한다.
fun main() {
var cat = Animal("Cat")
cat.add()
cat.add()
var dog = Animal("Dog")
println("Animal.totalCount: ${Animal.totalCount}")
println("cat.count: ${cat.count}")
println("dog.count: ${dog.count}")
}
class Animal(val name: String) {
var count = 0 //마릿수
companion object {
var totalCount = 0 //동물 전체 마릿수
}
init {
totalCount++
count++
}
fun add() {
count++
totalCount++
}
}
class 내부의 companion object를 호출 할 때는 클래스명을 통해 바로 참조한다.
인스턴스로 만들어진 객체에서는 참조할 수 없다. (cat과 dog에서는 totalCount를 참조할 수 없다.)
'Language > Kotlin' 카테고리의 다른 글
Kotlin 문자열 (0) | 2021.01.05 |
---|---|
Kotlin 옵저버 패턴 (0) | 2021.01.03 |
Kotlin 스코프 함수 (0) | 2021.01.02 |
Kotlin 인터페이스 (0) | 2021.01.02 |
Kotlin 고차 함수 / 람다 함수 (0) | 2020.12.31 |