본문 바로가기
Android

[Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 정리 3 - 코틀린 언어 소개

by 들풀민들레 2022. 2. 28.
본 글은 [Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 - 이지스퍼블리싱 (2022)] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강을 통해 확인해 주세요.

 

 

 

 

코틀린의 등장 배경


코틀린은 젯브레인스에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어입니다. 코틀린은 2011년 처음 공개되었으며 2017년 구글에서 안드로이드 공식 언어로 지정하면서 유명해졌습니다. ‘자바’가 인도네시아 섬 이름을 따와서 사용했듯이 자바를 대체할 목적으로 만든 ‘코틀린’도 러시아 섬 이름에서 유래했습니다.
코틀린으로 안드로이드 앱을 개발할 수 있는 것은 자바의 가상 머신인 JVM에 기반을 둔 언어이기 때문입니다. 즉, 코틀린으로 작성한 프로그램은 JVM에서 실행할 수 있습니다.

 

코틀린은 분명 자바와는 다른 언어입니다. 자바는 확장자로 ‘.java’를 사용하지만 코틀린은 ‘.kt’를 사용합니다. 하지만 코틀린 컴파일러(kotlinc)가 .kt 파일을 컴파일하면 자바 바이트 코드가 만들어집니다. 즉, 개발자는 자바와 다른 코틀린으로 코드를 작성하지만 컴파일하면 자바 클래스가 만들어지고 이를 JVM이 실행합니다. 이 때문에 코틀린이 자바를 대체할 목적으로 만든 언어라고 소개하는 것이죠.
안드로이드 앱 개발의 공식 언어가 코틀린으로 바뀌었지만 앱을 개발할 때는 여전히 자바를 이용할 수 있습니다. 그렇다면 코틀린으로 앱을 개발하면 자바보다 어떤 이점이 있을까요? 구글에서는 다음처럼 소개하고 있습니다.

 

•표현력과 간결함(expressive and concise)


코틀린의 최신 언어 기법을 이용하면 훨씬 간결한 구문으로 프로그램을 작성할 수 있습니다. 같은 로직을 자바와 코틀린으로 각각 작성해 보면 코틀린 코드가 훨씬 간결하다는 것을 알 수 있습니다.

 

•안전한 코드(safer code)


코틀린은 널 안전성null safety을 지원하는 언어입니다. 객체지향 프로그래밍에서 객체는 널 상태일 수 있으며 이때 런타임 오류인 널 포인트 예외NullPointException가 발생할 수 있습니다. 따라서 객체가 널인 상황을 고려해 개발해야 하는데, 코틀린에서는 변수를 널 허용nullable과 널 불허용not null으로 구분해서 선언합니다. 이로써 널과 관련된 여러 부분을 컴파일러가 해결해 줍니다. 그만큼 개발자가 작성하는 코드가 널 안정성을 확보할 수 있습니다.

 

•상호 운용성(interoperable)


코틀린은 자바와 100% 호환합니다. 따라서 코틀린으로 프로그램을 작성할 때 자바 클래스나 라이브러리를 얼마든지 활용할 수 있습니다. 코틀린 코드에서 자바 클래스를 이용할 수 있으며 반대로 자바 코드에서 코틀린 클래스를 이용할 수도 있습니다. 이뿐만 아니라 하나의 앱을 개발할 때 자바와 코틀린을 혼용해도 됩니다. 이미 자바로 개발한 앱을 유지·보수할 때 추가하는 코드만 코틀린으로 작성할 수도 있죠.

•구조화 동시성(structured concurrency)


코틀린 언어가 제공하는 코루틴coroutines이라는 기법을 이용하면 비동기 프로그래밍을 간소화할 수 있습니다. 네트워크 연동이나 데이터베이스 갱신과 같은 작업을 할 때 이용하면 프로그램을 조금 더 간단하게 그리고 효율적으로 작성할 수 있습니다.

 

 

코틀린 파일 구성


코틀린 파일의 확장자는 ‘.kt’입니다. 다음은 User.kt라는 이름의 코틀린 파일에 package와 import 구문을 선언하고 data라는 변수, formatDate()라는 함수, 그리고 User라는 클래스를 선언한 예입니다.

 

package com.example.test3
import java.text.SimpleDateFormat
import java.util.*

var data = 10

fun formatData(date: Date): String {
	val sdformat = SimpleDateFormat(“yyyy-mm-dd”)
	return sdformat.format(date)
}

class User {
	var name = “hello”
	fun sayHello() {
		println(“name : $name”)
	}
}

 

package 구문은 이 파일을 컴파일했을 때 만들어지는 클래스 파일의 위치를 나타내며 소스 파일에서 맨 처음 한 줄로 선언합니다. 즉, 이 파일의 클래스 파일은 com/example/test3 폴더에 생성됩니다.
그런데 package 이름은 kt 파일의 위치와 상관없는 별도의 이름으로도 선언할 수 있습니다. 예를 들어 User.kt 파일이 com/example/test3에 있더라도 package ch3처럼 선언할 수 있습니다. 물론 이렇게 선언했을 때 컴파일된 클래스 파일은 ch3 폴더에 생성됩니다.
import 구문은 package 구문 아래에 여러 줄 작성할 수 있습니다. 그리고 import 문 아래에 변수, 함수, 클래스를 선언할 수 있습니다. 변수와 함수는 클래스 안뿐 아니라 클래스 밖(최상위)에도 선언할 수 있습니다.
그리고 어떤 파일에 선언한 멤버(변수, 함수, 클래스)를 다른 코틀린 파일에서 참조할 때 두 파일을 같은 package로 선언했다면 import 없이 사용할 수 있습니다. 예를 들어 위의 코드처럼 User.kt 파일의 package 구문을 com.example.test3으로 선언했다고 가정해 보겠습니다.

 

이 파일의 멤버를 다른 코틀린 파일에서 이용하고자 User.kt 파일과 똑같은 package 구문으로 Test.kt 파일을 작성한다면 다음과 같습니다.

 

 

package com.example.test3

import java.util.*

fun main() {
	data = 20
	formatDate(Date())
	User().sayHello()
}

 

이렇게 하면 Test.kt 파일에서 User.kt 파일의 멤버를 import 구문 없이 사용할 수 있습니다. 그런데 만약 다음처럼 package 구문을 다르게 선언한다면 사용할 멤버를 import 구문으로 지정해야 합니다.

 

package ch3

import com.example.test3.User
import com.example.test3.data
import com.example.test3.formatDate
import java.util.*

fun main() {
	data = 20
	formatDate(Date())
	User().sayHello()
}

 

코틀린 소스를 테스트하는 방법


이번 마당에서 다루는 코틀린 코드는 단순히 코틀린 소스 파일의 main() 함수를 실행하는 코드입니다. 이러한 코틀린 소스 파일을 실행하려면 인텔리제이나 이클립스 같은 개발 도구가 있어야 하지만, 여기서는 안드로이드 스튜디오에서 실행하는 방법을 알아보겠습니다.
먼저 안드로이드 스튜디오에서 안드로이드 프로젝트를 하나 생성합니다. 그리고 프로젝트 탐색 창에서 java 디렉터리 아래 패키지명으로 된 경로(예: com.example.모듈명)를 마우스 오른쪽으로 클릭하고 [New → Kotlin Class/File → File]을 선택한 후 적당한 이름으로 코틀린 파일을 만듭니다. 테스트할 코틀린 소스 파일에는 다음처럼 main() 함수가 있어야 하며, 이 소스 파일을 실행하면 main() 함수가 자동으로 실행됐다가 끝나면 프로그램이 종료됩니다.

 

fun main() {
    println(“hello world”)
}