본문 바로가기
카테고리 없음

[kotlin] 안드로이드 개발자의 필수 언어! 꼭 알아둬야 할 코틀린 핵심 문법

by redstarry 2025. 9. 3.

지금 현재 안드로이드 공식어로 코틀린(Kotlin)으로 되어 있습니다. 자바(Java)에 비해 간결하기도 하고 직관적인 문법에 생산성이 높은 언어인 거 같습니다.

저도 예전에는 자바로 안드로이드 개발을 하였지만 현재는 완전에 코틀린으로 개발을 하고 있습니다. 그래서 반복적으로 사용하면서 핵심적인 문법을 정리해 보면 좋을 거 같아서 글을 적어봅니다. 한번 정리하면서 읽어보시면 앞으로 도움이 될 거라고 생각합니다.

 

1. 변수 선언 : val vs var

코틀린에서 변수를 선언할 때 2가지 방법이 있는데 차이점을 한번 정리해 봤습니다.

val (value)

한 번 값을 할당하면 바꿀 수 없는, 즉 읽기 전용(read-only) 변수를 선언할 때 사용합니다. 자바(java)로 따지면 fianl이랑 비슷하겠네요. 

val address: String = "서울특별시"
// address = "인천광역시" // 컴파일 오류!

 

var (variable)

값을 여러 번 바꿀 수 있는 가변(mutable) 변수를 선언할 때 사용합니다.

var height: Int = 170
height = 180 // 가능

 

2. Null의 안전성 (Null Safety)

자바로 안드로이드를 개발하다 보면 에러 나는 거의 상당수가 NullPointException(NPE)입니다. 그래서 앱이 크리시나는 경우가 상당합니다. 코틀린은 그런 자바의 보안점을 방지하기 위한 기능을 제공합니다. 기본적으로는 코틀린의 모든 변수의 타입에서는 null값을 가질 수가 없습니다. null을 강제로 허용하고 싶으면 변수의 타입 뒤에 물으표(?)를 붙여야 합니다.

var address: String = "서울특별시"
// address = null // 컴파일 에러

var address: String? = "인천광역시"
address = null // 가능

 

안전 호출 연산자(?.)

객체가 null이 아닐 경우에만 메서드를 호출하고, null이면 반환합니다. if(obj != null)을 쓸 필요가 없어졌습니다.

vat text: String? = "hello"
println(text?.lengt) // 출력

val nullText: String? = null
println(nullText?.length) // null출력 (NullPointException 발생 안함)

 

엘비스 연산자(?:)

변수가 null일 때 사용할 기본값을 지정할 수 있습니다. 

val address: String? = null
val displayAddress = address?: "서울특별시"
println(displayAddress) // 서울특별시 출력

 

3. 타입의 추론과 스마트한 캐스트

타입 추론

코틀린 컴파일러는 똑똑해서, 변수를 선언할 때 초기 값을 보면 타입을 알아서 추론해 줍니다. 그래서 타입을 명시하지 않아도 오류 없이 컴파일이 진행됩니다. 코드가 간결해지는 효과가 있습니다.

val title = "타이틀 입니다." // 컴파일러가 String 타입으로 추론합니다.
val age = 25 // 컴파일러가 Int 타입으로 추론합니다.

 

스마트 캐스트

특정 조건을 만족하면 컴파일러가 알아서 타입을 자동으로 변환해 주는 기능입니다. is 키워드로 타입을 확인하고 해당이 되면, 그 블록 안에서는 자동으로 해당 타입으로 캐스팅된 것으로 간주합니다.

fun printLength(obj: Any) {
	if(obj is String) {
		// obj를 String으로 따로 캐스팅할 필요 없이 바로 length를 사용 가능
		println("문자열 길이 : ${obj.length}")
	}
}

 

4. 람다식(Lambda Expressions)과 고차 함수(Higher-Order Functions)

 람다식과 고차 함수는 코드를 함수형 프로그래밍 스타일로 작성할 수 있게 도와줘서, 훨씬 유연하고 재사용성 높은 코드를 만들 수 있게 해줍니다.

람다식

이름없는 함수이고 주로 다른 함수의 인자로 전달하거나, 변수에 담아서 사용합니다. 안드로이드에서는 setOnClickListener를 설정할 때 아주 유용합니다.

 

자바(Java)

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 클릭 시
    }
});

 

코틀린(Kotlin)

button.setOnClickListener {
    // 간결
}

고차함수

함수를 인자로 받거나, 함수를 반환하는 함수를 말합니다. 코틀린의 표준 라이브러리에는 map, filter, forEach 등의 유용한 고차 함수들이 많이 있습니다. 이런 함수들을 잘 활용하면 복잡한 데이터 처리를 몇 줄로 해결할 수 있습니다.

val numbers = listOf(10, 20, 30, 40, 50, 60)

// filter: 짝수만 골라내기
val evenNumbers = numbers.filter { it % 2 == 0 } 
println(evenNumbers) // [20, 40, 60]

// map: 각 숫자를 제곱하기
val squaredNumbers = numbers.map { it * it }
println(squaredNumbers) // [100, 400, 900, 1600, 2500, 3600]