코틀린은 변수 타입을 널 허용과 널 불허로 구분한다. 변수에 null을 대입할 수 있는지를 선언할 때 타입으로 구분한다는 뜻!
var data1: String = "seongho"
data1 = null // 오류
var data2: String? = "seongho" // 널 허용
data2 = null // 성공
이렇게 null 대입을 허용한 경우에는 변수에 언제든 null이 들어갈 수 있으므로 변수에 접근할 때 널 안전성 호출 연산자를 사용해줘야 오류가 나지 않는다고 한다.
var data:String? = "seongho"
var length = data.length // 오류
var data: String? = "seongho"
var length = data?.length // 성공
터치 이벤트를 처리하는 코드에서 이를 확인해보자.
class MainActivity : AppCompatActivity() {
...
override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action) { // 이벤트 종류 확인은 event.action으로 가능하다.
MotionEvent.ACTION_DOWN -> { // 이벤트 종류가 MotionEvent.ACTION_DOWN이면
Log.d("Touch down event")
}
MotionEvent.ACTION_UP -> { // 이벤트 종류가 MotionEvent.ACTION_UP이면
Log.d("Touch up event")
}
}
return super.onTouchEvent(event)
}
}
터치가 발생하면 onTouchEvent 함수가 실행되는데, 이때 event라는 매개변수에 MotionEvent 객체가 들어오게 된다. MotionEvent 객체는 null일 수 있어 ?를 붙여놓았다. event.action으로 발생한 터치 이벤트의 종류를 확인할 수 있는데, 그게 ACTION_DOWN이면 Touch down event 를 출력하는 식이다.
return super.onTouchEvent(event)
는 왜 붙여놓았을까?
아래는 onTouchEvent의 원래 코드이다.
public boolean onTouchEvent(MotionEvent event) {
if (mWindow.shouldCloseOnTouch(this, event)) {
finish();
return true;
}
return false;
}
override를 하여 위 코드를 변경하였다면, super.onTouchEvent(event)는 그 변경된 코드를 실행하는 역할을 해주는 듯 하다. 아직 잘 모르겠다.
https://jamssoft.tistory.com/161
이런걸 좀 더 찾아봐야 할 것 같다.