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

  • 코틀린이란? 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어
    • 간결하고 실용적이며, 자바 코드와의 상호운용성을 중시

코틀린 주요 특성

대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳

  • 코틀린의 주목적은 현재 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것이다.
  • 코틀린은 주로 서버, 안드로이드 개발에 쓰인다.

정적 타입 지정 언어

  • 자바와 마찬가지로 정적 타입 지정 언어이다.
  • 자바와 달리 코틀린에서는 모든 변수의 타입을 프로그래머가 직접 명시할 필요는 없다.
    • 컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 타입 추론이라고 한다.
  • 코틀린은 타입 추론을 지원하므로 정적 타입 언어에서 프로그래머가 직접 타입을 선언해야 함에 따라 생기는 불편함이 대부분 사라진다.

정적 타입 지정의 장점

  • 성능 : 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠르다.
  • 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 떄문에 실행 시 프로그램 오류로 중단될 가능성이 적다.
  • 유지 보수성
  • 도구 지원 : 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.

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

  • 일급 시민인 함수 : 함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 변화할 수 있다.
  • 불변성 : 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.
  • 부수 효과 없음 : 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

함수형 프로그래밍의 장점

  • 간결성
  • 다중 스레드를 사용해도 안전하다. 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 따라서 복잡한 동기화를 적용하지 않아도 된다.
  • 테스트하기 쉽다.

코틀린은 함수형 프로그래밍을 풍부하게 지원한다.

  • 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다.
  • 람다 식을 지원함에 따라 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다.
  • 데이터 클래스는 불변적인 값 객체를 간편하게 만들 수 있는 구문을 제공한다.
  • 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

무료 오픈소스

  • 무료로 사용가능하다.

코틀린 응용

코틀린 서버 프로그래밍

  • 자바 클래스를 코틀린으로 확장해도 아무 문제가 없으며, 코틀린 클래스 안의 메소드나 필드에 특정 자바 애노테이션을 붙여야 하는 경우에도 아무 문제가 없다.
  • 코틀린 타입 시스템은 널값을 정확히 추적하며 널 포인트로 인해 생기는 문제를 줄여준다.
  • 코틀린을 사용하더라도 성능 측면세어 아무 손해가 없다. 코틀린 컴파일러가 생성한 바이트코드는 일반적인 자바 코드와 똑같이 효율적으로 실행된다.
  • 코틀린 표준 라이브러리 함수는 인자로 받은 람다 함수를 인라이닝(inlining)한다. 따라서 람다를 사용해도 새로운 객체가 만들어지지 않으므로 객체 증가로 인해 가비지 컬렉션이 늘어가서 프로그램이 자주 멈추는 일도 없다.

코틀린의 철학

실용성

  • 코틀린은 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다. 이로 인해 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 코틀린을 더 쉽게 배울 수 있다.
  • 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않는다.
  • IDE에 지원을 받을 수 있다.

간결성

  • 게터, 세터, 생성자 파라미터를 필드에 대입하기 위한 로직 등 자바에 존재하는 여러 가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공하기 때문에 코틀린 소스코드는 그런 준비 코드로 인해 지저분해지는 일이 없다.

안전성

  • JVM에서 실행되는 정적 타입 언어로서 코틀린은 애플리케이션의 타입 안전성을 보장한다.
    • 타입 추론 기능 덕분에 자바보다 더 적은 비용으로 타입 안전성을 사용할 수 있다.
  • NullpointerException을 없애기 위해 노력한다.
    • 어떤 타입이 널이 될 수 있는지 여부를 표시하기 윈해 오직 ? 한 글자만 추가하면 된다.
  • ClassCastException을 방지해준다.
    • 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다. 어떤 객체의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드 등의 멤버를 별도의 캐스트 없이 사용할 수 있다.
if (value is String) {
  println(value.toUpperCase())
}

상호운용성

  • 자바 클래스를 상속하거나 인터페이스를 구현하거나 자바 애노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능하다.
  • 자바 코드에서 코틀린 코드를 호출할 때도 아무런 노력이 필요없다.
  • 자바와 코틀린 코드를 프로젝트에서 원하는대로 섞어 쓸 수 있다.
  • 기존 자바 라이브러리를 최대한 활용한다.
    • 코틀린은 자체 컬럭센 라이브러리를 제공하지 않는다. 자바 표준 라이브러리 클래스에 의존한다.
    • 코틀린에서 컬렉션을 더 쉽게 활용할 수 있게 몇 가지 기능을 더한다.
  • 코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일할 수 있다.

코틀린 도구 사용

코틀린 코드 컴파일

  • .kt 라는 확장자를 파일에 붙인다.
  • 코틀린 컴파일러는 소스코드를 분석해서 .class 파일을 만들어낸다.
kotlinc <소스파일 또는 디렉터리> -include-runtime -d <jar 이름>
java -jar <jar 이름>
  • 코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존한다.
    • 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있다.
    • 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.
    • 메이븐과 그레들은 애플리케이션을 패키지할 때 알아서 코틀린 런타임을 포함시켜준다.

자바 코틀린 변환기

  • 자바 코드를 변환하고 싶을 떄는 자바 코드 조각을 복사해서 코틀린 파일에 붙여 넣는다.
  • 자바 파일 하나를 통쨰로 코틀린으로 변환하고 싶으면 “코드 > 자바 파일을 코틀린 파일로 변환”을 선택하면 된다.