코틀린이란

김소희·2023년 12월 5일
2

이전부터 자바와 완벽히 호환되는 코틀린에 대한 관심이 있었는데 최근 채용공고에서 코틀린을 사용하는 기업을 종종 발견했어서 신입개발자로서 너무나 평범한 나의 이력서에 조금이라도 눈길을 끌 수 있기를 바라며 코틀린 공부를 시작했다.
코틀린을 쓴다고 하면 최신 트렌드에 관심이 많은 현대적인 사람처럼 보일 것 같다는 이유도 있지만 순수하게 배우고 싶은 마음이 더 큰 것 같다.
나는 자바를 너무나 사랑하는데 코틀린을 배우고 난 뒤에도 내 마음속 순위가 그대로일지 아니면 변할지 궁금하다.

코틀린의 타임라인

  • 2016.02 코틀린 1.0 릴리즈
  • 2017.01 스프링 프레임워크 5.0부터 코틀린 공식 지원 발표
    스프링 프레임워크의 공식 문서 예제에서도 코틀린 예제를 보여 주고 있다.
  • 2017.05 구글 IO에서 안드로이드 공식 지원 언어로 발표
  • 2019.05 구글 IO에서 안드로이드 개발시 최우선 언어로 Kotlin-First 발표
  • 2022.05 코틀린 1.7 베타 릴리즈

코틀린의 특징과 장점

  • 코틀린은 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())
    }
}

자바와 코틀린의 차이점

자바에는 있고 코틀린에는 없는 기능

  1. 체크드 익셉션(Checked Exception)
    자바에서는 체크드 익셉션은 컴파일 에러가 발생하기 때문에 Try-catch문으로 감싸거나 Through 키워드로 예외를 전파해야 한다. 이때 많은 개발자가 catch안에서 에러를 해결하거나 복구하지 않고 주석으로 비워두는 의미없는 코드를 작성하는 일이 많아 생산성을 감소시키고 있다.
    코틀린은 체크드 익셉션을 강제하지 않기 때문에 Try-catch문을 생략할수도 사용할 수도 있다.
의미 없는 코드 예시
try {
	log.append(massage)
} catch(IOException e) {
	
}

try {
	File file = FileUtils.get(filename);
} catch(IOException e) {
	//파일이 없을때 어떤 처리를 해야할지 모르겠으니까 우선 로그만 출력하자
    logger.error(e.getMessage(), e);
}
  1. 기본 자료형
    자바에서는 int, Integer, String과 같은 원시 자료형을 지원하지만
    코틀린에서는 레퍼런스 타입만 지원하며 컴파일시 최적화 된 방식으로 컴파일된다.
//Kotlin
val age = 27
val str = i.toString()

//java로 컴파일시 자동으로 최적화 변환
int age = 27;
String str = String.valueOf(age);
  1. Static 키워드
    자바는 Static 키워드로 정적 맴버를 선언하는데 코틀린은 companion abject로 대체한다.
//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);
  1. 삼항 연산자
    자바에는 삼항 연산자가 있지만 코틀린에서는 if-else로 대신한다.
    자바에서는 if-else가 값을 리턴할 수 없지만 코틀린에서는 문이 아닌 식으로서 리턴가능하다.
String animalSound = "호랑이".equals(animal) ? "어흥" : "야옹";

//Kotlin
val animalSound: String = if ("호랑이"==animal) "어흥" else "야옹"
  1. 세미콜론(;)
    여기까지 봤다면 눈치챘겠지만 코틀린에서는 세미콜론이 필수가 아니다.

코틀린에는 있고 자바에는 없는 기능

  1. 확장
    개발자가 임의로 객체의 함수느 프로퍼티를 확장해서 사용할 수 있다.
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이 발생합니다.
  1. 기타
    스마트 캐스트, 실드 클래스(JDK15추가), 위임, 중위표현식, 연산자 오버로딩, 코루틴, etc

출처: 패스트캠퍼스 코틀린강의

profile
백엔드 자바 개발자 소희의 노트

0개의 댓글