
코틀린 언어에 대해 알아보고, Java와의 비교를 통해 특징을 알아보도록 하겠습니다.
Kotlin
JetBrain 사에서 대규모 애플리케이션을 만들기 위한 목적으로 만들어진 오픈소스 프로그래밍 언어입니다.
자바 및 기타 JVM언어와 호환됩니다.
베타버전만 2010년부터 2016년까지 6년에 달합니다.
코틀린의 가장 큰 장점은 안정성입니다.
대상 플랫폼
코틀린의 주 목적은 현재 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것입니다.
자바 뿐만 아니라 자바스크립트(JS)도 코틀린을 컴파일 할 수 있습니다. 따라서 코틀린 코드를 브라우저나 노드에서 실행할 수 있습니다.
코틀린의 철학
- 생산성(Productivility) - 빠르게 만들기
- 확장성(Scalability) - 확장에 따른 비용
- 유지보수성(Maintinability) - 수운 유지보수
- 신뢰성(Reliability) - 예상한 대로 동작하고 오류가 적음
- 효율성(Efficiency) - 빠르게 동작하고, 리소스(메모리, 프로세스 등)가 적게 필요
Build 과정

JVM 위에서 동작하기 때문에 Java 컴파일 과정과 유사합니다.
Kotlin Compiler를 통해 바이트 코드로 변환되고 Kotlin Runtime Library에 의존되어 실행합니다.
(Kotlin Runtime Library에는 Kotlin 표준 라이브러리, Java API를 확장한 내용 등이 있습니다.)
특징
Java 언어와의 비교
표로 간단히 요약하자면 아래와 같습니다.
| 분류 | Java | Kotlin |
| 컴파일러 | javac | kotlinc |
| 컴파일 결과물 | 바이트 코드(.class) | 바이트 코드(.class) |
| 실행 환경 | JVM | JVM |
| 문법 | 복잡한 문법 | 간결한 문법 |
| null 처리 | 어려움 | null 안정성 제공 |
| 제네릭 | 제한적인 타입 추론 | 자동 타입 추론 |
| 람다식 | 지원 | 지원 |
| 확장 함수와 확장 프로퍼티 | 지원하지 않음 | 지원 |
| 데이터 클래스 | 지원하지 않음 | 지원 |
| 코루틴 | 지원하지 않음 | 지원 |
| 다중상속 | X | X (상속과 인터페이스로 다중상속 효과) |
정적 타입 지정 언어
자바와 마찬가지로 코틀린 또한 정적 타입 지정 언어입니다.
정적 타입 지정
모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있습니다.
프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증합니다.
추가적으로, 자바와 달리 코틀린에서는 컴파일러가 타입 추론을 통해 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 타입 선언을 생략해도 됩니다.
var x = 1 // var x: Int = 1
var x = 1L // var x: Long = 1L
함수형 프로그래밍 (Functional Programming)
코틀린은 선언형 프로그래밍인 함수형 프로그래밍 방식을 사용합니다.
부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있습니다.
프로그래밍 패러다임
명령형 프로그래밍: 프로그램의 상태와 상태를 변경하는 구문의 관점에서 연산을 설명하는 방식. 즉, What이 아니라 How에 집중한다.
- 절차지향 프로그래밍: 문제를 순차적으로 처리하며 프로그램을 만드는 방식 (C, C++)
- 객체지향 프로그래밍: 객체들 간의 상호작용을 통해 프로그램을 만드는 방식 (C++, Java, C#)
선언형 프로그래밍: 프로그램이 무엇과 같은 지를 설명하는 방식. 즉, How가 아니라 What에 집중한다.
- 함수형 프로그래밍: 수학적 함수의 계산을 통해 자료를 처리하고 함수를 조합하여 프로그램을 만드는 방식 (코틀린)
부수 효과(Side Effect)
아래와 같은 변화 또는 변화가 발생하는 작업
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드 값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일 I/O가 발생함
순수 함수(Pure Function)
부수 효과를 제거한 함수
함수형 프로그래밍에서 사용하는 함수는 아래와 같은 함수들
- Memory or I/O의 관점에서 부수 효과가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
장점
- 함수 자체가 독립적이며 부수 효과가 없기 때문에 Thread에 안전성을 보장받을 수 있음
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있음 (Race Condirion에 대한 비용 감소)
1급 객체(First-Class Object)
- 변수나 데이터 구조 안에 담을 수 있음
- 파라미터로 전달할 수 있음
- 반환값으로 사용할 수 있음
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능함
참조 투명성(Referential Transparency)
- 동일한 인자에 대해 항상 동일한 결과를 반환해야 함 (멱등성 성립)
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지됨 (불변 데이터)
코틀린은 람다, 연산자 오버로딩, 고차 함수, 지연 연산(Lazy Evaluation) 등의 많은 방법으로 구성된 절차 및 함수적 프로그래밍 언어를 혼합했습니다.
자바에서는, 자바 8부터 스트림(Stream)을 지원해 위와 같은 효과를 누릴 수 있습니다.
Java 언어와의 상호운용성
이와 관련해 자바 프로그래머들이 던지는 첫 번째 질문은 아마도 "기존 라이브러리를 그대로 사용할 수 있느냐?" 일 것입니다.
코틀린 소스 코드는 자바와 동일하게 JVM에 의해 컴파일되어 수행이 되므로 Kotlin 프로젝트 내에서 Java 언어와 병행하여 사용이 가능하며 서로 호출을 하여 사용이 가능합니다.
자바 메소드를 호출하거나, 클래스를 상속(확장)하거나, 인터페이스를 구현하거나 자바 어노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능합니다.
기존 자바 프로젝트에 코틀린을 도입하는 경우, 변환 도구를 이용해 손쉽게 변환이 가능합니다.
간결한 작성
코틀린은 자바보다 간결하고 직관적인 문법을 가지고 있습니다.
불필요한 세미콜론이나 타입 선언 등을 줄여 가독성을 높입니다.
//Kotlin
val id = "wsb7788"
//Java
String id = "wsb7788";
널 안정성
자바에서, NullPointerExceptions 는 개발자들에게 많은 불만이었습니다.
사용자가 어떤 변수든지 null을 할당할 수 있습니다.
하지만 널 값을 갖는 객체 참조에 접근하는 동안 사용자가 NPE에 대해 처리해주어야 합니다.
코틀린에서는 기본적으로 모든 타입의 변수가 non-null 타입이기 때문에 모든 변수나 객체에 널 값을 할당할 수 없습니다.
널 값을 할당하거나 반환하려할 때 코틀린은 컴파일 단계에서 오류가 있음을 명시해줍니다.
널 값을 할당하려면 타입 뒤에 (?) 을 붙여 정의해야 합니다.
val str: String = "wow!"
str = null //ERROR !
val nullableString: String? = "Hello, world!"
nullableString = null
if(nullableString != null) {
println(nullableString.length)
} else {
println("nullableString is null")
}
// nullableString is null
확장 함수와 확장 프로퍼티
자바에서는 기존 클래스의 기능을 확장하려면 새로운 클래스를 생성하고 부모 클래스를 상속해야 합니다.
그래서 자바에서는 Extention 기능을 사용할 수 없습니다.
확장 함수(Extention function)
코틀린에서는 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있는 기능을 제공합니다.
확장 함수를 사용하면 이미 존재하는 클래스에 새로운 함수를 추가할 수 있지만 클래스 내부 구조나 멤버 변수에 직접적인 접근이 불가능합니다. 즉, 해당 클래스에서 사용 가능한 함수들만 사용할 수 있습니다.
클래스의 이름을 새 함수의 이름 앞에 Prefix로 사용하고 .(온점)으로 연결해 확장 함수를 만들 수 있습니다.
/**
* 문자열을 공백 기준으로 나누고 ( split(" ") )
* 각각의 요소에 첫 글자만 대문자로 바꾼 뒤 ( it.capitalize() )
* 문자 배열을 공백을 구분자로 이어 문자열 형태로 반환하는 함수 ( joinToString(" ") )
*/
fun String.toTitleCase(): String {
return this.split(" ").map{ it.capitalize() }.joinToString(" ")
}
fun main() {
val str = "hello world"
println(str.toTitleCase()) // Hello World
}
확장 프로퍼티(Extention Property)
코틀린에서는 기존 클래스에 확장 속성을 추가해 기존 클래스의 속성을 확장할 수 있습니다.
이를 통해 기존 클래스의 기능을 확장하거나 수정할 수 있습니다.
/**
* val {확장할 클래스명}.{프로퍼티명}: {타입}
* get() = {프로퍼티 게터}
* set(value) {프로퍼티 세터}
*/
val Int.isEven: Boolean
get() = this % 2 == 0
fun main() {
val num = 10
if(num.isEven) {
println("$num is Even")
} else {
println("$num is Odd")
}
}
// 10 is even
코루틴 (Coroutine) 지원
자바
장기간 실행되는 네트워크 I/O 또는 CPU 연산 작업을 시작할 때마다 해당 스레드가 차단됩니다.
Android는 기본적으로 싱글 스레드이기 때문에 Java는 백그라운드에서 여러 스레드를 생성하고 실행할 수 있는 기능을 제공하지만, 관리하는 것은 복잡한 작업입니다.
코틀린에서도 장기간의 집중 작업을 실행하기 위해 여러 스레드를 생성할 수 있습니다.
코루틴을 통해 스레드를 차단하지 않고 특정 지점에서 실행을 중지하는 동시에 장기간의 집중 작업을 실행할 수 있습니다.
코루틴(Coroutine)
비동기적으로 실행되는 경량 스레드
스레드보다 더 가볍고 효율적인 방식으로 비동기 코드를 작성할 수 있도록 도와줌
일반적인 스레드와 달리 코루틴은 자체적으로 CPU 자원을 소비하지 않기 때문에 오버헤드가 적음
멀티태스킹을 가능하게 하여 동시에 여러 작업을 수행할 수 있음
상속과 인터페이스로 다중상속 효과를 얻을 수 있다
코틀린도 자바와 마찬가지로 다중상속을 지원하지 않습니다.
하지만 인터페이스를 이용하여 다중상속의 효과를 얻을 수 있습니다.
interface A {
fun a()
}
interface B {
fun b()
}
class C : A, B {
override fun a() {
println("A")
}
override fun b() {
println("B")
}
}
fun main(args: Array<String>) {
val c = C()
c.a()
c.b()
}
데이터 클래스 (Data Class)
자바
데이터만을 보유해야 하는 클래스가 필요할 때, 이를 위해서 생성자, 데이터를 저장할 변수, getter 및 setter 메서드, hashcode(), toString(), equals() 함수를 정의해야 합니다.
코틀린
데이터를 보유해야 하는 클래스가 필요한 경우 클래스를 정의할 때 앞에 'data' 키워드를 붙여 선언할 수 있습니다.
해당 키워드를 확인한 컴파일러는 생성자, 게터, 다양한 필드에 대한 세터 메서드 생성과 같은 모든 작업을 처리합니다.
스마트 캐스트 (Smart Cast)
자바
변수의 종류와 캐스팅을 확인해야 합니다.
코틀린
캐스팅 검사를 is-checks 키워드로 처리하여 값을 확인하고 암시적 캐스팅을 수행합니다.
예외 처리 (Exception Handling)
자바
개발자가 예외를 선언하고 포착할 수 있는 예외를 지원합니다.
확인된 예외(Checked Exception)는 컴파일 에러가 발생하기 때문에 무조건 try-catch로 감싸거나 throw로 예외를 전파해야 합니다.
이러한 오류 처리는 강력한 코드로 이어집니다.
코틀린
예외 상황에 대한 확인된 예외(Checked Exception)을 강제하지 않습니다.
개발자는 예외를 선언하거나 잡을 필요가 없으며 이는 장단점이 존재합니다.
'Kotlin' 카테고리의 다른 글
| [Kotlin] 스코프 함수(Scope functions) - let, run, with, apply, also (0) | 2024.04.18 |
|---|