나는 안드로이드 개발자를 하고 싶은데 플러터만 하다보니 안드로이드가 잘 생각이 안 났다ㅠㅠ 그리고 옛날 안드로이드 프로젝트 당시 시간에 쫓겨 공부가 미흡했던 부분이 아쉬웠다✘ᴗ✘
그래서!! 공식 문서를 통해 코틀린 공부를 하며 다시 안드로이드 개발을 시작해보려고 한다(ว˙∇˙)ง
val
값이 변경되지 않는 변수
- 값 변경 불가
- 형식 변경 불가
val languageName:String = "Kotlin"
var
값이 변경될 수 있는 변수
선언된 변수에 값을 재할당var count:Int = 10 count = 15
두 형식을 통해 변경 가능한 항목을 명시해준다.
또한 코틀린은 유형 추론이 가능하다.
val languageName = "kotlin"
kotlin 컴파일러는 할당된 값의 유형을 기반으로 유형을 추론할 수 있다.
"kotlin"의 값이 String 유형이므로 따로 명시하지 않아도 languageName 또한 String 유형이라고 추론하는 것이다.
따라서 languageName 변수에 String 클래스의 일부가 아닌 함수를 호출할 수 없다.
languageName.toUpperCase() // String 클래스의 함수, 사용 가능
languageName.inc() // Int 연산자 함수, 사용 불가능
kotlin 변수는 기본적으로 null 값을 보유할 수 없다.
-> 기본 변수에서 null을 허용하지 않으며 변수에 값을 할당하지 않은 채로 사용하게 되면 문법 에러를 표시해 컴파일을 막아준다.
따라서 아래는 에러가 발생한다
val languageName: String = null
null 값을 포함하는 변수는 nullable로 '?'를 변수 유형의 접미사로 지정해 변수를 nullable로 지정할 수 있다.
val languageName: String? = null
위와 같이 String? 유형을 사용하면 String값 또는 null을 변수에 할당 가능하다.
nullable 변수는 NullPointerException이 발생하지 않도록 주의해야 한다.
// android의 일반 kotlin 패턴: Null 허용여부 내용 추가하기
객체 초기화를 늦게 하는 것으로 변수를 사용할 예정이지만 처음 상태를 정의하기 어려울 때 사용한다.
lateinit, lazy 속성을 사용해 변수의 초기화를 늦춘다.
lateinit: 후에 동작의 결과 값에 따라 변수의 값이 생성될 때 사용한다. 이후에도 값을 계속 바꿀 수 있다. (var)
lazy: 의존하는 값들이 초기화 된 이후에 값을 어떻게 초기화를 해줄지 정의한다. 한 번 초기화 된 후에는 값이 불변한다. (val)
// 기본적인 방법
var text: String? = null
// lateinit 사용하기
lateinit var text: String
// lazy 사용하기
val textLength: Int by lazy {
text.length
}
if - else 문
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절
if - else 표현식을 when 표현식으로 교체해 복잡도를 줄일 수 있다.
when 표현식의 각 분기는 조건, 화살표(->), 결과로 표시된다.
val answerString = when {
count == 42 -> "I have the answer."
count > 35 -> "The answer is close."
else -> "The answer eludes me."
}
println(answerString)
하나 이상의 표현식을 함수로 그룹화 할 수 있다.
함수 선언을 위해 fun 키워드 뒤에 함수 이름, 함수에 사용되는 입력 유형, 함수에서 반환하는 출력 유형을 선언한다.
fun example(age: Int): String
val answer = when(age){
in 1..10 -> "어린이"
in 11..19 -> "청소년"
else -> "성인"
}
위의 함수는 나이를 Int형으로 입력하면 그에 맞는 연령층을 String 유형으로 출력한다.
이 함수는 변수를 선언한 다음 즉시 반환한다.
fun generateAnswerString(countThreshold: Int): String {
return if (count > countThreshold) {
"I have the answer."
} else {
"The answer eludes me."
}
}
// 반환 키워드를 할당 연산자로 변환 가능
fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
"I have the answer"
} else {
"The answer eludes me"
}
이름이 존재하지 않는 함수
변수에 저장하여 사용할 수 있다.

