널 안전성

Seongho·2021년 10월 27일
0

Kotlin

목록 보기
4/6

코틀린은 변수 타입을 널 허용과 널 불허로 구분한다. 변수에 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

이런걸 좀 더 찾아봐야 할 것 같다.

0개의 댓글