자바에는 표준 라이브러리와 밀접하게 연관된 언어 기능이 몇 가지 있다. 예를 들어 for … in 루프에 java.lang.Iterable을 구현한 객체를 사용할 수 있고, 자원을 사용하는 try문(try-with-resource statement)에 java.lang.AutoCloseable을 구현한 객체를 사용할 수 있다.

이와 비슷하게 코틀린에서도 어떤 언어 기능이 정해진 사용자 작성 함수와 연결되는 경우가 몇 가지 있다. 하지만 코틀린에서는 이런 언어 기능이 어떤 타입(클래스)과 연관되기보다는 특정 함수 이름과 연관된다. 예를 들어 어떤 클래스 안에 plus라는 이름의 특별한 메소드를 정의하면 그 클래스의 인스턴스에 대해 + 연산자를 사용할 수 있다. 이런 식으로 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 관례(convention)라고 부른다.

언어 기능을 타입에 의존하는 자바와 달리 코틀린은 함수 이름을 통한 관례에 의존한다. 코틀린에서 이런 관례를 채택한 이유는 기존 자바 클래스를 코틀린 언어에 적용하기 위함이다. 기존 자바 클래스가 구현하는 인터페이스는 이미 고정돼 있고 코틀린 쪽에서 자바 클래스가 새로운 인터페이스를 구현하게 만들 수는 없다. 반면 확장 함수를 사용하면 기존 클래스에 새로운 메소드를 추가할 수 있다. 따라서 기존 자바 클래스에 대해 확장 함수를 구현하면서 관례에 따라 이름을 붙이면 기존 자바 코드를 바꾸지 않아도 새로운 기능을 쉽게 부여할 수 있다.

앞으로의 설명에서 아래 Point 클래스를 활용한다.

data class Point(val x:Int, val y: Int)

7.1 산술 연산자 오버로딩

7.2 비교 연산자 오버로딩

7.3 컬렉션과 범위에 대해 쓸 수 있는 관례

7.4 구조 분해 선언과 component 함수

7.5 프로퍼티 접근자 로직 재활용 : 위임 프로퍼티