참고를 위해 블로그에서 그림을 가져왔다.
val exampleFun: (String) -> Int = { input ->
input.length
}
함수의 유형과 표현식만 나타낸다.
다른 함수를 인자로 받거나 함수를 반환하는 함수
val addNum = (m: Int, n: Int) : Int {
return m + n
}
fun exampleFun(add:(Int, Int) -> Int, x: Int, y: Int){
return add(x, y)
}
println(exampleFun(addNum, 10, 5))
// 익명함수를 고차함수의 입력 파라미터에 구현할 수 있다
fun exampleFun(fun(m: Int, n: Int): Int {
return m + n
}, x: Int, y: Int)
val lamda = {m: Int, n: int -> m + n}
exampleFun(lamda, 10, 20)
// 이것도 람다식을 고차함수의 입력 파라미터에 구현할 수 있다.
example({m: Int, n: int -> m + n}, 10, 20)
val p1 = exampleFun()
val p2 = p1(10, 5)
fun exampleFun(): (Int, Int) -> Int {
return fun(m: Int, n: Int) : Int {
return m + n
}
}
val p1 = exampleFun()
val p2 = p1(10, 5)
fun exampleFun(): (Int, Int) -> Int {
return {m: Int, n: Int -> m + n}
}
class 키워드를 사용하여 클래스를 정의한다
클래스는 속성을 사용하여 상태를 나타낸다.
속성은 클래스 수준 변수로 클래스 사용을 위해 필요한 속성을 생성한다.
val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car
속성을 클래스 생성 시 맞춤설정하려면 맞춤 생성자를 정의한다.
class Car(val wheels: List<Wheel>)
클래스는 함수를 사용해 동작을 모델링한다.
함수는 상태를 수정하며 노출하고싶은 데이터만 노출할 수 있다.
class Car(val wheels: List<Wheel>) {
private val doorLock: DoorLock = ...
fun unlockDoor(key: Key): Boolean {
// Return true if key is valid for door lock, false otherwise
}
}
위의 코드에서 Car 클래스의 속성은 외부에서 비공개로 유지된다. 오직 함수 호출만을 통해 자동차를 잠금 해제 할 수 있다.
여기까지는 다 아는 내용이지만 혹시..? 내가 놓치는 부분이 있을까 싶어서 다시 했다. 그런데 시간이 조금 아까운 것 같기도 하고ㅠㅠ 조금 더 후딱 끝내야 됐는데...
다음부터는 조금 빠르게 빠르게 나가야겠다. 그리고 이 공부하는 와중에 개인 프로젝트로 무슨 앱을 할지 조금 결정한 것 같기도 하다!! ദ്ദി ᐕ))
그런데 내 폰은 아이폰인데 안드로이드 앱을 만들면 어디다가 테스트해보지..?
노션에 들어갔다가 옛날에 코틀린 공부를 정리한 자료를 발견했다!! 그래서 여기있는 내용을 추가하는 것으로 내용을 조금 수정했다(2023.01.06)
참고
전반적인 내용:
https://developer.android.com/kotlin/learn#simplifying
익명 함수 사진:
https://medium.com/depayse/kotlin-%ED%95%A8%EC%88%98-%EB%A6%AC%ED%84%B0%EB%9F%B4-function-literal-3-%EC%9D%B5%EB%AA%85-%ED%95%A8%EC%88%98-anonymous-function-8741783376cc
고차함수:
https://jade314.tistory.com/entry/4-Kotlin%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%81%B4%EB%9E%98%EC%8A%A4
lateinit, lazy:
https://velog.io/@haero_kim/Kotlin-lateinit-vs-lazy-%EC%A0%95%ED%99%95%ED%9E%88-%EC%95%84%EC%84%B8%EC%9A%94