개발자의 최종 목표는 코드의 가독성과 유지 보수성을 가장 좋게 유지하는 것이다. 이 목표를 달성하기 위해선 개별 클래스에 집중하는 것만으로는 충분치 않다. 클래스에 있는 코드 중 대부분은 다른 클래스와 상호작용한다. 그런 상호작용이 일어나는 연결 지점을 살펴봐야 한다.( =클래스의 API를 살펴봐야 한다.)
애노테이션을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있고, 리플렉션을 사용하면 실행 시점에 컴파일러 내부 구조를 분석할 수 있다. 코틀린에서 애노테이션을 사용하는 문법은 자바와 똑같지만 애노테이션을 선언할 때 사용하는 문법은 자바와 약간 다르다. 리플렉션 API의 일반 구조는 자바와 같지만 세부 사항에서 약간 차이가 있다.
val readers: MutableList<String> = mutableListOf()val readers = mutableListOf<String>()
위의 선언은 동등하다.
고차 함수는 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수다. 물론 함수를 인자로 받는 동시에 함수를 반환하는 함수도 고차 함수다. 예를 들어 표준 라이브러리 함수인 filter는 술어 함수(predicate: true/ false를 판단할 수 있는 식이나 boolean 값을 리턴하는 함수)를 인자로 받으므로 고차 함수다.
어떤 클래스 안에 plus 라는 이름의 특별한 메소드를 정의하면 그 클래스의 인스턴스에 대해 + 연산자를 사용할 수 있다. 이런 식으로 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 코틀린에서는 관례(Convention)라고 부른다.
언어 기능을 타입에 의존하는 자바와 달리 코틀린은 (함수 이름을 통한) 관례에 의존한다. 이런 관례를 채택한 이유는 기존 자바 클래스를 코틀린 언어에 적용하기 위함이다.
foo?.let{...}if(foo != null) // it은 람다 안에서 널이 아니다.if(foo == null) // 아무 일도 일어나지 않는다.
널이 될 수 있는 값에 대해 안전한 호출 구문을 사용해 let을 호출하되 널이 될 수 없는 타입을 인자로 받는 람다를 let에 전달한다.
함수형 프로그래밍 : 함수를 값처럼 다루는 접근 방법을 택함으로써 일련의 동작을 변수에 저장하거나 다른 함수에 넘긴다. 클래스를 선언하고 그 클래스의 인스턴스를 함수에 넘기는 대신 함수형 언어에서는 함수를 직접 다른 함수에 전달할 수 있다.
컬렉션 처리에 관한 코틀린 언어 특성
vararg
fun printMessage(message…