ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생 초보가 Android App 개발하는 일기 with kotlin - 1
    Android 2021. 1. 4. 01:56
    728x90

    Appium을 공부하다가 Android 설정을 해야된다고 하는데 난 Android에 대해서 잘 모른다는 사실을 깨달았다.

     

    그래. 모르면 공부하면되지.. 라고 시작하는 생초보의 Android 개발 일기 시리즈입니다.

     

    일단 Android Studio를 설치해야되는건 압니다. 설치해봅니다.

     

    https://developer.android.com/studio

     

    Download Android Studio and SDK tools  |  Android 스튜디오

    developer.android.com


    설치했는데 실물 device는 연결하기 싫습니다. 그래서 제가 사용하는 Note10의 Emulator를 띄우고 싶은데 목록에 없네요. 그래서 찾아서 추가했습니다.

     

    https://jeongchul.tistory.com/625

     

    Android Studio AVD Galaxy S 추가하기

    Android Studio AVD Galaxy S 추가하기 오늘 AVD에 Samsung Galaxy 폰을 Virtual Device에 추가해봅시다. Android Studio 에서  기본적으로 사용 가능한 Virtual Device에 많은 스마트폰이 들어있지 않습니다. 자..

    jeongchul.tistory.com


    자.. 그러면 우선 개발을 위해서 Java와 Kotlin 두가지 언어를 선택할 수 있다고 합니다.

     

    요세 google이 소송에 져서 kotlin을 밀고있다고 하니 kotlin을 선택했습니다.

    그런데 새로운 언어니 배워야겠네요.

     

     

    좀 찾아보니 Java와 python, C# 셋다 사용해본 저에게 짬뽕같은 그런 느낌입니다.

    대충 어떤언어인지 참조하는데 사용한 사이트들입니다.

     

    https://kotlinlang.org/docs/reference/basic-types.html

     

    Basic Types: Numbers, Strings, Arrays - Kotlin Programming Language

     

    kotlinlang.org

    https://greedy0110.tistory.com/34

     

    [kotlin] 안드로이드 개발에 필요한 최소의 코틀린 강좌 (part1)

    도입  안녕하세요. 안드로이드 공식 언어로 코틀린이 채택된지도 꽤 오랜 시간이 흘렀는데요. 코틀린을 가지고 개발을 하며 코틀린이 c++, java, c#과 어떤 부분에서 다르고, 어떤 부분에서 비슷한

    greedy0110.tistory.com

    문법만 보고는 감이 잘 안와서 Kotlin으로 실제 돌아가는 예제를 만들고 싶었습니다.

    유튜브도 찾아보고 했는데 강의가 끊기니 맥빠지더군요..ㅠㅠ

     

    갑자기 생각나서 google에 찾아보니 mooc 공개 강의가 있네요.

     

    두가지를 제공하는데 순서대로 들으라고 하니 한번 듣고 따라하기를 시작해 보겠습니다.

    선수과목이 필요하다고는 하는데 기본적으로 다른 언어를 이용해서 appication을 개발해본 경험이 있다면 무난하게 따라갈 수 있을듯 합니다.

     

    www.kocw.net/home/search/kemView.do?kemId=1319211

     

    Kotlin을 사용한 스마트 앱 프로그래밍

    Kotlin 언어를 사용하여 Android 앱을 개발하는 방법에 대해 설명한다.

    www.kocw.net

    Kotlin의 문법을 보면서 크게 느껴지는 특징은 명시적이라는 겁니다.

     

    최근에 Python을 많이 쓰다보니깐 가변 혹은 익명변수에 익숙한데 Kotlin은 변수나 함수, class의 형이나 nullable에 대해서도 명시적으로 선언하는게 참 신선했습니다.

     

    남의 코드 분석할때는 이런게 장점이고 코드를 명료하게 볼수 있는데 때로는 python의 유연함이 그리워질것 같습니다.

     

    아래는 1강 내용인 Kotlin 언어 설명 중 제가 잘 모르는걸 정리한 내용입니다.


    Nullable관련된 연산자

    var str: String? //null을 허용합니다. 당장 초기화 하지 않아도 됩니다.
    var str2: String = "" //null을 허용하지 않기에 바로 초기화 선언을 해줘야 합니다.
    
    lateinit var data: String // nullable이 아닌데도 바로 초기화 못할때 씁니다. 
    
    ::data.isInitialized // lateinit 선언된 변수가 초기화 했는지 여부를 확인. 앞에 ::를 붙여야 함.
    
    var len: Int = str?.length ?: -1 // Elvis연산자 ?:입니다. str변수가 null이면  :?이후 값을 넣어줍니다.
    
    var len2: Int = str2.length!! //null이 아님이 확실할때. 혹시 null일 경우 Null point Exception을 발생시킴
    
    var len3: Int? = str2 as? Int // Safe Case연산자. 다른 type으로 cast가 불가능 시 null을 반환

    Lambda

    익명함수입니다. python에서도 자주 써서 익숙한데 좀 다르니 다시 정리해둡니다.

     

    // 함수  argument로 lambda식만 전달 시 괄호 생략 가능
    
    test { doit() }
    
    // lambda식이 한개의 parameter만 갖는다면 -> 생략가능하고 이름은 it 사용
    // SAM(Single Abstract Method) Interface에서 이런 경우가 매우 많음
    button.setOnClickListener { it: View!
        val btn: Button = it as Button
        textView.text = btn.text
    }
    
    // 사용하지 않는 parameter는 _로 대체 가능
    // listView.setOnItemClickListener { adapterView, view, i, l ->
    listView.setOnItemClickListener { _, _, i, _ ->
    	Toast.makeText( const this, 
        	mArray[i].name,
            Toast.LENGTH_SHORT).show()
        )
    }
        	

    When

    switch - case 문에 해당한다네요. 더 편하고 가속성 좋게 표현 가능합니다.

    when (v?.id) {
        btnGundam.id -> intent.putExtra(KEY_NAME, value: "RX-78-2")
        btnZaku.id -> intent.putExtra(KEY_NAME, value: "MS-06S")
        null -> return
    }
    
    // string도 처리 가능
    when (intent.getStringExtra("name")) {
        "RX-78-2" -> imageView2.setImageResource(R.drawable.rx782)
        "MS-06S" -> imageView2.setImageResource(R.drawable.ms06s)
        else -> imageView2.setImageResource(R.drawable.ic_launcher_background)
    }

    Loop

    기본적으로 python이나 C#같이 a in list 형태로 사용됩니다.

    var arr: List<Int> = listOf(1,2,3)
    for ( item in arr) {
        println(item)
    }
    
    // 기존의 indexing
    for ( i in 0 .. 3 ) {
        println(i)
    }
    
    // step으로 몇번 건너띌껀지 지정
    for ( i in 0 .. 3 step 2) {
        println(i)
    }
    
    // 숫자가 정해지지 않은 경우 until사용
    for ( i in 0 until arr.size) {
        println(i)
    }
    
    // downTo로 역순가능. 9->0 3번 건너띄기
    for ( i in 9 downTo 0 step 3) {
        println(i)
    }

    ===, !==

    비교문 시 ===도 있네요. 이건 객체가 같은지 비교... !==는 객체가 다른 경우..

    ==는 값을 비교하겠죠?

    let, run

    kotlin에서 처음 본 신선한 문법입니다. 객체에 대한 lambda처리에 용이해 보이네요.

    //아래 code는 모두 동일한 동작을 합니다.
    
    if (mPlayer !== null) {
        mPlayer!!.stop()
        mPlayer = null
    }
    
    //---
    mPlayer = mPlayer?.let { it: MediaPlayer
        it.stop()
        ^let null
        // 또는
        // ruturn@let null
    }
    
    //---
    mPlayer = mPlayer?.run { this: MediaPlayer
        stop()
        ^let null
        // 또는
        //return@run null
    }
    
    //---
    mPlayer?stop().let { mPlayer = null }
    
    //---
    mPlayer = mPlayer?.stop().let { null }

    apply, with, also

    apply는 동일객체의 값을 여러게 지정할때 블럭으로 간결하게 쓸수 있는 기능입니다.

    recyclerView.apply { this: RecycleerView
        setHasFixedSize(true)
        layoutManager = LinearLayoutManager(applicationContext)
        itemAnimator = DefaultItemAnimator()
        
        adapter = GundamAdapter()
    }

    with는 context객체가 non-null일때 쓴다는데 아직 이해가 안가네요.

     

    also는 코드 블럭 내에서 receiver를 사용하지 않을때 사용하면 좋다는데...

    apply 예제에서 블럭 내부에 객체 변수에 작업하는게 아닐경우 쓰면좋다고 설명하네요. 잘 이해가 안됩니 일단 pass 

    Java code to Kotilin

    기존 Java class 파일을 code-Convert Java File to Kotiln File 메뉴을 클릭해서 Kotilin파일로 변환할 수 있다고 하네요.

    아무래도 Java예제가 많은데 Kotlin으로 변환해서 사용할거나 비교할때 좋은 기능일것 같습니다.

     

    심지어 java code를 복사해서 .kt파일에 붙여넣기하면 Kotlin파일로 변환해서 붙여넣기가 된다네요. 신기방기~

     

    Java가 익숙하신 분은 이 기능을 잘 이용하면 될 것 같습니다.

    다만... 잘 안될때도 있다고 합니다 :(


    문법은 하다가 모르면 다시 찾아보고 일단 강의 따라서 쭉 진행해볼까 합니다.

     

    2강(Android Studio 설치)은 후딱 넘어가고 3, 4강 내용을 정리한 포스팅으로 다시 돌아오겠습니다.

    댓글

Designed by black7375.