코딩공부

Kotlin을 알아보자

integerJI 2024. 10. 27. 00:44

 

현재 회사에서는 Java를 사용한다. 나중에 Kotlin을 사용할 때를 대비하기 위하여 코틀린은 자바에 비하여 무엇이 좋고 기업에서 왜 사용하는지 궁금하여 알아보았다.

 

코틀린의 장점

1. 간결함

코틀린은 자바보다 구문이 간단하다. 이로 인하여 코드를 더 쉽게 짤 수 있고 유지보수 차원에서도 유용하게 적용된다.

 

간단하게 예를 들자면 아래의 함수는 리스트의 짝수의 합을 구하는 코드이다.

 

Java

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);

        int sumWithForEach = calculateSumWithForEach(numbers);
        System.out.println("Sum with for-each: " + sumWithForEach);

        int sumWithStream = calculateSumWithStream(numbers);
        System.out.println("Sum with stream: " + sumWithStream);
    }

    public static int calculateSumWithForEach(List<Integer> numbers) {
        int sum = 0;
        for (int number : numbers) {
            if (number % 2 == 0) { // 짝수 확인
                sum += number;
            }
        }
        return sum;
    }

    public static int calculateSumWithStream(List<Integer> numbers) {
        return numbers.stream()
                      .filter(number -> number % 2 == 0)
                      .reduce(0, Integer::sum);
    }
}

 

Kotlin

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5, 6)
    val sum = numbers.filter { it % 2 == 0 }.sum()
    println(sum)
}

 

 

Java의 경우 코드의 스타일, 처리방식에 따라 for-each와 stream으로 작성할 수 있다. 

 

하지만 이보다 더 간결하게 함수를 만든다. 

 

2. NullPointException의 안정성

코틀린은 기본적으로 null을 허용하지 않는다. 변수를 선언할 때 기본적으로 non-null로 지정되기 때문에 null과 관련된 예외 처리나 오류가 컴파일 단계에서 줄어들고, 코드 작성도 훨씬 간결해진다.

 

Java

public String getUpperCaseName(Person person) {
    return Optional.ofNullable(person)
        .map(Person::getName)
        .map(String::toUpperCase)
        .orElse("");
}

 

Kotlin

fun getUpperCaseName(person: Person?): String {
    return person?.name?.uppercase() ?: ""
}

 

코틀린에서는 ?. 연산자를 사용해 null 여부를 간단하게 체크하고, ?: 연산자로 기본 값을 지정할 수 있다. 자바는 Optional을 사용해 널 안정성을 확보할 수 있지만, 코틀린의 null 처리 방식이 더 직관적인 장점이 있다.

 

 

* NullPointerException 발생 포인트 예시

더보기

Java

public String getUpperCaseName(Person person) {
    return person.getName().toUpperCase();
}

 

자바에서는 Optional을 사용하지 않고 null 체크를 하지 않으면 person가 없을 때 NullPointerException이 발생

 

Kotiln

fun getUpperCaseName(person: Person?): String {
    return person?.name?.uppercase() ?: "이름 없음"
}

 

person이나 name이 null일 경우 ?. 연산자가 null을 반환하며, ?: 연산자를 통해 "이름 없음"을 반환

 

 

코틀린의 단점

1. 컴파일 속도

코틀린은 자바보다 컴파일 속도가 조금 더 걸릴 수 있다. 코틀린에서 기본적으로 제공하는 안정성과 추가 기능들, 또한 Null 관련 검사를 자동으로 수행하며 이 과정에서 컴파일 속도가 늦춰질 수 있다.

 

컴파일 속도가 정말 차이날까? 궁금해서 새로운 프로젝트를 만나 기본 동일한 설정에서 테스트해 보았다. 

--> https://integer-ji.tistory.com/427

 

2. 자바와의 호환성

코틀린의 큰 장점으로는 자바와 호환이 잘되는 점을 뽑는다. 하지만 아이러니 하게도 자바가 가지고 있는 모든 라이브러리나 프레임워크가 코틀린을 100% 지원을 장담하진 않는다. 이 부분에서 필요한 라이브러리가 적용이 안될 경우 제한사항이 발생할 수 있다. 

 

 

느낀점

코틀린을 살펴본 결과, 생산성과 가독성 면에서 확실한 장점이 느껴진다. 코드가 더 간결해져 유지보수에 유리하고, 널 안정성 덕분에 런타임 오류를 줄일 수 있는 건 큰 장점이라 생각한다.

 

또한, 코틀린의 문법은 안드로이드, JavaScript와 같은 다른 플랫폼 언어들과 유사하다 느꼈는데 이 점은 개발 인력이 부족한 스타트업이나 다양한 플랫폼을 제공해야 하는 초기 구축 단계에서 큰 장점으로 발휘하지 않을까 생각한다.

 

하지만 이미 자바로 구축되어 몇십 년 이상 서비스되는 곳에서는 코틀린을 도입하기 어려울 것 같다는 생각이 들었다. 코틀린을 자바 프로젝트에 추가할 경우 생길 수 있는 호환성 문제와 의존성 관리의 복잡성도 고려해하며 새로운 이슈가 발생될 때 대응이 어렵다는 점도 크게 느껴진다.

결론적으로, 코틀린의 장점을 잘 이해하고 필요할 때를 대비하되, 현재 환경에서는 자바의 깊이를 더해가는 것도 좋은 선택이라고 생각이 된다.

 

 

최종정리

코틀린이라는 언어를 직접 사용해 보기 전의 전반적이 느낌을 적어 보았다. 하지만 여기서 끝내지 않고 더 공부를 해가 보면 충분히 장점과 단점이 더 많이 나올 것이다. 그때 다시 이 글을 보며 회고를 작성하면 좋을 것 같다.