이전부터 자바와 완벽히 호환되는 코틀린에 대한 관심이 있었는데 최근 채용공고에서 코틀린을 사용하는 기업을 종종 발견했어서 신입개발자로서 너무나 평범한 나의 이력서에 조금이라도 눈길을 끌 수 있기를 바라며 코틀린 공부를 시작했다.
코틀린을 쓴다고 하면 최신 트렌드에 관심이 많은 현대적인 사람처럼 보일 것 같다는 이유도 있지만 순수하게 배우고 싶은 마음이 더 큰 것 같다.
나는 자바를 너무나 사랑하는데 코틀린을 배우고 난 뒤에도 내 마음속 순위가 그대로일지 아니면 변할지 궁금하다.
코틀린은 IntelliJ로 유명한 JetBrains에서 개발한 언어이기 때문에
IntelliJ에서 자동완성, 자바-코틀린 변환, 코루틴 등 코틀린 관련 편의 기능을 완벽하게 지원하고 있어서 코딩이 편해진다.
자바에서 Best-Practice로 불리는 기법들을 언어적 차원에서 기본제공한다.
(ex) 이펙티브 자바, 디자인 패턴 등)
자바에 비해 문법이 간결하기 때문에 가독성과 생산성이 높고 오류 가능성이 적어진다.
학습하기 쉽고 자바에 익숙하다면 더 쉽게 익힐 수 있다.
자바와 상호 운용이 가능하기 때문에 기존 자바 프로젝트에 적용하기 쉽고,
자바로 작성된 오픈소스를 그대로 사용할 수 있다.
object Member {} <- object로 싱글톤 객체를 자동생성할 수 있다.
함수를 탑 레벨에 위치 시킬 수 있어서 클래스 외부에서 별도의 클래스 없이 함수나 변수를 작성하여 사용할 수 있다.
코틀린에는 new 라는 키워드가 없어서 코드가 더 간결하다.
멀티 플랫폼 언어로써 서버, 안드로이드, IOS, 자바스크립트 등 모든 분야에서 사용이 가능하다.
Google Home팀에서 코틀린 도입 후 NullPointException으로 비정상 종료가 되는 유형을 33%나 감소시켰다는 뉴스가 있을 정도로 Null을 잘 다룬다.
오픈소스 빌드 자동화 도구인 Gradle에서도 코틀린DSL을 지원하고 인텔리제이에서 자동완성, 컴파일 검사를 받을 수 있다.
JetBrains에서는 100% 코틀린으로 Ktor 라는 서버 프레임워크와 Exposed 라는 ORM 프레임워크를 개발했다.
Quarkus, Micronaut, Javalin과 같은 경량 프레임워크에서도 코틀린을 지원하고 있다.
백틱(역쉼표)으로 문자를 감싸면 함수명에 띄어쓰기나 예약어를 사용할 수 있다.
java 테스트할때 사용하던 Mockito대신 MockK 라이브러리를 사용할 수 있다.
코루틴은 비동기-논블로킹 방식을 선언형으로 구현하기 위한 기능으로 스프링 MVC, 스프링 WebFlux 둘다 지원하고 있다.
ex)suspend 키워드, withContext, async, await 함수 등
@RestController
class UserController(
private val userService: UserService,
private val userDetailService: UserDetailService
) {
@GetMapping("/{id}")
suspend fun get(@PathVariable id: Long): User {
return userService.getById(id)
}
@GetMapping("/users")
suspend fun get() = withContext(Dispatchers.IO) {
val usersDeferred = async { userService.gets() }
val userDetailsDeferred = async { userDetailService.gets() }
return@withContext UserList(usersDeferred.await(), userDetailsDeferred.await())
}
}
의미 없는 코드 예시
try {
log.append(massage)
} catch(IOException e) {
}
try {
File file = FileUtils.get(filename);
} catch(IOException e) {
//파일이 없을때 어떤 처리를 해야할지 모르겠으니까 우선 로그만 출력하자
logger.error(e.getMessage(), e);
}
//Kotlin
val age = 27
val str = i.toString()
//java로 컴파일시 자동으로 최적화 변환
int age = 27;
String str = String.valueOf(age);
//java
public class JavaClass {
static int i = 0;
public static void staticMethod() {
}
}
//Kotlin
class KotlinClass {
companion object {
val i: Int = 0;
fun function() {
}
}
//java로 컴파일시 자동으로 최적화 변환
int age = 27;
String str = String.valueOf(age);
String animalSound = "호랑이".equals(animal) ? "어흥" : "야옹";
//Kotlin
val animalSound: String = if ("호랑이"==animal) "어흥" else "야옹"
fun String.alphabet(): Char {
return this[0]
}
fun String.addAlphabet(char: Char): String {
return char + this
}
fun main() {
println("ABCD".alphabet()) // 출력: A
println("ABCD".addAlphabet('Z')) // 출력: ZABCD
}
2.데이터 클래스
자바에는 데이터를 보관하거나 전달하는 목적을 가진 DTO를 주로 Lombok과 @Date 사용하여 전달하지만 코틀린에서는 불변 객체로 사용한다. JDK15에서는 record도 추가되었다.
아래와 같이 선언하면 코드상에는 보이지 않지만 hashCode(), equals(), toString(), copy(), componentN()가 자동생성 되며 유용하게 쓰인다.
date class Person(val name: String, val age: Int)
3.문자열 템플릿
문자열에 변수를 사용하거나 여러 행으로 된 텍스트 블록을 만들 수 있다.
val text = "World"
val greeting = "Hello, $text"
println(greeting) // 출력: Hello, World
// 문자열 템플릿 기반의 다이나믹 쿼리
fun sql(nameIncluded: Boolean) =
"""
SELECT id, name, email, age
FROM member
WHERE id = :id
${
if (nameIncluded) {
"""
AND name = :name
"""
} else ""
}
"""
4.null 안정성
자바에서 가장 많이 발생하는 예외인 NullPointerException를 처리하기 위해 옵셔널 (Optional)로 값을 감싸면 객체 생성에 따른 오버헤드가 발생하고, 컴파일 단계에서 Null 가능성을 검사하지 않게 되는데 코틀린에서는 언어적차원에서 NullPointerException가 발생할 가능성을 제거하여 null 안정성을 제공하고 있다.
//not null
var a: String = null //컴파일 오류 발생
var b: String = "abc"
b= null //컴파일 오류 발생
//nullable
var a: String? = null
a.length // 컴파일 오류: 'a'가 null이므로 바로 접근할 수 없습니다.
println(a?.length) // safe-call: 'a'가 null이면 null을 반환하고, 아니면 문자열의 길이를 반환합니다.
a!!.length // Null이 아니라고 확신하는 경우에 사용하며, 'a'가 null이면 NullPointerException이 발생합니다.
출처: 패스트캠퍼스 코틀린강의