본문 바로가기
프로그래밍/코틀린

코틀린, 정적 멤버와 컴패니언 객체(companion object)

by K-인사이터 2024. 3. 7.
반응형

안녕하세요

K-IN 입니다.

 

코틀린에 대해서 알아보겠습니다. 

전체 강의 목록은 아래의 링크를 클릭해주세요.

 

K000. 코틀린 시리즈 (연재물)

안녕하세요 K-IN 입니다. 요즘 코틀린을 이용한 개발 프로젝트가 늘어나고 있습니다. 이에, 코틀린에 대해서 상세하게 정리하는 간행물을 제작하고자 합니다. 여기에 있는 링크들은 모두 코틀린

k-in.tistory.com

 

 

companion object 란? 

컴패니언 객체는 클래스 내에 정의되어 클래스 자체에 속하는 멤버를 가질 수 있는 특별한 객체입니다.

 

정적 멤버와 유사한 역할을 하지만 더욱 유연하고 확장 가능한 기능을 제공합니다.

 

아래의 에시는 companion object 를 통해서 myConstant 속성과 myFunction 함수를 정의한 뒤 인스턴스를 생성하지 않고 호출하는 예시입니다.

 

class MyClass {
    companion object {
        const val myConstant = 42

        fun myFunction() {
            println("Calling myFunction in companion object")
        }
    }
}

// 클래스 이름을 통해 직접 접근
println(MyClass.myConstant)  // 42
MyClass.myFunction()  // Calling myFunction in companion object

 

컴패니언 객체(companion object)의 활용, 로깅을 위한 로거를 정의

정적 멤버와 유사하지만 더욱 유연한 기능을 하는 컴패니언 객체는 어디에서 활용할 수 있을까요? 

가장 대표적인 예시로는 로거를 구현해서 사용하는 패턴일 것입니다. 

 

컴패니언 객체를 통해서 정의된 log 변수는 정적 변수처럼 외부에서 클래스를 통해서 호출될 뿐만 아니라 

override 된 process 함수 내에서도 자유롭게 사용할 수 있습니다. 

 

즉, 여러 메서드에서 공통적으로 호출/참조되거나 클래스 외부에서 인스턴스화 없이 호출/참조할 때 활용하기 좋습니다. (로깅은 매우 좋은 예시입니다.) 

package com.kin.batchexample

import org.slf4j.Logger
import org.slf4j.LoggerFactory

import org.springframework.batch.item.ItemProcessor
import java.util.*

class PersonItemProcessor : ItemProcessor<Person, Person> {

    companion object {
        private val log: Logger = LoggerFactory.getLogger(PersonItemProcessor::class.java)
    }

    override fun process(person: Person): Person {
        val firstName = person.firstName.uppercase(Locale.getDefault())
        val lastName = person.lastName.uppercase(Locale.getDefault())

        val transformedPerson = Person(firstName, lastName)

        log.info("Converting ($person) into ($transformedPerson)")

        return transformedPerson
    }
}

 

이상입니다.

K-IN 올림. 

반응형