안녕하세요, '생각하는 개발자'입니다.
첫 번째 포스팅에서 "Hello, Compose!"를 성공적으로 화면에 띄워보았습니다. 하지만 아직은 우리가 직접 코드를 작성했다기보다, 안드로이드 스튜디오가 만들어준 코드를 실행해 본 것에 가깝죠.
이제는 우리 손으로 직접 앱의 동작을 만들기 위해, 안드로이드의 공식 언어인 **코틀린(Kotlin)**과 친해져야 합니다. 마치 외국인 친구와 대화하기 위해 기본적인 단어와 문법을 배우는 것과 같아요. 코틀린의 모든 것을 알 필요는 없습니다. 딱 Jetpack Compose를 다루는 데 필요한, 가장 중요하고 실용적인 문법만 골라서 알아보겠습니다.
2.1. 변수와 함수: 데이터와 행동의 기본
프로그래밍은 결국 '데이터'를 '어떤 행동'으로 처리하는 과정입니다. 코틀린에서는 이 두 가지를 **변수(Variable)**와 **함수(Function)**로 표현합니다.

변수: 데이터를 담는 그릇 🏺
변수는 숫자, 글자 등 데이터를 담아두는 그릇입니다. 코틀린에는 두 종류의 그릇이 있습니다.
- val (value): 한 번만 담을 수 있는 그릇. 내용물을 바꿀 수 없습니다. (불변, Immutable)
- var (variable): 내용물을 여러 번 바꿀 수 있는 그릇. (가변, Mutable)
fun main() {
val name = "생각하는 개발자" // val로 선언. 이제 name의 내용은 바꿀 수 없음.
var age = 20 // var로 선언. age의 내용은 바꿀 수 있음.
// name = "다른 이름" // 이 코드는 에러 발생! val은 바꿀 수 없다.
age = 21 // 가능! var는 얼마든지 바꿀 수 있다.
println(name) // 출력: 생각하는 개발자
println(age) // 출력: 21
}
Tip: 코드는 안정성을 위해 일단 val로 만들고, 꼭 바꿔야 할 때만 var를 쓰는 것이 좋습니다.
함수: 행동을 정의하는 레시피 📜
함수는 특정 행동이나 작업을 정의해 놓은 코드 묶음, 즉 '레시피'입니다. 비슷한 작업을 반복해야 할 때, 함수라는 레시피를 한 번만 만들어두고 필요할 때마다 호출해서 사용합니다.
// 두 숫자를 더하는 '레시피'를 만든다.
fun add(a: Int, b: Int): Int {
return a + b
}
fun main() {
val result = add(5, 3) // add라는 레시피를 사용!
println(result) // 출력: 8
}
- fun: 함수를 만들겠다는 키워드입니다.
- add: 함수의 이름(레시피 이름)입니다.
- (a: Int, b: Int): 함수에 필요한 재료(파라미터)입니다. 정수(Int) a와 b가 필요하네요.
- : Int: 이 레시피의 최종 결과물(반환 타입)은 정수(Int)라는 뜻입니다.
- return a + b: 실제 레시피 내용입니다. a와 b를 더한 값을 돌려줍니다.
2.2. Null 안전성: 골치 아픈 오류 미리 막기
많은 프로그래밍 언어에서 가장 흔하게 발생하는 오류 중 하나가 바로 'Null Pointer Exception'(NPE), 즉 "아무것도 없는데(null) 그걸 사용하려고 하네?"라는 오류입니다.
코틀린은 이 문제를 언어 차원에서 미리 막을 수 있는 아주 강력한 'Null 안전성' 기능을 제공합니다.
- String: 절대로 null(빈 값)이 들어올 수 없는 타입.
- String?: null이 들어올 수도 있는 타입. **물음표(?)**가 핵심입니다.
var name: String = "생각하는 개발자"
// name = null // 에러 발생! non-null 타입에는 null을 넣을 수 없다.
var nullableName: String? = "생각하는 개발자"
nullableName = null // 가능! ?가 붙어있어 null을 허용한다.
// nullableName의 길이를 출력하고 싶을 때
println(nullableName?.length) // 만약 nullableName이 null이 아니면 길이를 출력하고, null이면 그냥 null을 출력해줘. (안전)
// println(nullableName!!.length) // 나는 nullableName이 절대 null이 아니라고 100% 확신해! 만약 null이면 앱 터뜨려도 좋아. (위험)
Tip: 앱이 갑자기 중지되는 최악의 상황을 막기 위해, 위험한 !! 연산자보다는 안전한 ? 연산자를 사용하는 습관을 들이세요.
2.3. 람다 함수: 이름 없는 일회용 함수
람다(Lambda)는 이름이 없는 함수입니다. Jetpack Compose에서는 이 람다 함수를 정말 많이 사용하기 때문에 꼭 알아두셔야 합니다. 특히 버튼을 클릭했을 때 어떤 행동을 할지 정의할 때 필수적으로 사용됩니다.
일반 함수로 버튼 클릭을 처리하려면 매번 함수를 만들어야 해서 번거롭습니다.
fun onMyButtonClick() {
println("버튼이 클릭되었습니다!")
}
// Button(onClick = { onMyButtonClick() }) // 매번 함수를 만들어 연결해야 함
하지만 람다를 사용하면, 함수를 미리 만들 필요 없이 필요한 그 자리에서 즉시 행동을 정의할 수 있습니다.
// Button을 클릭했을 때 { ... } 안의 코드를 실행해줘!
Button(onClick = {
println("버튼이 클릭되었습니다!")
// 다른 작업도 추가할 수 있음
})
여기까지가 Jetpack Compose를 시작하기 위해 꼭 필요한 코틀린의 핵심 문법입니다. 지금 당장 모든 것이 완벽하게 이해되지 않아도 괜찮습니다. 앞으로 실제 앱을 만들면서 이 개념들이 어떻게 사용되는지 반복해서 보다 보면 자연스럽게 익숙해질 거예요.
'Android (Kotlin & Compose) > Part 1. 개발 시작과 코틀린' 카테고리의 다른 글
| [오늘의 코드 조각] [1-3] 코틀린 객체지향 프로그래밍 (1) | 2025.08.26 |
|---|---|
| [오늘의 코드 조각] [1-1] Modern Android 개발 첫걸음 (0) | 2025.08.24 |