Kotlin - Object Class

이동수·2024년 9월 25일

Kotlin

목록 보기
27/33
post-thumbnail

기존 클래스

  • 인스턴스를 만들기위한 틀 -> 내부에 있는 속성이나 함수를 사용하려면 생성자를 통해 인스턴스 객체를 만들어야함( ex) val c = person("이동수",1996))
  • 그러나 여러개의 인스턴스 객체가 필요하지 않고 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 클래스말고 object쓰면

object

사용하는 이유

사용하는 곳

  • 이거는 무저건 싱글턴으로 써야겠다 하는거

특징

사용법

object ObjectSerialNumber {
    private lateinit var random: Random
    fun  genarateSerialNumber() : String {
        if (!this::random.isInitialized) {
            random = Random(System.currentTimeMillis())
        }
        return abs(random.nextInt()).toString()
    }
}
  • 생성자 없이 직접 객체를 만들어냄 (생성자를 가질 수 없다)
  • 이름은 가질 수 있음
  • 인스턴스 생성안해도됨, 그자체가 객체
  • 싱클턴 패턴 사용이 쉬움
    • 싱글턴 패턴 - 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
  • 호출 방법은 인스턴스 생성이아니라, 이름쓰고 변수or함수 호출하는거 (오브젝트 이름에 직접 참조연산자를 붙여 사용한다)
    //간단하게
    object a{
    	var b
    	fun c
    }
    
    a.b
    a.c()
  • object로 선언된 객체는 최초사용시 자동생성
    이후에는 코드 전체에서 공용으로 사용될 수 있음(프로그램이 종료될때까지 공통적으로 사용되는 것을 묶어 만드는게 좋다)
    ```kotlin
    fun main(){
        println(Counter.count)
    
        Counter.countUp()
        println(Counter.count)
    }
    object Counter { //인스턴스 자체가 객체이므로 생성자 사용x
        var count = 0
    
        fun countUp(){
            count++
        }
        fun clear(){
            count = 0
        }
    }
    ```

companion object

사용하는 이유

사용하는 곳

특징

사용법

  • 싱글턴 + 팩토리
  • 클래스 안에 사용하는 object
  • 클래스 인스턴스 기능은 그대로 사용하면서, 인스턴스간에 공통으로 사용할 함수를 만드는거 (static이랑 비슷), 공통모듈에서 많이 쓰임\
  • outer 클래스의 정적멤버(함수,속성)가 된다
  • outer클래스의 싱글턴을 구현할때 많이 사용한다. ( +팩토리)
  • companion을 사용하면 outer에 많은 내부 클래스를 구현하지 않아도 사용 가능
fun main(){
    var jj = food("자장")
    var jp = food("짬뽕")
    jj.vote()

    jp.vote()
    jp.vote()

    println("${jj.name} : ${jj.count}")  //1
    println("${jp.name} : ${jp.count}")  //2
    println("총계 : ${food.total}")       //3
}

class food(val name : String){
    var count = 0           //개별 투표수

    companion object{
        var total = 0       //전체 투표수
    }
    fun vote(){
        total++
        count++
    }
}
  • companion object가 아니라 그냥 var total = 0으로 했으면 food.total이 호출이 안됨. jj.total을 하면 1, jp.total을 하면 2가 출력

번외

  • object는 이름 안쓰는게 convention임
  • 객체는 무저건 heap memory에 생긴다. 객체를 여러개 만들어서 객체가 많아지면 heap memory꽉 차게 되어 프로그램이 멈춰버린다. 하나의 객체만 사용하기 위해 object를 사용
    • ex) 사원들마다 랜덤번호 지정해주기 → 사원들마다 랜덤번호를 객체로 만들어주면 과부하

0개의 댓글