App/Android

Kotlin 사용법(Kotlin Summary with kotlin tutorial)

selfstarter 2020. 4. 4. 16:07

Kotlin Summary

Kotlin Tutorial

Benefit of Kotlin

1) Google I/O 2017에서 android의 공식언어로 지정되었고, Google에서 Kotlin 사용을 권장하고 있다(최근 android 예제에아예 JAVA 언어로 된 예제가 없는 경우도 있다)
2) Java에서 Asynctask가 없어졌고, kotlin에서 Coroutine을 사용하여 더 쉽고 간결하게 작업할 수 있다
3) 변수가 NullSafty한지 아닌지를 사용자가 지정하여 예외를 미연에 방지할 수 있다
4) Java와 Kotlin언어 호환 가능

function

  1. Unit은 return value가 없음을 의미한다. Unit을 생략해도 된다

  2. $연산자를 통해 따옴표 안에 메시지를 출력할 수 있다. 또 return 값이 생략되어있으므로 Unit return이다. 함수의 parameter에 기본값을 줘서 parameter를 넘기지 않을 때 기본값을 지정할 수 있다

  3. 두개의 Int parameter를 받고 Int를 return하는 함수이다

  4. 한줄로 처리가 가능하면 함수에 괄호를 치지않고 사용이 가능하다. 이 때 return에 대한 수식만 정의할 수 있다(한줄이라고해서println사용하면에러발생)

    // 1
    fun printString(str : String): Unit {
     println(str)
    }
    //2
    fun printMessageWithPrefix(message: String, prefix: String="Info") {
     println("[$prefix] $message")
    }
    // 3
    fun sum(num1: Int, num2: Int): Int {
     return num1 + num2
    }
    fun multiply(num1: Int, num2: Int) = num1 * num2
    fun main() {
        printString("hihihi")
        printMessageWithPrefix("hi", "Debug")
        printMessageWithPrefix("Debug")
        println(sum(10,20))
        println(multiply(30,40))
    }

Infix function

  • 데이터타입에 function을 추가하는 방식. 아래 예제에서는 String에 onto 라는 function name을 가지는 함수를 선언했다

  • 기존에 function 호출하는 형식(function(param...))과 다르게 두개의 인자 사이에 function을 호출하는 함수

  • String.onto(other: Int)에서 맨 앞에 String은 앞에서 올 데이터의 타입을 가르킨다. String이라고 지정했으므로 infix function 앞에 있는 "Today is"라는 String 데이터 형이 온 것이다

  • String. 다음은 함수 이름이다. 괄호를 사용하지 않는 함수라고 생각하면 된다

  • other: Int는 인자의 데이터 타입이다

  • infix function 안에서 this는 function명 앞에 있는 String을 의미한다("Today is")

      infix fun String.onto(other: Int) = Pair(this, other)
      val myPair = "Today is" onto 4
      println(myPair)
      println(myPair.javaClass.name)
  • infix function to는 Pair Type으로 리턴해준다. to는 우리가 선언하지 않았지만 기본라이브러리에 들어 사용할 수 있다

      var pair = 1 to "hello"
      println(pair)

Operator Functions

  • 연산자를 재정의 할 수 있다
  • 첫번째 예제에서 times는 * 연산자이다
  • 두번째 예제에서 get()은 bracket-access syntax를 사용한다
operator fun Int.times(str: String) = str.repeat(this)
println(2 * "Hello ")

operator fun String.get(range: IntRange) = substring(range)
val str = "Today is Monday~; I'm happy"
println(str[0..20])

vararg parameter

  • vararg parameter는 여러개의 같은 DataType의 변수를 마치 하나의 list 안에 들어가 있는 것 처럼 사용할 수 있다

  • 이 때 parameter는 for문을 돌려야하기 때문에 하나로 통일해야 한다

      fun main() {
           printAll("hi", "방가")
           printAllWithPrefix ("Hello", "Hi", "NicetoMeetyou", prefix="new:")
      }
      fun printAll(vararg message: String) {
           for (m in message) println(m)
      }
      fun printAllWithPrefix(vararg messages : String, prefix : String) {
           for (m in messages) println(prefix+m)    
      }

variable

  • var 자료형은 값을 변화시킬 수 있는 변수이고, val 자료형은 값을 변경할 수 없는 불변성을 가진다

  • 반드시 초기화를 하고 자료형을 사용해야한다. 그렇지 않으면 compile error가 난다

    fun main() {
         var a : Int = 2
         val b : Int = 4
         a = 1
         //b = 2 // immutability-
         println(a)
         println(b)
    
        var num: Int
        println(num)    // error! 
    }

Null Safety

  • 변수 데이터 타입에 ?를 붙이지 않고 그냥 선언하면 null을 사용할 수 없다

  • 변수 데이터 타입에 ?를 붙이면 null을 사용할 수 있다

      fun main() {
        var neverNull : String = "This can't be null"
        neverNull = null
        var nullable : String? = "You can keep a null here"
        nullable = null
        var inferredNonNull = "The Compiler assumes non-null"
        inferredNonNull = null
        fun strLength(notNull : String):Int {
            return notNull.length
        }
    
        strLength(neverNull)
        strLength(nullable)
      }

Class

  • class는 괄호와 body를 생략할 수 있다.

  •  

    new 키워드를 사용하지 않고 객체를 생성할 수 있다

    fun main() {
         var test = Test()
         var user = User(1, "1234")
         println(user.id)
         println(user.pass)
    }
    class Test
    class User(val id: Int, var pass: String)