작성
·
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 라이브러리가 데이터베이스를 생성하기 위해 주어진 인자로부터 클래스의 정보를 알아내기 때문입니다.
더 궁금한 점이 있으면 언제든지 물어보세요. 좋은 하루 되세요.