코틀린
코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어이다.
코틀린의 주 목적은 자바가사용되고 있는 모든 용도에 적합하면서도 간결하고, 생산적이며 안전한 대체 언어를 제공하는 것이다.
코틀린의 장점
1. 간결하고 실용
2. 자바 코드와의 상호운용
3. 대부분의 자바 프로젝트에서 코틀린을 활용할 수 있다(안드로이드, 서버 개발 등), 인텔의 멀티 OS 엔진을 사용하여 iOS 에서도 실행 가능, 데스크탑 애플리케이션(코틀린, 토네이도FX), 자바FX에서도 사용 가능, 자바스크립트로도 코틀린 코드를 이용하여 브라우저나 노드에서 실행이 가능하다.
4. 성능은 자바와 비슷하다.
5. 안정성(null 체크, 타입 검사와 캐스트)
코틀린의 예제 코드
코틀린의 특징을 보여줄 수 있는 코드가 있는데 아래와 같다.
1 2 3 4 5 6 7 8 |
data class Person(var name: String, var age: Int? = null)
fun main(args: Array<String>) { var persons = listOf(Person("영희"), Person("철수", 30))
var oldest = persons.maxBy { it.age ?: 0} println("Old Person : $oldest"); }
|
|
Person이라는 클래스를 정의하고, Person 컬렉션을 만들어서 저장한 후 나이가 가장 많은 사람을 출력한다.
코드는 매우 짧지만 코틀린 언어의 특성을 볼 수 있다.
Person 클래스의 프로퍼티로 name과 age가 있는데 age는 입력받지 못하면 null로 초기화가 된다.
가장 많은 사람을 찾기 위해 maxBy 함수를 사용했다, 전달한 것은 람다 식을 파라미터로 받았고, it 이라는 이름을 사용하면 람다 식의 유일한 인자를 사용할 수 있다. 엘비스 연산자라고 부르는 ?:는 age가 null인 경우 0을 반환하고, 그렇지 않은 경우 age의 값을 반환한다.
코틀린의 주요 속성
코틀린의 목표는 한 문제 영역만을 해결하거나 오늘날 소프투웨어 개발이 처한 어려움 중 일부만을 다루기 위한 언어가 아니다. 대신 코틀린은 개발 과정에서 수행해야 하는 모든 과업에 있어 폭넓은 생산성을 향상시켜준다. 코틀린은 구체적인 영역의 문제를 해결하거나 특정 프로그래밍 패러다임을 지원하는 여러 라이브러리와 아주 잘 융합된다.
정적 타입 지정 언어
자바와 마찬가지로 코틀린은 정적 타입 지정 언어이다. 모든 프로그램의 구성 요소의 타입을 컴파일 시점에 알 수 있고, 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 뜻이다. 그에 따라 코드가 더 짧아지고, 유연하다.
var x = 1
여기서는 변수를 정의하면서 정수 값으로 초기화하는데 코틀린은 변수의 타입을 int로 자동으로 알아낸다. 컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 타입 추론이라고 한다.
정적 타입 지정의 장점은 아래와 같다.
1. 성능 : 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다.
2. 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 적다.
3. 유지 보수성 : 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때 더 쉽다.
4. 도구 지원 : 정적 타입을 활용하면 안전한 리팩토링이 가능하고, 도구는 정확한 코드 완성 기능을 제공하며 IDE의 다른 지원 기능도 더 잘 만들 수 있다.
코틀린의 타입 시스템에는 자바에서 쉽게 수 있는 class, interface, generic를 볼 수 있는데 코틀린에서도 비슷하게 동작한다.
몇 가지 새로운 점은 null이 될 수 있는 타입을 지원한다는 점이다. 널이 될 수 있는 타입을 징눤함에 따라 컴파일 시점에 널 포인트 예외가 발생할 수 있는지 여부를 검사할 수 있어서 좀 더 프로그램의 신뢰성을 높인다.
타입 시스템의 다른 내용으로는 함수 타입에 대한 지원을 들 수 있다. 함수 타입이 무엇인가 알아보기 위해 함수형 프로그램의 개념을 알아야 한다.
함수형 프로그래밍의 핵심 개념은 아래와 같다.
1. 일급 시민인 함수 : 함수를 일반 값처럼 다를 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어 반환한다.
2. 불면성 : 함수형 프로그래밍에서 만들어 지면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.
3. 부수 효과 없음 : 함수형에서 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용 하지 않는 순수 함수를 사용한다.
위와 같은 함수형 프로그래밍을 작성하면 간결해지고, 함수를 값처럼 사용하면 더 강력한 추상화를 사용할 수 있으며 코드 중복을 막을 수 있다.
1 2 |
fun findktko() = findPerson { it.name == "ktko" } //findPerson에는 사람을 찾는 일반 로직이 들어가 있다. fun findTheo() = findPerson { it.name == "Theo" } //중괄호 {} 안에 블록은 찾으려는 사람을 식별한다. |
|
위의 함수는 사람을 찾는 findPerson이 있지만 약간의 차이가 있다. 찾으려는 사람이다르다. 공통 부분을 따로 함수로 뽑아내고, 세부 사항을 인자로 전달하는데 세부 사항은 함수가 된다. 람다라고 불르는 함수 구문을 사용하면 간결하게 사용할 수 있다.
함수형 프로그래밍의 또 다른 유익은 다중 스레드를 사용해도 안전하다. 다중 스레드 프로그램에서는 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우 가장 많은 문제가 생긴다. 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 함수형 프로그램의 마지막 장점은 테스트 하기가 쉽다.
코틀린과 함수형 프로그래밍
코틀린은 함수형 프로그래밍을 풍부하게 지원한다. 그렇다고 코틀린이 함수형 프로그래밍을 강제하지는 않는다. 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코딩할 필요는 없다.
코틀린 코드 컴파일
코틀린 소스코드를 저장할 때는 보통 .kt라는 확장자를 파일에 붙인다. 코틀린 컴파일러는 소스를 .class 파일로 만들어 낸다.컴파일한 코드는 코틀린 런타임 라이브러리에 의존한다. 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있다. 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.