[android : kotlin] 코틀린 null을 초기값으로 지정하는 방법(TextView 사용법)
코틀린 언어는 개발자의 실수를 줄이기 위해 기본적으로 변수 선언 후 null 값으로 초기화 할 수 없도록 하였다. null로 초기화 화면 빨간색 줄로 오류표시가 된다. 마우스 커서를 올려보면 TextView 뒤에 물음표를 추가할 것을 권한다.
코틀린 null을 초기값으로 지정하는 방법
null 값으로 초기화를 해야할 경우 변수 타입 옆에 물음표를 추가해 주면 된다. 선언한 변수에 값을 지정할 때에서 반드시 변수명옆에 물음표를 추가해주어야한다. 그렇지 않으면 동일하게 빨간색으로 오류표기가 된다.
TextView는 사용자에게 문자열을 보여주기 위한 뷰이다. TextView에 값을 지정하는 방법은 자바와 동일하다. 아래 코드처럼 해주면 된다. 그러나 코틀린은 편리하게도 setText()메소드를 사용할 필요가 없다. 아래 코드 처럼 사용하면 알아서 setText()메소드를 호출하여 적용한다. 써도 상관은 없다.
코틀린에서는 .text 후 = 값을 지정하면 된다.
TextView에 접근하기 위해 TextView의 id값을 찾아서 선언할 수 있도록 findViewById<자료형>(리소스 이름) 형태로 선언 하였다. 그러나 코틀린에서는 findViewById를 사용하여 TextView의 주소값 받아오는 작업을 할 필요가 없다. 뷰의 id값을 지정하면 코틀린 내부에서 자동으로 선언이된다. 그럼으로 TextView의 id값에 바로 값을 지정할 수 있다. 이 방법을 합성 프로퍼티(Synthetic Property)의 사용이라고 한다. kotlinx.android.synthetic.main.activity_main.*를 import 해주면 된다. 아래코드를 살펴보면 text1.text =”문자열이다.”; 코드가 있다. 이것이 바로 합성 프로퍼티이다. 코틀린 코드에서 뷰 인스턴트에 접근할 수 있도록 지원하기 위해 코틀린 안드로이드 확장은 클래스 안에 뷰id이름올 된 가상 프로퍼티를 생성한다. 이렇게 코틀린 코드 외부의 요소와 조합을 통해 만들어진 프로터티를 합성 프로퍼티라고 부른다. 코틀린은 findViewById()를 통해 매번 리소스를 읽으면 프로그램이 느려지므로 캐시를 통해 읽어 올 수 있도록 처리되어있다.
[MainActivity.kt]
package edu.kotlin.study import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.TextView import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { //var text1: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //text1 = findViewById<TextView>(R.id.text1) //text1?.text = "문자열이다." //text1?.setText("문자열이다."); //text1?.text = "문자열이다." text1.text = "문자열이다." } }
확장 함수 형태로 접근하기 : 리소스의 id를 매번 읽어오는 경우 보다 확장함수 형태로 사용하면 훨씬 빠르게 처리할 수 있다.
package edu.kotlin.study import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.TextView import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { //var text1: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) titleOn() //확장 함수 호출 } fun MainActivity.titleOn() { //확장 함수 형태로 사용 text1.text = "hi~~~~~" text1.visibility = View.VISIBLE; } }
MainACtivity에 확장함수을 추가하고 호출하여 사용하게되면, onCreate()에서 titleOn()이 호출될 때 캐티된 정보를 읽어오기 때문에 빠르게 처리된다.
[activity.main.xml]
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
[참고 문헌]
Do it! 코틀린 프로그래밍 [황영덕 저 | 이지스퍼블리싱]