Infix 함수는 두개의 변수 가운데 오는 함수를 말합니다.
코틀린에서 기본적으로 정의된 Infix 함수들 중에 Pair를 만드는 to
가 있습니다.
아래 코드를 보시면, white
와 0xffffff
객체 중간에 to
가 Infix 함수입니다.
to
는 양 옆의 객체들로 Pair 객체를 만들어줍니다.
val pair : Pair<String, String> = "White" to "0xffffff"
아래 코드는 코틀린에서 Map을 만들 때 자주 사용하는 패턴입니다. 하나는 Pair를 이용하였고, 하나는 Infix 함수를 이용하였습니다.
val map1 = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
val map2 = mapOf("key1" to "value1", "key2" to "value2")
Infix 함수인 to
를 사용한 코드를 보면 key가 value에 매핑된다는 것을 명확히 알 수 있습니다.
또한 코드라기보다 언어에 가깝게 느껴집니다. 그리고 코드 양도 적어지기 때문에 Pair를 사용한 것보다 간결합니다.
Infix 함수 정의
Infix 함수는 직접 정의할 수도 있습니다.
infix fun dispatcher.함수이름(receiver): 리턴타입 { 구현부 }
과 같은 형식으로 정의할 수 있습니다. 여기서 dispatcher는 Infix 함수 전에 오는 객체를 말하며, receiver는 Infix 함수 뒤에 오는 객체를 말합니다.
아래와 같이 add
라는 infix함수를 정의하였습니다.
infix fun String.add(other:String): String {
return this + other
}
위의 코드 "Hello" add "World"
에서 문자열 "Hello"는 dispatcher이고, 문자열 "World"는 receiver입니다.
구현부에서 사용한 this
는 dispatcher 객체를 의미합니다.
아래 코드를 실행시키면 두개의 객체(dispatcher, receiver)가 합쳐져 HelloWorld
가 출력됩니다.
val string = "Hello" add "World"
System.out.println(string)
// 결과
// HelloWorld
클래스 내에 Infix 함수 정의
아래 코드는 클래스 내에 Infix 함수를 정의한 예제입니다. 클래스 내에 정의하면 dispatcher가 클래스 자신이기 때문에 생략할 수 있습니다.
class MyString {
var string = ""
infix fun add(other: String) {
this.string = this.string + other
}
}
위의 클래스는 아래처럼 쓸 수 있습니다. add할 때마다 클래스 내부에 문자열이 더해집니다.
val myString = MyString()
myString add "Hello"
myString add "World"
myString add "Kotlin"
System.out.println(myString.string)
// 결과
// HelloWorldKotlin
만약 Infix 함수를 사용하지 않으면?
Infix 함수를 사용하지 않고 위의 클래스를 구현하면 아래처럼 될 것입니다. 매번 문자열을 더할 때마다 myString.add()를 사용하여 함수를 호출해야 합니다.
class MyString {
var string = ""
fun add(other: String) {
this.string = this.string + other
}
}
fun main() {
val myString = MyString()
myString.add("Hello")
myString.add("World")
myString.add("Kotlin")
System.out.println(myString.string)
}
정리
Infix 함수에 대해서 알아보았습니다. 적절한 Infix 함수의 사용은 코드를 간결하게 만들고 가독성을 높혀준다는 장점이 있습니다.
참고
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크