영드로이드개발자
용이의 개발블로그
영드로이드개발자

블로그 메뉴

  • ⭐️ Home
  • 💻 GitHub
  • ❤️ Instagram
  • 👍 LinkedIn
  • 분류 전체보기 (44)
    • 공지사항 (1)
    • Daily 공부방 (0)
    • 프로그래밍 언어 (8)
      • Java (7)
      • Kotlin (1)
    • 안드로이드(Kotlin) (16)
    • 코딩테스트(Java) (11)
      • 기초 자료구조 (3)
      • 백준 (0)
      • 프로그래머스 1단계 (5)
      • 프로그래머스 2단계 (3)
    • 알고리즘 정리 (5)
    • 주간 목표계획 및 회고 (2)
    • Project (1)
      • Android App - 오마이코인 (1)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
영드로이드개발자
안드로이드(Kotlin)

Kotlin 코틀린의 object VS companion object

Kotlin 코틀린의 object VS companion object
안드로이드(Kotlin)

Kotlin 코틀린의 object VS companion object

2022. 8. 30. 15:34
반응형

object VS companion object

 

코틀린은 싱글톤 클래스를 생성하기 위해 object declaration이라는 것을 사용한다.

싱글톤 클래스로 선언해야 할 경우에 클래스 명 앞에 class 대신 object를 사용함으로써 싱글톤 클래스를 생성하게 된다.

 

하지만 공부를 하다보면 companio object라는 것을 볼 수 있다.

object와 companion object는 무엇이 다른지 알아보자.

 

1. object

object는 크게 2가지로 사용된다.

1. object expression (객체 표현식)

 

2. object declaration (객체 선언) 

    - 동반 객체(객체 선언을 클래스 내부에 사용한 것)

 

여기서 싱글톤 클래스를 생성하기 위해 사용되는 object의 쓰임은 2번째인 object declaration (객체 선언)이다.

그리고 이제 여기서 object와 companion object를 사용할 수 있는데 하나씩 알아보자.

 

2. object VS companion object

2-1 object

코틀린에서는 클래스 이름앞에 object 키워드를 붙이면 싱글톤 클래스를 만들수 있다.

하지만 이때는 생성자를 호출하지 않는 클래스에서만 사용할 수 있다.

object는 싱글톤 객체이기 때문에 생성자 자체를 사용할 수 없다.

개발자가 원하는 시점에 인스턴스를 생성하는 방식이 아니기 때문에 생성자 파마리터를 전달할 수 도 없기 때문이다.

import android.util.Log

// 싱글톤 클래스를 만들려면 앞에 object 를 붙이면 된다.
object MyObjectSingleton {
    fun printMsg(msg: String) {
        Log.d("MyObjectSingleton", "msg: $msg")
    }
}

 

 

2-2 companion object

코틀린에는 기본적으로 static이 존재하지 않는다. 그에 따라 companion object를 통해 package수준의 최상위 함수와 객체선언을 사용할 수 있다.

 

* 최상위 함수 : Static 메소드를 대신할 수 있는 함수

* 객체선언 : 최상위 함수가 접근할 수 없는 클래스 안에 있는 private 멤버변수에 접근할때 사용하는 객체

 

package com.example.part3_chapter4

class A private constructor(val name: String) { // 클래스 A의 주 생성자는 private로 접근을 제한
    companion object{
        val a = "ddddd"
        fun bar(): A{
            return A("ZERO") //companion object의 bar() 메서드를 통해 private 생성자에 접근 할 수 있다.
        }
    }
}

class B{
    var a = A("ZERO") // 실패, 주 생성자는 private 접근제한자로 설정되어 호출 할 수 없다.
    var b = A.bar()         // 성공, 동반객체의 bar() 메서드를 통해 private 주 생성자에 접근이 가능하다.
}

 

*중요

1. 클래스 내에는 companion object를 오직 딱 하나만 선언할 수 있다.

 

2.  companion object는 static클래스변수가 아니라 object 객체이다.

 

 

따라서 클래스명.Companion.변수 의 형태로 사용할 수 있다.

즉 companion object는 클래스가 메모리에 적재되면서 함께 생성되는 동반객체인 것이다.

그래서 클래스명.Companion.변수 로 접근할 수 있는 것이고, 이에 대한 축약표현이 단지 클래스명.변수 이기때문에 단순히 static클래스 변수라고 착각이 드는 것이다.

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'안드로이드(Kotlin)' 카테고리의 다른 글

Kotlin 코틀린의 Flow  (0) 2023.03.17
Kotlin 코틀린의 Coroutine  (1) 2023.02.09
Kotlin 코틀린의 싱글톤(Singleton)  (0) 2022.08.30
Kotlin 코틀린의 object와 class 키워드  (0) 2022.08.30
Kotlin 코틀린의 Retrofit  (0) 2022.08.26
  • object VS companion object
  • 1. object
  • 2. object VS companion object
'안드로이드(Kotlin)' 카테고리의 다른 글
  • Kotlin 코틀린의 Flow
  • Kotlin 코틀린의 Coroutine
  • Kotlin 코틀린의 싱글톤(Singleton)
  • Kotlin 코틀린의 object와 class 키워드
영드로이드개발자
영드로이드개발자
도전을 즐기는 안드로이드 개발자 현영우의 개발 Blog

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.