본문은 안드로이드 공식사이트를 참조하여 작성하였습니다.
안드로이드_공식사이트
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)
}
'IT노트 > 기타' 카테고리의 다른 글
[Open DART] 주린이 개발자의 재무제표 데이터 긁어오기 (0) | 2021.02.18 |
---|---|
[안드로이드] MainActivity 관찰하기 (0) | 2020.09.14 |
[소프트웨어] Composition vs Aggregation (0) | 2020.04.29 |
티스토리 파헤치기 - 2탄 (0) | 2018.08.11 |
티스토리 스킨 파헤치기 - 1탄 (3) | 2018.08.08 |