728x90
반응형

본문은 안드로이드 공식사이트를 참조하여 작성하였습니다.
안드로이드_공식사이트

Android를 처음 배웠을 때는 JAVA만 알면 됬었던 것 같다.
다시 Android를 보려고 하니 Kotlin이라는 아이가 있더라.
JAVA랑 100% 호환되면서 간결성과 안정성을 높인 언어라나...
암튼 뭐 이런녀석을 만들었고 Android에서도 공식적으로 개발 언어로 채택했다는데 나도 배워봐야지 않겠나 싶어 기본 문법부터 보기로 했다.

변수선언

변수는 선언하는 키워드는 두가지가 있다.
val, var

val은 값이 변경되지 않는 변수(사실은 상수, c언어로 치면 const가 앞에 붙은 변수),
var은 값이 변하는 일반적인 변수이다.

Java

String myName = "Gunliver";

Kotlin

var myName : String = "Gunliver"

어? 간결해지기는 커녕 오히려 복잡해진 것 같은데...? (일단 좀더 지켜봅시다)
뒤에 세미콜론이 없어진건 좀 간결해졌다고 볼수 있으려나

Kotlin도 유형추론이 가능하다

var myName = "Gunliver"  
var myAge = 20

// Fails to compile  
myAge = "twenty"

위와 같이 타입을 생략 가능하지만 생략만 할뿐 실제로는 Compile시 유형을 정하는 것이기 때문에 유형을 변경할 수는 없다.

Null 안전

// Fails to compile
var myName : String = null

var myName : String? = null

Kotlin에서는 기본적으로 변수에 null값을 넣을 수 없다. null을 꼭 넣어야하는 변수라면 두번째와 같이 물음표? 를 넣어 nullable 변수로 선언해줘야만 한다. NullPointerException을 막기위한 방법으로 프로그래머가 귀찮게 ?를 넣어야만 null값을 허용해주는 방식으로 가볍게(?) 문제를 해결. 이렇게까지 하는데는 다 이유가 있겠지 생각하고 nullable 변수를 선언할때는 매우 신중하자.

조건부

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

이런 일반적인 조건은문 아래와 같이 작성할 수 있다.
조건마다 println을 하지 않고 맨 위에 선언한 변수에 할당할 값만 작성.

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)

조건이 여러개일 때 아래와 같이 when을 사용할 수도 있다.

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

println(answerString)

오~! 이제서야 Kotlin의 간결성이란게 뭔지 조금씩 보이는 것 같다.
많이 줄였지만 가독성면에서도 떨어지지 않는 것 같아 마음에 든다.

함수

함수를 선언할 때는 fun 키워드를 사용한다.
fun 함수이름 ( 인수이름 : 인수자료형 ) : 출력자료형

Kotlin

fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }

    return answerString
}

반환키워드를 할당 연산자로 바꿀 수도 있다.

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
    }

이거 새롭긴한데 뭔가 익숙치 않은 느낌이다.

익명 함수

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

여기서 'stringLengthFunc'가 함수의 이름 같지만 함수의 이름이 아니라 익명함수를 참조하는 변수의 이름이다. 함수포인터 또는 델리게이트 라고 보면 될 것 같다.

(String) -> Int 입력 String을 받아서 출력 Int 가 나오는 모양이고,
그 함수는 입력의 길이를 구하는 내용이다.
input -> input.length

이렇게 함수을 참조하는 변수는 고차함수(콜백함수)에 인자로 들어갈 수 있다.

고차 함수

fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}

'stringMapper'는 입력을 'String' 변수 하나와 '(String) -> Int' 형태의 함수를 인자로 받는다. 이런 함수는 아래와 같이 익명함수를 확용하여 호출 할 수도 있다.

stringMapper("Android", { input ->
    input.length
})

클래스

class키워드로 클래스를 만들 수 있다.
속성은 변수선언과 마찬가지로 변경 가능한 것은 'var', 변경 불가능한 것은 'val'로 선언한다.

class Car {
    val wheels = listOf<Wheel>()
}

getter 와 setter를 만들고 싶을 때는 속성아래에 'get()', 'set()'을 넣어주자.

var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value)
    }
728x90
반응형

+ Recent posts