[코틀린 문법] 오브젝트
Object(객체), Singleton Pattern(싱글톤/싱글턴 패턴)
// Object(오브젝트) //
// 객체를 한 개만 생성하도록 하며 전역으로 생성 가능
// 하나의 객체로 공통적인 속성과 함수를 사용해야 할 때 -> 클래스보다 오브젝트가 나음
// 싱글톤 패턴을 언어 차원에서 지원하는 것
// Singleton Pattern(싱글톤 패턴) //
// 디자인 패턴(코드를 어떻게 짜는게 더 좋고, 어떤 방식으로 구성해야 유지보수가 쉬운가) 중 하나
// 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
fun main() {
// 오브젝트는 인스턴스를 생성하지 않음
// -> 오브젝트명.멤버명 형태로 사용
println(Counter.count)
// 0
Counter.countUp()
println(Counter.count)
// 1
Counter.countUp()
println(Counter.count)
// 2
Counter.clear()
println(Counter.count)
// 0
// 오브젝트로 선언된 객체는 최초 사용시 자동으로 생성됨
// -> 이후에는 코드 전체에서 공용으로 사용할 수 있음
}
// 오브젝트는 객체 그잡채 -> 생성자 사용하지 않음
object Counter {
var count = 0
fun countUp() {
count++
}
fun clear() {
count = 0
}
}
// 싱글톤 패턴 보충설명
fun main() {
// 10마력짜리 car 생성
val car = CarFactory.makeCar(10)
// 20마력짜리 car2 생성
val car2 = CarFactory.makeCar(20)
println(car)
// Car(horsePower=10)
println(car2)
// Car(horsePower=20)
println(CarFactory.cars.size.toString())
// 2
}
// 싱글톤 패턴
object CarFactory {
// cars라는 이름의 자동차 리스트
val cars = mutableListOf<Car>()
// 자동차 생성하는 함수
fun makeCar(horsePower: Int) : Car {
// 몇 마력?
val car = Car(horsePower)
// 리스트에 추가
cars.add(car)
// 리턴
return car
}
}
// 데이터 클래스
data class Car(val horsePower : Int)
Companion Object(동반 객체)
// Companion Object //
// 클래스의 인스턴스 기능은 그대로 사용하면서
// 인스턴스간에 공용으로 사용할 속성과 함수를 별도로 만드는 기능
// 다른 언어의 Static 멤버와 비슷함
// Static 멤버 //
// 클래스 내부에서 별도의 영역에 고정적으로 존재하며
// 인스턴스를 생성하지 않아도 공용으로 사용 가능한 속성이나 함수
fun main() {
var a = FoodPoll("짜장")
var b = FoodPoll("짬뽕")
a.vote()
a.vote()
b.vote()
b.vote()
b.vote()
// 짜장 투표수
println(a.count)
// 2
// 짬뽕 투표수
println(b.count)
// 3
// 전체 투표수
println(FoodPoll.total)
// 5
}
class FoodPoll (val name: String) {
// 전체 투표수
companion object {
var total = 0
}
// 개별 투표수
var count= 0
// 투표 1씩 증가
fun vote() {
total++
count++
}
}
// 동반 객체 보충설명
fun main() {
// 객체 생성
// 중간에 Companion 생략 가능
// val theBook = TheBook.Companion.create()
val theBook = TheBook.create()
// TheBook(getId(), "new book")
// 역시 BookFactory 생략 가능
// val bookId = TheBook.BookFactory.getId()
val bookId = TheBook.getId()
// return 40
println("${theBook.id} ${theBook.title}")
// theBook.id <- getId() <- 40
// theBook.title <- myBook <- "new book"
// 40 new book
}
interface IdProvider {
fun getId() : Int
}
class TheBook private constructor(val id : Int, val title : String) {
// 동반 객체에 이름 붙이기 가능
companion object BookFactory : IdProvider {
override fun getId(): Int {
return 40
}
val myBook = "new book"
fun create() = TheBook(getId(), myBook)
// TheBook(40, "new book")
}
}
참고
반응형
'개발(Android) > kotlin syntax' 카테고리의 다른 글
[Kotlin syntax] Polymorphism (0) | 2022.04.06 |
---|---|
[Kotlin syntax] Observer Pattern, Anonymous Objects (0) | 2022.04.06 |
[Kotlin syntax] Scope Functions (0) | 2022.04.05 |
[Kotlin syntax] Higher-Order Functions, Lambda Functions, Unit (0) | 2022.04.05 |
[Kotlin syntax] Scope, Access Modifier(Public/Internal/Private/Protected) (0) | 2022.04.05 |