인프런 커뮤니티 질문&답변

새콤한 다람쥐님의 프로필 이미지
새콤한 다람쥐

작성한 질문수

[2023 코틀린 강의 무료제공] 기초에서 수익 창출까지, 안드로이드 프로그래밍 A-Z

사전 지식 - 레트로핏 라이브러리, JSON 데이터 형식

더블콜론 질문

작성

·

266

0

안녕하세요 선생님 늘 좋은 강의 감사드립니다.

@Database(entities = arrayOf(ToDoEntity::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun getDao(): ToDoDao

    companion object {
        val databaseName = "database"
        var database: AppDatabase? = null

        fun getInstance(context: Context) {
            if (database == null) {
                database = Room.databaseBuilder(context, AppDatabase::class.java, databaseName).build()
            }
        }
    }
}

여기서 ToDoEntity::class는 왜 뒤에 .java가 안 붙고 AppDatabase::class.java는 왜 .java가 붙어야 하나요? 그리고 ::class를 안 쓰고 ToDoEntity만 쓰면 왜 안 되는 건가요???? 답변 감사합니다.

답변 1

1

안녕하세요, 인프런 AI 인턴이에요.

더블 콜론(::)은 코틀린에서 클래스나 함수의 참조를 표현할 때 사용되는 특수한 연산자입니다.

ToDoEntity::class는 ToDoEntity 클래스의 참조를 나타냅니다. 이때 .java를 붙이지 않는 이유는 코틀린에서는 .java를 생략할 수 있는데, 코틀린 컴파일러가 자동으로 자바 클래스와 매칭시켜줍니다.

반면, AppDatabase::class.java는 AppDatabase 클래스의 자바 표현식을 나타냅니다. 이 경우 .java를 붙여서 명시적으로 자바 클래스임을 표시하는 것이 좋습니다.

또한, ToDoEntity만 쓰는 경우와 ToDoEntity::class를 사용하는 경우는 다릅니다. ToDoEntity는 인스턴스 자체를 나타내는 것이고, ToDoEntity::class는 ToDoEntity 클래스의 참조를 나타냅니다. Room.databaseBuilder() 메소드는 클래스의 참조를 인자로 받기 때문에 ToDoEntity 자체를 사용할 수 없고, ToDoEntity::class를 사용하여 ToDoEntity 클래스의 참조를 전달해야 합니다.

이렇게 사용하는 이유는 Room 라이브러리가 데이터베이스를 생성하기 위해 주어진 인자로부터 클래스의 정보를 알아내기 때문입니다.

더 궁금한 점이 있으면 언제든지 물어보세요. 좋은 하루 되세요.

새콤한 다람쥐님의 프로필 이미지
새콤한 다람쥐

작성한 질문수

질문하기