+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.
객체 (object)
- 오직 하나의 인스턴스만 존재하는 클래스는 object라는 키워드로 정의하며 객체라 부른다.
- 객체는 선언과 동시에 인스턴스가 생성된다. (객체 이름 = 타입 이름 = 인스턴스 이름)
object Application { // 타입 이름이자 객체 이름
val name = "My Application"
override fun toString() = name // 객체의 이름 반환
// toString 은 이미 상위 클래스에서 사용되고 있으므로 override 사용 (모든 객체는 toString 함수를 갖고 있다.)
fun exit() {} // 빈 함수
}
fun main() {
println(Application) // My Application
// Kotlin에서 객체 호출시 해당 객체의 toString() 함수를 호출하고 출력된다.
}
내부 객체
- 특정 클래스의 모든 인스턴스가 공유하는 객체를 만들 때 내부 객체를 정의하여 사용한다.
class Application private constructor(val name: String){ // 외부에서 생성자 직접 사용 불가
object Factory {
fun create(args: Array<String>) : Application? {
val name = args.firstOrNull() ?: return null
// firstOrNull: 배열의 첫 번째 요소가 널이 아니라면 첫 요소 반환, 널이라면 null값 반환
return Application(name)
}
}
override fun toString() = name
}
fun main() {
val a = Application.Factory.create(arrayOf("My Application")) // 배열로 인자 전달
// Application 클래스의 객체 Factory의 create 함수를 이용하여 Application 인스턴스 생성
println(a) // a의 name 출력
}
동반 객체 (companion object)
- 앞의 예제에서 Factory라는 내부 객체명을 매번 명시해야 한다.
=> companion object로 선언하면 내부 객체명을 생략할 수 있다. (java의 static 과 같은 개념)
class Application private constructor(val name: String){
companion object { // Application 클래스를 대표하는 단독 객체!!
fun create(args: Array<String>) : Application? {
val name = args.firstOrNull() ?: return null
return Application(name)
}
}
override fun toString() = name
}
fun main() {
val a = Application.create(arrayOf("My Application"))
println(a)
}
객체 식을 통한 익명 객체 정의
- 익명의 객체를 프로그램 흐름에 생성하고자 할 때도 object를 사용한다.
fun main() {
fun midPoint(xRange: IntRange, yRange: IntRange) = object {
// IntRange: 정수 범위 타입
val x = (xRange.first + xRange.last) / 2
val y = (yRange.first + yRange.last) / 2
}
val midA = midPoint(1 .. 5, 2 .. 6)
val midB = midPoint(1 .. 8, 30 .. 40)
println("${midA.x}, ${midA.y}") // 3, 4
println("${midB.x}, ${midB.y}") // 4. 35
}
- 익명 객체를 사용하는 함수는 단독으로 사용할 수 없다.
=> 함수 안에 함수를 정의하거나, private를 사용해야한다.
private fun midPoint(xRange: IntRange, yRange: IntRange) = object {
// IntRange: 정수 범위 타입
val x = (xRange.first + xRange.last) / 2
val y = (yRange.first + yRange.last) / 2
}
fun main() {
val midA = midPoint(1 .. 5, 2 .. 6)
val midB = midPoint(1 .. 8, 30 .. 40)
println("${midA.x}, ${midA.y}") // 3, 4
println("${midB.x}, ${midB.y}") // 4. 35
}
'Study > Kotlin Study' 카테고리의 다른 글
[Kotlin] 확장 (0) | 2023.10.09 |
---|---|
[Kotlin] 함수형 프로그래밍 (0) | 2023.09.22 |
[Kotlin] 단순한 변수 이상인 프로퍼티 (0) | 2023.09.17 |
[Kotlin] 널 가능성 (0) | 2023.09.12 |
[Kotlin] 함수 (4) | 2023.09.03 |