코틀린이란 무엇이며 왜 필요한가?

유우선·2026년 1월 26일

Kotlin Study📚

목록 보기
1/32

코틀린의 주요 특성

  • 코틀린은 다중 패러다임 언어이다.

  • 정적 타입 지정 언어로써 런타임 도중이 아닌 커파일 시점에 오류를 잡아낼 수 있다.

  • 객체 지향 언어와 함수형 언어의 조합으로 더 강력한 추상화를 적용할 수 있다.

  • 비동기 코드를 작성할 수 있는 강력한 방법을 지원한다.


코틀린은 다중 플랫폼 언어다.

일반적인 코틀린 사용 영역

  • 안드로이드 디바이스에서 동작하는 모바일 애플리케이션

  • 서버 상의 코드 (특히 웹 애플리케이션의 백엔드)

현재 자바가 사용되고 있는 영역에 적용 가능

  • 아주 작은 디바이스 실행 환경부터 큰 데이터 센터에 이르는 다양한 실행 환경

  • 자바에 비해 더 적은 코드로 더 편하게 목표를 달성할 수 있음

코틀린 다중 플랫폼

  • 데스크톱, iOS, 안드로이드, 브라우저 등에서도 실행되는 크로스플랫폼 애플리케이션을 만들 수 있음

코틀린의 핵심 특징

정적 타입 지정으로 성능, 신뢰성, 유지 보수성이 모두 좋아진다.

  • 정적 타입 지정 언어의 핵심 장점 = 모든 식의 타입을 컴파일 시점에 알 수 있음

    • 필드가 존재하지 않거나 함수의 반환타입이 예상과 달라짐에 따라 발생할 수 있는 버그를 런타임 도중이 아닌 컴파일 시점에 발견
    • 개발 사이클의 앞쪽에서 문제를 발견하고 해결할 수 있음
  • 이외의 장점

    • 호출할 메서드를 런타임에 찾지 않아 호출이 빨라 성능이 좋음
    • 타입을 통한 일관성 검증을 통해 프로그램이 실패할 가능성이 줄어듬
    • 코드가 작용하는 타입을 볼 수 있기 때문에 낯선 코드를 다룰 때도 더 쉬움
    • 리펙터링 신뢰도가 높으며 IDE 기능의 정확도도 높음

타입 추론

  • 컴파일러가 문맥으로 고려해 변수 타입을 결정하는 코틀린의 기능으로 개발자가 모든 변수의 타입을 모두 지정해주어야 하는 정적 타입 지정 언어의 불편함을 해소하고 생산성을 향상시킴

널이 될 수 있는 타입

  • nullable을 지원함에 따라 런타임에 프로그램이 망가지는 대신, NullPointException이 발생하는지 여부를 컴파일 단계에서 검사할 수 있어 프로그램의 신뢰성을 높일 수 있음

함수형 프로그래밍과 객체지향 프로그래밍의 조합

함수형 프로그래밍의 핵심 개념

  • 함수를 일반 값처럼 다룰 수 있어, 함수를 변수에 저장하거나 인자로 전달할 수 있으며 함수에서 새로운 함수를 반환할 수 있음

  • 일단 만들어지고 나면 내부 상태가 변하지 않는 불변 객체를 사용함

  • 부수 효과가 없음

코드 중복을 피할 수 있음

  • 비슷한 기능을 담담하는 코드 조각에 대해서 공통 로직을 함수로 뽑아내고 서로 다른 세부 사항을 인자로 전달할 수 있음

    • 이 때 전달하는 인자는 그 자체가 함수임
  • 람다식을 통해 이런 함수를 표현할 수 있음

안전한 동시성

  • 불변 데이터 구조와 순수 함수 사용을 통해 안전하지 않은 데이터 변경을 차단할 수 있어 복잡한 동기화 방법을 적용하지 않아도 되면 신뢰성이 높음

테스트 하기 쉬움

  • 부수 효과가 없기 때문에 stub, driver등의 테스트 도구없이 독립적인 테스트가 가능함

  • 외부 세계와 상호작용 하지 않으므로 코드에 대해 쉽게 추론할 수 있음

함수형 프로그래밍을 지원하는 코틀린의 특징

  • 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받고나 함수가 새로운 함수를 반환할 수 있음

  • 람다식을 통해 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있음

  • 맴버 참조를 통해 어떤 객체의 함수를 값으로 사용할 수 있음

  • 데이터 클래스를 통해 불변적인 데이터를 저장하는 클래스를 간결하게 만들 수 있음

  • 코틀린 표준 라이브러리는 객체와 컬랙션을 함수형 스타일로 다룰 수 있는 API를 제공함

