
대부분의 Java 라이브러리는 Java로 작성되어 있습니다. 하지만 Kotlin 개발자는 val과 var, Null-Safety 등 Kotlin의 장점을 유지한 채 Java 라이브러리를 활용하고 싶어합니다. 그러나 기존 Java 클래스에 기능을 추가하려면 상속이나 헬퍼 클래스를 사용해야 하며, 이는 번거롭고 유지보수에 불리합니다. 이 한계를 넘어 원본 수정 없이 Kotlin 스타일로 기능을 확장하기 위해 등장한 것이 확장 함수입니다.
확장 함수는 기존 클래스의 소스를 수정하지 않고도, 마치 원래부터 그 클래스에 있던 메서드처럼 호출할 수 있게 해주는 함수입니다. 이를 통해 Kotlin과 Java의 상호 운용성을 높이고, 코드 가독성과 유지 보수성을 개선할 수 있습니다.
아래와 같이 String은 원래 trimmedLength() 메서드를 가지고 있지 않지만, 확장 함수를 통해 마치 원래부터 있었던 것처럼 호출할 수 있습니다.

수신 객체의 private 함수를 가져오면 캡슐화가 깨지지 않나요?
private, protected 멤버에는 접근할 수 없습니다. 이는 캡슐화를 깨뜨리지 않고, 오직 public 범위 내에서만 동작함을 의미합니다.멤버 함수와 확장 함수의 시그니처가 같을 경우 무엇이 호출되나요?
확장 함수를 오버라이드한 경우 무엇이 호출되나요?
중위 함수는 infix 라는 키워드를 활용하여 변수.함수이름(인자) 대신 변수 함수이름 인자 형태로 호출할 수 있게 해주는 함수입니다. 아래와 같이 활용할 수 있습니다.

인라인 함수는 함수가 호출되는 대신 함수를 호출한 지점에 함수 본문을 그대로 복사/붙어넣기 할 수 있게 해주는 함수입니다. 아래와 같이 자바 코드로 변환된 결과를 보면, 함수를 호출하지 않고 덧셈 로직 자체가 복사/붙어넣기가 수행된 것을 알 수 있습니다.

지역 함수는 함수 안에 선언되어 있는 함수를 말합니다. 아래와 같이 활용할 수 있습니다.
