오늘부터 빡세게 코틀린에 대해서 공부해보려 한다. Kotlin in Action이라는 책을 베이스로 공부를 진행하고 여기에다 필기해 복습이 필요할 때 마다 보려한다.
- Java 플랫폼에서 돌아가는 프로그래밍 언어
- 간결하고 실용적이며, Java 코드와의 상호운용성(interperability)을 중시
- 자바가 사용중인 곳이라면 거의 대부분 코틀린 사용가능
- 서버, 안드로이드 앱 등의 분야에서 주로 사용
data class Person(val name: String, // 데이터 클래스(property가 name과 age)
val age: Int?= null) // 디폴트값이 null + null이 될 수 있는 타입(Int?)
fun main(args: Array<String>) {
val persons = listOf(Person("영희"),
Person("철수", age = 29))
val oldest = persons.maxBy{it.age ?:0} // 람다식 + 엘비스 연산자
println("나이가 가장 많은 사람: $oldest") // 문자열 템플릿
}
// 출력 : 나이가 가장 많은 사람: Person(name=철수, age=29) (toString)은 자동 생성
주로 백엔드 서버, 안드로이드 등 자바가 실행되는 모든 곳
자바뿐만 아니라 자바스크립트로도 코틀린을 컴파일할 수 있다.
멀티 OS 엔진으로도 iOS에서도 실행이 가능하다.
자바와 마찬가지로 코틀린도 정적 타입(statically typed)지정 언어이다.
즉, 모든 프로그램 구송요소의 타입을 컴파일 시점에 알 수 있고 필드나 메서드를 사용할 때 마다 컴파일러가 타입을 검증해준다.
단, 자바와 달리 타입 선언을 생략해도 변수 타입을 코틀린 컴파일러가 문맥에서 추론할 수 있다.
Nullable type
지원 : 널이 될 수 있는 타입을 지원해 컴파일 시점에 NPE를 검증할 수 있다.cf. 동적 타입 지정 언어
타입과 관계 없이 모든 값을 변수에 넣을 수 있고, 메서드나 필드 접근에 대한 검증이 실행시점에 일어난다. (짧은 코드와 유연성이 장점이지만 실행 시점에 오류)
코틀린은 기본적으로는 자바처럼 객체지향 언어이지만 함수형 프로그래밍 스타일을 모두 지원한다.
first-class 함수
함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장하거나 인자로 다른 함수에 전달하거나, 함수에서 새로운 함수를 만들어 반환할 수 있다.
불변성(immutability)
일단 만들어지고나면 내부 상태가 절대로 바뀌지않는 불변 객체
를 사용한다.
side effect 없음
입력이 같으면 출력이 같고 다른 객체의 상태를 변경하지 않고, 함수 외부와 상호작용하지 않는 순수함수
를 사용한다.
코틀린에서는 함수형 스타일로 프로그램을 짤 수 있게 지원한다.
하지만 함수형 스타일을 강제하지 않는다.
함수 타입, 람다식을 지원하고 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.
코틀린의 언어, 컴파일러, 라이브러리, 도구는 모두 오픈소스로 무료로 사용할 수 있다.
개발은 Kotlin 깃허브에서 이뤄진다.
기존에 자바로 짜여진 기술과 프레임워크들을 그대로 활용하면서 자바 클래스들을 코틀린으로 확장해도 아무 문제가 없다. 오히려 코드는 더 간결해지고 더 신뢰성 있게 유지보수를 할 수 있다.
모바일 애플리케이션은 엔터프라이즈 애플리케이션보다 더 작고 기존 코드기반과 새 코드를 통합할 필요도 적다. 그리고 더 다양한 디바이스에 대해 신뢰성을 보장하면서 더 빠르게 개발해 배포해야한다.
코틀린의 특성과 안드로이드 프레임워크의 컴파일러 플러그인 지원을 조합해 안드로이드 앱 개발의 생산성을 더 높일 수 있다.
그리고 NPE문제를 컴파일러가 미리 잡기 때문에 앱 신뢰성이 더욱 높아진다.
실용성
코틀린은 연구를 위한 언어가 아니라 실제 문제를 해결하기 위해 만들어진 실용적인 언어이다.
특정 프로그래밍 스타일이나 패러다임을 강제하지 않는다.
IDE 지원(특히 인텔리제이)이 매끄럽다.
간결성
코드에서 의미가 없는 부분을 줄이고, 구조를 만족하기 위한 부수적인 요소를 줄였다.
그리고 반복되거나 길어질 수 있는 코드는 라이브러리 함수 호출로 대치할 수 있다.
더 간결해진 코드 덕분에 가독성이 좋아지고 유지보수하기 편해지며 생산성이 향상된다.
안전성
JVM 위에서 실행되기 때문에 메모리 안전성과 버퍼 오버플로우가 기본적으로 방지된다.
정적 타입 지정 언어라서 타입 안전성을 보장한다.
실행시점에 NPE를 발생할 수 있는 코드를 금지해 Null 안전성을 제공한다.
(null이 될 수 있으면 간단하게 ?만 추가하면 된다)
상호운용성(interperability)
기존의 자바 라이브러리가 어떤 api를 제공하던 그대로 사용할 수 있다.
코틀린 안에서 자바 클래스를 상속하거나 구현하는 것도 가능하다.
반대로 자바 코드에서 코틀린을 호출하는 것도 어떤 노력없이 바로 가능하다.
자바와 코틀린 소스 파일이 섞여있어도 제대로 프로그램을 컴파일할 수 있다.