객체지향과 함수형 접근 방식을 적절히 조합해 해결하고자 하는 문제에 가장 적합한 도구를 사용할 수 있음


다른 언어와 구분되는 코틀린의 주요 특징

코틀린의 철학 = "상호운영성에 초점을 맞춘 실용적이고 간결하며 안전한 언어"

코틀린은 실용적인 언어다!

  • 배태랑 개발자의 경험과 대략 10년간의 피듭백을 반영함

  • 다른 언어가 채택한 검증된 해법과 기능을 사용함

  • 특정 프로그래밍 스타일이나 패러다임을 가용하지 않음

    • 실제로 프리코스와 최종 테스트에서 객체지향 스타일을 사용했으나 정상적으로 구현할 수 있었음

코틀린은 간결하다!

  • getter/setter, 생성자 파라미터를 필드에 전달하기 위한 로직을 암시적으로 제공

  • 강력한 타입 추론으로 타입을 직접 지정할 필요 없음

  • 표준 라이브러리를 통해 반복되거나 길어질 수 있는 코드를 함수 호출로 대체할 수 있음

  • 작성 시간, 코드를 이해하는 시간이 짧아 생산성이 높음

코틀린은 안전하다!

  • 안전한 프로그래밍 언어?

    • 발생할 수 있는 오류 중 일부 유형의 오류를 언어 설계 차원에서 방지
    • 하지만 모든 오류를 방지할 순 없음
    • 오류 방지를 위해 많은 정보를 입력할수록 생산성을 하락하지만 안정성은 상승하는 trade off가 성립함
  • JVM에서 실행한다는 사실 자체가 상당한 안전성을 보장함

    • 메모리 안정성 보장
    • 버퍼 오버플로우 방지
    • 동적 메모리 할당 관련 문제 예방
  • 정적 타입 언어로서 애플리케이션의 타입 안전성을 더 보장할 수 있음

  • 읽기 전용 변수의 선언이 간단함

  • 불변 변수를 data class로 묶을 수 있음

  • 다중 스레드 애플리케이션에서 안전성이 높음

  • 타입 검증을 통해 컴파일 시점에 더 많은 오류를 방지할 수 있음

코틀린은 상호 운용성이 좋다!

(JVM을 타깃으로 하는 코틀린에 해당)

  • 자바의 기존 라이브러리를 그대로 사용할 수 있음

  • 자바 코드에서 코틀린 코드를 호출할 때 어떠한 작업도 필요없음

  • 기존 자바 라이브러리의 함수 몇가지를 확장해 코틀린에서 더 쉽게 사용할 수 있음

  • 다중 언어 프로젝트를 완전히 지원함

    • 자바 소스 파일과 임의로 섞여있어도 각 소스 파일 사의의 의존 관계에 상관 없이 컴파일 가능

코틀린 코드 컴파일

코틀린은 컴파일 언어로서 코드를 실행하기 위해선 반드시 컴파일해야 함

  • 컴파일 가능 타깃
    • JVM 바이트 코드

    • 안드로이드에서 실행되기 위한 JVM 바이트 코드

      • 안드로이드 런타임은 JVM 코드를 Dex 바이트코드로 변환하고 실행
    • 다른 OS에서 네이티브로 실행되기 위한 네이티브 타깃

    • 브라우저에서 실해되기 위한 자바스크립트 또는 웹어셈블리

코틀린/JVM 에서의 컴파일 과정

  • 자바와 마찬가지로 소스 코드를 분석해 .class 파일을 생성함

  • 만들어진 .class 파일은 애플리케이션 유형에 맞는 표준 패키징 과정을 거쳐 실행 가능

코틀린 런타임 라이브러리

  • 코틀린의 기본 클래스가 정의되어 있음

  • 표준 자바 API에 대한 확장도 들어있음

  • 위의 두개는 의존관계를 통해 사용가능함

  • 애플리케이션 배포 시 런타임 라이브러리를 JAR 파일에 포함시켜야 함

  • 코틀린 표준 라이브러리 또한 의존관계임
    • 마찬가지로 JAR 파일에 포함시켜야 함

maven, gradle과 호환

  • 코틀린은 빌드 시스템과 호환됨

  • 애플리케이션을 패키징할 때 알아서 런타임 라이브러리와 표준 라이브러리의 의존관계를 포함시켜줌

  • 빌드 시스템을 사용한다면 이들을 명시적으로 추가할 필요 없음

0개의 댓글