코틀린은 다중 패러다임 언어이다.
정적 타입 지정 언어로써 런타임 도중이 아닌 커파일 시점에 오류를 잡아낼 수 있다.
객체 지향 언어와 함수형 언어의 조합으로 더 강력한 추상화를 적용할 수 있다.
비동기 코드를 작성할 수 있는 강력한 방법을 지원한다.
안드로이드 디바이스에서 동작하는 모바일 애플리케이션
서버 상의 코드 (특히 웹 애플리케이션의 백엔드)
아주 작은 디바이스 실행 환경부터 큰 데이터 센터에 이르는 다양한 실행 환경
자바에 비해 더 적은 코드로 더 편하게 목표를 달성할 수 있음
정적 타입 지정 언어의 핵심 장점 = 모든 식의 타입을 컴파일 시점에 알 수 있음
이외의 장점
함수를 일반 값처럼 다룰 수 있어, 함수를 변수에 저장하거나 인자로 전달할 수 있으며 함수에서 새로운 함수를 반환할 수 있음
일단 만들어지고 나면 내부 상태가 변하지 않는 불변 객체를 사용함
부수 효과가 없음
비슷한 기능을 담담하는 코드 조각에 대해서 공통 로직을 함수로 뽑아내고 서로 다른 세부 사항을 인자로 전달할 수 있음
람다식을 통해 이런 함수를 표현할 수 있음
부수 효과가 없기 때문에 stub, driver등의 테스트 도구없이 독립적인 테스트가 가능함
외부 세계와 상호작용 하지 않으므로 코드에 대해 쉽게 추론할 수 있음
함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받고나 함수가 새로운 함수를 반환할 수 있음
람다식을 통해 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있음
맴버 참조를 통해 어떤 객체의 함수를 값으로 사용할 수 있음
데이터 클래스를 통해 불변적인 데이터를 저장하는 클래스를 간결하게 만들 수 있음
코틀린 표준 라이브러리는 객체와 컬랙션을 함수형 스타일로 다룰 수 있는 API를 제공함
객체지향과 함수형 접근 방식을 적절히 조합해 해결하고자 하는 문제에 가장 적합한 도구를 사용할 수 있음
배태랑 개발자의 경험과 대략 10년간의 피듭백을 반영함
다른 언어가 채택한 검증된 해법과 기능을 사용함
특정 프로그래밍 스타일이나 패러다임을 가용하지 않음
getter/setter, 생성자 파라미터를 필드에 전달하기 위한 로직을 암시적으로 제공
강력한 타입 추론으로 타입을 직접 지정할 필요 없음
표준 라이브러리를 통해 반복되거나 길어질 수 있는 코드를 함수 호출로 대체할 수 있음
작성 시간, 코드를 이해하는 시간이 짧아 생산성이 높음
안전한 프로그래밍 언어?
JVM에서 실행한다는 사실 자체가 상당한 안전성을 보장함
정적 타입 언어로서 애플리케이션의 타입 안전성을 더 보장할 수 있음
읽기 전용 변수의 선언이 간단함
불변 변수를 data class로 묶을 수 있음
다중 스레드 애플리케이션에서 안전성이 높음
타입 검증을 통해 컴파일 시점에 더 많은 오류를 방지할 수 있음
(JVM을 타깃으로 하는 코틀린에 해당)
자바의 기존 라이브러리를 그대로 사용할 수 있음
자바 코드에서 코틀린 코드를 호출할 때 어떠한 작업도 필요없음
기존 자바 라이브러리의 함수 몇가지를 확장해 코틀린에서 더 쉽게 사용할 수 있음
다중 언어 프로젝트를 완전히 지원함
코틀린은 컴파일 언어로서 코드를 실행하기 위해선 반드시 컴파일해야 함
JVM 바이트 코드
안드로이드에서 실행되기 위한 JVM 바이트 코드
다른 OS에서 네이티브로 실행되기 위한 네이티브 타깃
브라우저에서 실해되기 위한 자바스크립트 또는 웹어셈블리
자바와 마찬가지로 소스 코드를 분석해 .class 파일을 생성함
만들어진 .class 파일은 애플리케이션 유형에 맞는 표준 패키징 과정을 거쳐 실행 가능
코틀린의 기본 클래스가 정의되어 있음
표준 자바 API에 대한 확장도 들어있음
위의 두개는 의존관계를 통해 사용가능함
애플리케이션 배포 시 런타임 라이브러리를 JAR 파일에 포함시켜야 함

코틀린은 빌드 시스템과 호환됨
애플리케이션을 패키징할 때 알아서 런타임 라이브러리와 표준 라이브러리의 의존관계를 포함시켜줌
빌드 시스템을 사용한다면 이들을 명시적으로 추가할 필요 없음