[Android] 안드로이드 공식문서로 알아보는 코틀린 기본 문법

Minji Jeong·2022년 7월 14일
0

Android

목록 보기
26/39
post-thumbnail
이번 포스팅은 코틀린으로 안드로이드 개발을 할 때 '기본적으로' 알아야 하는 간단한 문법에 대해 소개한다. 안드로이드 공식 문서에서 설명을 잘 해놓아서 혼자서 보다가 기록으로 남겨놓는 게 좋을 것 같아서 이렇게 글을 쓰게 되었다. 하단에 링크로 올려놓은 안드로이드 공식 문서를 참고했으며, 인텔리제이를 사용해 실습했다.
👉 Android Developers : Kotlin 프로그래밍 언어 알아보기

1. 변수 선언

코틀린은 var, val 두 개의 키워드를 사용하여 변수를 선언할 수 있다.

var : 값이 변경될 수 있는 변수에 선언
val : 값이 변경될 수 없는 변수에 선언

💡 val vs const val

const val : val과 동일한 역할을 하나, 런타임 시간에 값이 할당되는 val과 달리 컴파일 시간에 값이 할당된다. 따라서 오직 문자열이나 기본 자료형에만 할당될 수 있고, 클래스의 프로퍼티나 지역변수로 할당할 수 없다.

const val로 선언하고 싶다면 클래스 내의 companion object 또는 object 내에서 선언해야 한다.

class Example {
    var num1 = 0
    val num2 = 1

    companion object {
        const val stringValue = "hello"
    }
}
object Example {
    var num1 = 0
    val num2 = 1

    const val stringValue = "hello"
}

2. 타입 추론

코틀린 컴파일러는 변수에 초기 값이 할당될 때 할당된 값의 타입을 기반으로 변수 타입을 추론한다. 이러한 코틀린의 타입 추론 방식은 간결성안정성을 보장할 수 있다.

var num : Int = 0 
var num = 0 

0은 정수, Int 타입이기 때문에 컴파일러가 num도 Int 타입임을 추론할 수 있다. 따라서 Int 타입의 변수에서 호출할 수 없는 함수(toUpperCase는 String 타입의 변수서에만 호출할 수 있는 함수)는 호출할 수 없다.

3. Null safety

코틀린 변수는 기본적으로 null 값을 보유할 수 없다.

따라서 null 값을 포함해야 하는 변수는 nullable타입이어야 하고, '?' 를 변수 타입에 사용해서 해당 변수가 null 값을 허용할 수 있도록 만들 수 있다.

val num : Int ?= null

4. 조건문

코틀린에선 if문을 사용해 변수에 값을 할당할 수 있다.

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

위 예시처럼 보통의 if문으로 조건문을 만들 수도 있지만, 위 예시처럼 작성하게 되면 특정 구문(println)을 반복하게 된다. 아래의 예시처럼 코드를 작성한다면 이러한 반복 호출을 피할 수 있다. 또한 각 조건식은 마지막 코드의 실행 결과를 반환하기 때문에, return 키워드를 사용할 필요가 없다.

fun main(){
    count(39)
}

fun count(count: Int){
    val answerString: String = if (count == 42) {
        "I have the answer."
    } else if (count > 35) {
        "The answer is close."
    } else {
        "The answer eludes me."
    }
    println(answerString)
}

결과 : The answer is close

보통 2개 정도의 조건문을 만든다면 if문을 사용하면 되지만, 3개 이상의 조건문을 만들고 싶다면 when을 사용하는 것이 좋다. when은 자바의 switch문과 동일한 역할을 한다.

val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}

println(answerString)

5. 함수

(접근제한자(생략가능, 생략 시 public으로 지정)) 함수명() : 반환형 { /*함수 내용*/ }

fun getName() : String {
	return "minji"
}

코틀린에서의 기본적인 함수 선언 형태는 위와 같으며, return을 생략하거나 조건문을 사용하는 등 다양한 방식으로 간소화하여 선언할 수도 있다. 위 함수에선 return을 생략하여 다음과 같이 선언할 수 있다.

fun getName() : String = "minji"
fun mySnack(snack: String) : String {
    val snackData : String = if (snack == "coffee") {
        "I ate coffee."
    } else {
        "I ate ice cream."
    }
    return snackData
}

코틀린을 사용하면 if문을 사용해 변수에 값을 할당할 수 있다고 했다. 위 함수에서도 if문을 적용한다면 함수를 더욱 더 간결하게 선언할 수 있다.

fun main(){
    println(mySnack("coffee"))
}

fun mySnack(snack: String) : String {
    return if (snack == "coffee") {
        "I ate coffee."
    } else {
        "I ate ice cream."
    }
}

결과: I ate coffee.

더욱 나아가 반환 키워드를 if문으로 바꿔서 사용할 수도 있다.

fun main(){
    println(mySnack("coffee"))
}

fun mySnack(snack: String) : String = if (snack == "coffee") {
    "I ate coffee."
} else {
    "I ate ice cream."
}

결과 : I ate coffee.

💡 익명 함수

코틀린에서는 '익명 함수', 말 그대로 이름이 없는 함수를 정의할 수 있다. 익명 함수는 일반적인 함수를 선언할 때 처럼 fun 키워드를 사용하지 않는다. 익명 함수는 람다식과 유사한 형태를 보이는데, 람다식에선 return, break, continue와 같은 제어문을 사용하기가 어렵기 때문에 함수 내 조건에 따라 실행을 중단하고 리턴해야 하는 경우에는 익명 함수를 사용하는 것이 좋다고 한다. 익명 함수는 코드 마지막줄의 결과가 반환되며, return 키워드를 사용하지 않는다.

fun main(){
    val snackList = arrayListOf<String>("Cookie", "Banana", "IceCream")

    val numberOfSnacks : (List<String>) -> Int = { input ->
        input.size
    }

    val num = numberOfSnacks(snackList)
    println(num)
}

결과 : 3

위 예시에선 String 타입의 리스트를 입력값으로 받고, 리스트의 크기, 즉 Int 타입의 데이터를 리턴한다.

References

https://smoh.tistory.com/236
https://kimch3617.tistory.com/entry/Kotlin%EC%97%90%EC%84%9C-val-%EC%99%80-const-val-%EC%9D%98-%EC%B0%A8%EC%9D%B4

profile
Mobile Software Engineer

0개의 댓글