Kotlin 앱 공유하기 기능 추가 - 간단한 Kotlin 앱 개발


아래 링크에 공유하기 커스텀 기능과 상세 기능이 자세히 설명되어 있습니다.

이 포스트는 자바로 구현된 앱을 Kotlin 으로 재개발한 것으로 Kotlin에 관한 내용을 중점으로 다루고 있습니다.
앱에 대한 상세한 설명은 위 자바 버전으로 된 포스트를 참고 부탁합니다.



Kotlin 리스너 콜백 구현

이전 편에 이어서 Kotlin으로 만든 retrofit 을 사용해서 단축 URL API를 요청해 보겠습니다.

EditText에 입력된 URL을 단축 URL 생성 API로 요청합니다.
DataManager에 구현된 loadShorturl() success() 성공 콜백과 error() 에러 콜백을 받을 수 있습니다.
자바처럼 Listener를 만들지 않고 람다표현식으로 간단하게 구현할 수 있습니다.
success() 콜백은 파라메터가 한개이기 때문에 블럭안에서 it으로 대체해서 간단하게 사용할 수 있습니다.
error() 콜백은 파라메터를 두개 받으며 사용하지 않는 파라메터는 _ 으로 표현할 수도 있습니다.
여기서 tThrowable로 자바에서는 Throwable t 처럼 표현됬을 것 입니다.
이처럼 람다 표현식으로 유추해서 개발할 수 있기때문에 간결한 코드가 간결해집니다.

//람다 표현식으로 콜백 사용하기
dataManager.loadShorturl(
    url,
    {   
      share(it.url)
    },
    { _, t ->
        Toast.makeText(this, "error: " + t.message, Toast.LENGTH_SHORT).show()
    }
)

유용한 apply 함수

apply { ... } 함수는 블럭으로 this를 넘겨줍니다.
즉, 아래 코드에서 apply { ... } 블럭안으로 Intent가 넘어오기 때문에 메소드 및 속성에 바로 접근할 수 있습니다.
아래 코드에서 Intent의 action, type, putExtra()를 직접 접근해서 값을 할당하고 있습니다.
그리고 apply 함수는 this를 리턴하기 때문에 변수로 생성하여 이후 처리에 순차적으로 실행시킬 수 있습니다.
apply 함수를 사용하여 불필요한 변수 선언을 줄일 수 있기 때문에 간결하고 가독성 좋은 코드로 개발할 수 있습니다.

val shareIntent = Intent().apply {
            action = Intent.ACTION_SEND
            type = "text/plain"
            putExtra(Intent.EXTRA_TEXT, url)
}
val chooserIntent = Intent.createChooser(shareIntent, title)
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, clipboardIntent)

startActivity(chooserIntent)

Kotlin에서 static 사용하기

Kotlin에는 static이 없습니다.
대신에 companion object 키워드로 static 메소드, static 변수를 선언할 수 있습니다.
class 내부에 companion object { ... } 블럭안의 메소드나 변수는 자바의 static처럼 사용 가능합니다.
CopyToClipboard.createCopyToClipboardIntent(...) 처럼 사용 가능합니다.

class CopyToClipboard {
    companion object {
      fun createCopyToClipboardIntent(context: Context, url: String) : Intent {
          return Intent(context, CopyToClipboardActivity::class.java).apply {
                           data = Uri.parse(url)
          }
     }
}

companion object 로 Factory 구현하기

companion objectFactory 패턴을 구현하는 데 효과적입니다.
classprivate constructor(...) 생성자로 만들어서 객체를 생성할 수 없게 제한하고 companion objectmakeClip(...)으로 ClipBoardFactory 클래스를 생성할 수 있습니다.
따라서 객체를 생성할 수 있는 factory 를 만들어서 아래 코드처럼 구현가능합니다.
메소드가 간단한 경우 ... : ClipBoardFactory = ClipBoardFactory() 처럼 =을 사용하여 한 줄로 표현 가능 합니다.

class ClipBoardFactory private constructor(val context: Context, val url:String) {

    companion object {
        fun makeClip(context: Context, url : String) : ClipBoardFactory = ClipBoardFactory(context, url)
    }

    fun clip() {
        val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
        val clip = ClipData.newPlainText("URL", url)
        clipboard!!.primaryClip = clip
    }
}

Factory 메소드인 makeClip()으로 객체를 생성해서 clip()을 호출 할 수 있습니다.

ClipBoardFactory.makeClip(this, it.toString())
                     .clip()

마무리

Kotlin으로 retrofit을 사용해서 네트워크 요청과 응답처리를 구현했습니다.
그리고 앱 공유하기 기능도 Kotlin으로 개발해 보았습니다.

최대한 Kotlin 스럽게 개발하는 것을 목표로 했습니다.
실무에서 자주 사용할 수 있는 것들을 먼저 학습해봤습니다.
다음에는 좀더 깊이 있는 Kotlin 앱 개발 내용을 다루어 보도록 하겠습니다.

예제코드

Kotlin 버전 단축 URL 앱 전체 코드는 github에 올렸습니다.


셈플앱은 아래 구글플레이에서 설치해 볼 수 있습니다.
Get it on Google Play

이글은 제가 직접 공부하면서 정리한 자료입니다.
틀린 부분이 있거나 수정해야 될 부분이 있을경우 알려주시면 감사하겠습니다.^^

댓글

댓글 쓰기

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기