Jay's Developer Note

[Android] Jetpack Compose에 쓰인 Kotlin 특징 - 1 본문

Android

[Android] Jetpack Compose에 쓰인 Kotlin 특징 - 1

Jay(J) 2023. 11. 27. 16:35
728x90

Jetpack Compose에 쓰인 Kotlin 특징

지난 게시글에서는 Jetpack Compose의 장점에 대해 알아보았다. 끝을 맺으며 Jetpack Compose는 Kotlin을 중심으로 빌드되었다고 언급했다. 이번 게시글에서는 Jetpack Compose에 쓰인 Kotlin의 특별한 특징을 서술해 보도록 하겠다.

 

특별해봤자 얼마나 특별하겠어?

라는 생각은 접어두자. Java보다 훨씬 더 간결한 Syntax와 다양한 기능들을 기반으로 만들어진 엄청난 녀석이니까..

 

기본값 인수 / 명명된 인수

Kotlin은 Method를 Overloading 할 때 Default Parameter를 설정할 수 있다. 그리고 호출할 때는 명명된 인수에 직접 값을 입력할 수 있다. 이건 진짜 혁신적으로 코드의 양을 줄일 수 있는 특징이다.

 

예를 들어 간단하게 AlertDialog를 띄우는 Util을 만드는 미션이 주어졌다고 가정해보자.

1. Title, Message는 필수로 들어온다.

2. 기본으로 '확인' 버튼이 있고 글자 변경이 가능하며, 이벤트는 주지 않는다.

3. 버튼은 Positive, Negative, Neutural 3개가 있고 글자 변경이 가능하며, 이벤트는 주지 않는다.

4. 배경클릭은 기본으로 닫히지만 설정할 수 있다.(cancelable)

 

사라질 때 이벤트처리, 클릭이벤트처리 등 더 다양하게 할 수 있지만 예시기 때문에 간략하게 가정했다.

 

Java에서는 각 케이스 별로 Method를 Overloading해서 사용해야 한다.

<DialogUtil.java>
...중략...

public void showDialog(
  String title, String msg
) { this.showDialog(title, msg, true); }
public void showDialog(
  String title, String msg, boolean canCancel
) { this.showDialog(title, msg, canCancel, "확인"); }
public void showDialog(
  String title, String msg, boolean canCancel, String btnTxt
) { this.showDialog(title, msg, canCancel, btnTxt, "", ""); }
public void showDialog(
  String title, String msg, boolean canCancel, String posiBtnTxt, String negaBtnTxt, String neutBtnTxt
) {
  ...Dialog.Builder...
}

...생략...

이런 식으로 케이스 별로 준비를 해야 한다. 여기서 이벤트들까지 들어간다면 더 많아지게 되고 만약 사용처에서 Title, Msg만 있는 Method를 사용했다면 상세내용을 보기 위해 this.showDialog를 계속계속 타고 들어가야만 하는 불상사가 발생할 수 있다.

<MainActivity.java>
...중략...

DialogUtil.getInstance().showDialog(title, msg);
DialogUtil.getInstance().showDialog(title, msg, false);
DialogUtil.getInstance().showDialog(title, msg, false, "OK");
DialogUtil.getInstance().showDialog(title, msg, false, "OK", "CANCEL", "SKIP");

...생략...

사용할 때는 또 어떤가? Method에 선언된 Parameter 순서대로 입력해야만 한다.

 


 

Kotlin에서는 기본값 인수 이 특징을 이용해 Method 단 1개로 끝낼 수 있다.

<DialogUtil.kt>
...중략...

fun ShowDialog(
	title: String,
	msg: String,
	canCancel: Boolean = true,
	posiBtnTxt: String = "확인",
	negaBtnTxt: String = "",
	neutBtnTxt: String = ""
) { }

...생략...

코드가 너무 간결하고 아름다워졌다. 키보드의 수명이 조금이나마 길어졌음을 느낀다.

<MainActivity.kt>
...중략...

ShowDialog(title, msg)
ShowDialog(
  title = title,
  msg = msg,
  canCancel = false
)
ShowDialog(
  title = title,
  msg = msg,
  canCancel = false,
  posiBtnTxt = "OK"
)
ShowDialog(
  title = title,
  msg = msg,
  canCancel = false,
  posiBtnTxt = "OK"
  negaBtnTxt = "CANCEL"
  neutBtnTxt = "SKIP"
)

...생략...

명명된 인수 특징을 이용해 아주 간편하고 선언된 순서 상관없이 사용할 수 있다.

 

이와 같은 Kotlin의 특징이 Jetpack Compose에 그대로 적용되어 있다.

Text Compose를 예로 들어보겠다.

Text(text = "HI") // == Text("HI")

Text는 text를 제외한 다른 값들은 전부 기본적으로 설정되어 있다.

변경하고 싶은 Parameter만 추가해서 변경해 줄 수 있다.

Text(
  text = "HI",
  color = Color.Red,
  maxLines = 3
)

이렇게 하면 다른 값들은 기본값이되 color와 maxLines만 설정해 준 Text Compose가 되는 것이다.

 

고차함수 / 람다 표현식

함수를 Parameter로 받는 함수를 선언할 수 있다.

Button을 예로 들어보겠다.

@Composable
fun Btn() {
  Row(
    content = {
      Button(
        onClick = buttonFunction(1)
      ) {
      }
      Button(
        onClick = buttonFunction(2)
      ) {
      }
    }
  )
}

fun buttonFunction(num: Int): () -> Unit {
  return {
    Log.d("TAG", "High-order Func $num")
  }
}

이처럼 함수 하나를 만들어두고 값을 달리하여 재사용할 수 있다.

@Composable
fun Btn() {
  Button(
    onClick = {
      Log.d("TAG", "High-order Func")
    }
  ) {
  }
}

다른 곳에는 안 쓰이고 이곳에서만 쓰인다면 람다 표현식으로 인라인 함수를 정의해서 간단하게 쓸 수도 있다.

또 하나 기막힌 문법이 있다. 그것은 후행 람다이다.

후행 람다는  적용되는 조건이 있다.

1. 해당 함수의 마지막 Parameter여야 할 것

2. 람다 표현식으로 전달가능 할 것

 

728x90

 

위 2개의 조건을 충족하면 괄호에서 꺼내어 중괄호로 분리시킬 수 있다.

위에 나온 Row를 예로 들어보겠다.

Row {
  Button(
    onClick = buttonFunction(1)
  ) {
  }
  Button(
    onClick = buttonFunction(2)
  ) {
  }
}

이렇게 중괄호로 분리해도 여전히 Row( ) 괄호 안에 다른 Parameter들을 사용할 수 있다.

보통 하위 요소가 있는 위젯들은 중괄호로 분리하여 작성하는 것이 일반적이다.(Column, Row, Box 등)

 

 

마치며

정리하다 보니 Kotlin의 특징이 된 것 같아 제목을 변경하게 되었다.

또 글이 길어져서 2개의 게시글로 나눠 작성하겠다. 분량조절을 실패하면 더 늘어날 수도..

728x90