개발(Android)/kotlin syntax

[Kotlin syntax] Objects

shinyelee 2022. 4. 6. 16:07

[코틀린 문법] 오브젝트

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)

 

 

[Android Studio/Kotlin] Singleton Pattern

[안드로이드 스튜디오/코틀린] 싱글턴 패턴(또는 싱글톤 패턴) MainActivity.kt package com.shinyelee.android_study2 import android.content.Intent import androidx.appcompat.app.AppCompatActivity import..

shinye0213.tistory.com


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")

    }

}

 


참고

반응형