English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 예제를 통해 객체 선언(싱글턴)과 객체 표현식을 이해할 수 있습니다.
싱글턴은 한 개의 인스턴스(객체)만을 가질 수 있는 객체 지향 패턴입니다.
예를 들어, SQL 데이터베이스 백엔드를 가진 애플리케이션을 개발 중이고, 데이터베이스에 접근하기 위해 연결 풀을 생성하고 모든 클라이언트가 동일한 연결을 재사용하고자 합니다. 이를 위해 싱글턴 클래스를 통해 연결을 생성하여 각 클라이언트가 동일한 연결을 얻을 수 있도록 합니다.
Kotlin은 object 키워드를 사용하여 간단하게 싱글턴을 생성할 수 있는 기능을 제공합니다. 이를 위해 object 키워드를 사용합니다.
object SingletonExample { ... .. ... //클래스 본체 ... .. ... }
위의 코드는 클래스 선언과 SingletonExample 클래스의 단일 인스턴스 선언을 결합했습니다.
객체 선언은 속성, 메서드 등을 포함할 수 있습니다. 그러나, 생성자(그 이유도 있지만)를 포함하지 않습니다.
일반 클래스의 객체와 마찬가지로 . 기호를 사용하여 메서드를 호출하고 속성에 접근할 수 있습니다.
object Test { private var a: Int = 0 var b: Int = 1 fun makeMe12(): Int { a = 12 return a } } fun main(args: Array<String>) { val result: Int result = Test.makeMe12() println("b = ${Test.b}") println("result = $result") }
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
b = 1 result = 12
객체 선언은 일반 클래스와 인터페이스에서도 상속될 수 있습니다.
객체 선언은 때로는 매우 유용할 수 있지만, 대규모 소프트웨어 시스템의 많은 다른 부분과의 상호작용에서는 최적이지 않습니다.
object 키워드는 익명 클래스의 객체를 생성하는 데도 사용될 수 있습니다. 익명 객체라고도 합니다. 특정 클래스나 인터페이스를 조금 수정한 객체를 생성하려고 할 때, 그 클래스의 서브클래스를 선언하지 않아도 됩니다. 예를 들어:
window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } }
이곳에서 MouseAdapter 클래스를 확장하는 익명 객체가 선언되었습니다. 이 프로그램은 mouseClicked()와 mouseEntered() 메서드를 재정의합니다.
필요하다면 익명 객체에 이름을 부여하고 변수에 저장할 수 있습니다. 예를 들어:
val obj = object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } }
open class Person() { fun eat() = println("식을 먹습니다."} fun talk() = println("인간과 대화를 합니다."} open fun pray() = println("천공에 기도를 합시다.")}} } fun main(args: Array<String>) { val atheist = object : Person() { override fun pray() = println("나는 기도하지 않는다. 나는 무신론자다.") } atheist.eat() atheist.talk() atheist.pray() }
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
먹다. 사람과 대화를 나누다. 나는 기도하지 않는다. 나는 무신론자다.
이곳에서 익명 객체는 atheist 변수에 저장되며, Person 클래스를 구현하고 pray() 메서드가 재정의됩니다.
구현된 클래스가 익명 객체의 생성자를 가지고 있다면 적절한 생성자 파라미터를 전달해야 합니다. 예를 들어,
open class Person(name: String, age: Int) { init { println("이름: $name, 나이: $age") } fun eat() = println("식을 먹습니다."} fun talk() = println("인간과 대화를 합니다."} open fun pray() = println("천공에 기도를 합시다.")}} } fun main(args: Array<String>) { val atheist = object : Person("Jack", 29) { override fun pray() = println("나는 기도하지 않는다. 나는 무신론자다.") } atheist.eat() atheist.talk() atheist.pray() }
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
이름: Jack, 나이: 29 먹다. 사람과 대화를 나누다. 나는 기도하지 않는다. 나는 무신론자다.