본문 바로가기
Android (Kotlin & Compose)/Part 1. 개발 시작과 코틀린

[오늘의 코드 조각] [1-2] Jetpack Compose를 위한 코틀린 핵심 문법

by 생각하는 개발자님 2025. 8. 25.
반응형

안녕하세요, '생각하는 개발자'입니다.

첫 번째 포스팅에서 "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를 시작하기 위해 꼭 필요한 코틀린의 핵심 문법입니다. 지금 당장 모든 것이 완벽하게 이해되지 않아도 괜찮습니다. 앞으로 실제 앱을 만들면서 이 개념들이 어떻게 사용되는지 반복해서 보다 보면 자연스럽게 익숙해질 거예요.

 

반응형