본문 바로가기

안드로이드

자바와 코틀린

코틀린의 확장 플러그인 기능중 뷰 결합(View Binding)에 대해 알아보자. 

뷰 결합(View Binding)

뷰 결합이란 레이아웃 XML 파일에서 만든 UI 요소를 코드에서 접근할 수 있도록 변수에 바인딩하는 것
findViewById()를 대체하여 사용할 수 있다.

 

MainActivity.kt에 다음을 추가한다.

import kotlinx.android.synthetic.main.activity_main.*

만약 오류가 난다면 build.gradle(app)의 plugins에 다음처럼 id 'kotlin-android-extensions'를 추가하여 sync now 한다.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}

이렇게 하면 findViewById()메소드를 사용하지 않고도 button1.setOnClickListener처럼 button1 객체에 바로 접근할 수있다. findViewById()함수를 바인딩할 '멤버변수'를 따로 선언하지 않아도 되므로 훨씬 간결해진다. 

 

함수

Java에서 정적 유틸리티 클래스

: 상태 정보가 없고 정적 함수만을 제공하는 클래스이다.
(Java에서는 모든 함수가 클래스 내부에 있어야 하기 때문에 존재한다.)

 

예시: toast메시지 호출

Toast.makeText(getApplicationContext(),message, Toast.LENGTH_SHORT).show(); 
Toast.makeText(getApplicationContext(),message, Toast.LENGTH_LONG).show(); 


1. Java에서는 함수가 반드시 클래스 내부에 있어야 하므로 ToastUtilJava클래스를 생성한다.

public class ToastUtilJava extends MainApplication{

    public static void toastShort(String message){
        Toast.makeText(getApplicationContext(),message, Toast.LENGTH_SHORT).show();
    }

    public static void toastLong(String message){
        Toast.makeText(getApplicationContext(),message, Toast.LENGTH_LONG).show();
    }
}


2. getApplicationContext()메소드는 Activity에서 정의된 메소드이므로 ToastUtilJava클래스는 사용이 불가능하다.
Activity를 상속받아 사용할 수도 있지만 그렇게 되면 토스트메시지를 띄울 때마다 새 Activity를 생성하여 불필요하게 많은 메모리를 사용하게 된다.
이런 경우 Application클래스를 상속받은 클래스를 만들고, 해당 클래스에서 applicationContext를 제공하는 방법을 사용할 수 있다. (MainApplication클래스 생성)

public class MainApplication extends Application {
    private static Context applicationContext;

    public static Context getAppContext(){
        return applicationContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        applicationContext = getApplicationContext();
    }
}

3. 이때 앱이 실행될 때 사용할 Application 클래스를 바꾸려면 AndroidManifest파일에서 명시적으로 지정해줘야한다. 

<application
        android:name=".MainApplication"
        android:allowBackup="true"
        ...


4. ToastUtilJava클래스는 생성된 객체의 상태를 저장하는 속성이 없으므로 굳이 new키워드로 인스턴스화하는 의미가 없다. 이런 경우 'static'을 이용해 정적인 함수로 만드는 것이 좋다. (ToastUtilJava 수정)

public class ToastUtilJava extends MainApplication{

    public static void toastShort(String message){
        Toast.makeText(MainApplication.getAppContext(),message, Toast.LENGTH_SHORT).show();
    }

    public static void toastLong(String message){
        Toast.makeText(MainApplication.getAppContext(),message, Toast.LENGTH_LONG).show();
    }
}


5. 이제 모든 클래스에서 다음과 같이 호출가능하다.

ToastUtilJava.toastShort("message"); 
ToastUtilJava.toastLong("message");

Kotlin의 최상위 함수

: 클래스 내부가 아닌 클래수 '외부'에 있는 함수
'최상위 함수'는 같은 패키지의 모든 코드에서 전역적 접근이 가능하다.

Java에서 Kotlin 최상위 함수 사용

코틀린과 Java는 100% 상호 호환이 가능하다.

코틀린의 최상위 함수는 '클래스가 없는 상태'가 아니다. 

코틀린의 최상위 함수는 컴파일 시점에 자동으로 새로운 클래스에 포함된다.
컴파일러는 '최상위 함수가 위치한 코틀린 파일의 이름'을 보고 자동으로 클래스를 생성한다.

ex) ToastUtilKotlin.kt파일은 ToastUtilKotlinKt클래스가 된다. 그리고 생성된 클래스에 '정적함수'로서 최상위함수를 등록한다.

if (number % 2 == 0){
                    ToastUtilJava.toastShort("" + number + "는 2의 배수");
                } else if (number % 3 == 0) {
                    ToastUtilJava.toastShort("" + number + "는 3의 배수");
                } else {
                    ToastUtilKotlinKt.toastShort("" + number); //Java에서 코틀린 최상위함수 접근
                }

 

 

 

출처: 안드로이드 with Kotlin 앱 프로그래밍 가이드

'안드로이드' 카테고리의 다른 글

자바와 코틀린 -2  (0) 2021.01.08
안드로이드_서비스  (0) 2021.01.07
안드로이드_프래그먼트  (1) 2021.01.05
어플리케이션 구성하기  (0) 2021.01.04
안드로이드_레이아웃  (0) 2020.12.29