번수 키워드와 변수명이 빠져있네요. ^^
코틀린에서는 아래처럼 var/val의 변수 키워드가 변수명 앞에 필요합니다. var는 쓰기가 가능하고 val은 readonly(읽기 전용)인 변수에 사용합니다. 대부분의 경우는 예기치않는 상태조작을 방지하는 않는 val가 더 좋은 선택이 됩니다.
private val myEditText: EditText
private var myEditText: EditText
그리고 님의 경우처럼 아직 초기화기 되지 않은 변수는 아래의 두가지 중의 한가지 방법을 사용하셔야 합니다.
1. lateinit var
해당 키워드를 사용하면 컴파일러에게 나중에 초기화를 하겠다고 알려줌으로써 컴파일 에러가 나지 않게 됩니다. 그리고 이 변수는 아래처럼 onCreate 등 가능한 곳에서 해당 변수를 초기화해 주어야 합니다. 만약 초기화 전에 이 변수에 접근하면 에러가 발생하게 됩니다.
private lateinit var myEditText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_resister2)
// myEditText.setText("텍스트") --> 변수 초기화 전에 접근하면 런타임에러
myEditText = findViewById(R.id.myEditText)
}
2. by lazy
private val myEditText: EditText by lazy {
findViewById(R.id.myEditText)
}
protected fun onStart() {
super.onStart()
myEditText.text("아무텍스트"); // 이 시점에서 findViewById(R.id.myEditText) 호출하고 초기화 됨.
}
by lazy 키워드를 사용하게 되면 lazy 초기화를 사용할 수 있습니다. lazy 변수는 바로 초기화가 되는 게 아니라 해당 변수를 최초로 접근하는 시점에 lazy블록 안에 있는 코드로 초기화가 됩니다. 그리고 이후부터너 해당변수에 접근해도 다시 초기화하지 않습니다. 이 방법이 적용될 수 있는 경우라면 lateinit var보다는 더 유용한 방법이라 보여집니다. findViewById같은 경우도 여기에 해당한다고 생각합니다.
참고로 findViewById대신에 ViewBinding을 사용하는 것이 타입에 안전한 코드를 작성할 수 있어 좀 더 나은 접근방법이라 생각합니다.
코틀린 강좌는 Google, Jetbrain 등 수많은 곳에서 무료로 제공하고 있으니 참고하시기 바랍니다.