함수(Function) 문법
Java에서 함수 즉 Method 선언은 [접근 제어자] [리턴 타입] [메서드 명]([파라미터]) {[로직]};의 형태로 구현된다.
[접근 제어자] [리턴 타입] [메서드 명]([파라미터]) {
[로직]
};
public class Function {
public static int addFunction(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(addFunction(1 , 2));
}
}
이에 반해서 Kotlin은 fun [함수 이름] ([파라미터 이름] : [타입명]) : [리턴 타입] {[로직]} 간단하게 선언하고 사용할 수 있다.
class FunctionEx1 {
fun printMessage(message: String): Unit {
println(message)
}
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
println("[$prefix] $message")
}
fun sum(x: Int, y: Int): Int {
return x + y
}
fun multiply(x: Int, y: Int) = x * y
}
fun main() {
val func = FunctionEx1()
func.printMessage("Hello")
func.printMessageWithPrefix("Hello", "Log")
func.printMessageWithPrefix("Hello")
func.printMessageWithPrefix(prefix = "Log", message = "Hello")
println(func.sum(1, 2))
println(func.multiply(2, 4))
}
가장 기본 형태의 함수
fun printMessage(message: String): Unit {
println(message)
}
이때, Unit는 Java에서 Void Type과 같다.
Default 값이 존재하는 함수
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
println("[$prefix] $message")
}
함수를 호출할 때, 파라미터에 prefix를 넣지 않으면 "Info"가 자동으로 default값으로 설정되어 출력된다.
리턴값이 존재하고 타입이 존재하는 함수
fun sum(x: Int, y: Int): Int {
return x + y
}
fun multiply(x: Int, y: Int) = x * y
함수에서 리턴하는 값이 존재하는 경우, 함수 뒤에 리턴 타입을 명시해야 한다.
그리고 로직 내용이 매우 짧다면 중가로를 사용해서 하지 않고 바로 '='를 사용해서 정의해도 동작한다.
중위 함수 (Infix Functions)
Kotlin의 Infix Function은 두 객체 사이에서 함수가 작동할 수 있게 해주는 함수 형태를 의미힌다. 즉 이미 선언된 두개의 객체 사이에서 추가적인 함수를 집어넣을 수 있다.
infix fun Int.times(str: String) = str.repeat(this)
println(2 times "Bye ")
위 코드는 Int의 time이라는 함수를 정의하고 Int와 String간의 중위 함수를 정의한 것이다.
즉, String의 값을 2번 호출하는 것으로 Int.time으로 정의했다.
val pair = "Ferrari" to "Katrina"
println(pair)
Kotlin Library에서 정의된 중위함수 Pair를 호출한 코드이다.
infix fun String.onto(other: String) = Pair(this, other)
val myPair = "McLaren" onto "Lucas"
println(myPair)
String의 onto 중위 함수를 정의하여 호출한 코드이다.
val sophia = Person("Sophia")
val claudia = Person("Claudia")
sophia likes claudia
sophia.likedPeople.forEach { person -> println(person.name)}
class Person(val name: String) {
val likedPeople = mutableListOf<Person>()
infix fun likes(other: Person) { likedPeople.add(other) }
}
실제 클래스를 정의한 후, 내부에서 중위 함수를 정의하여 호출한 코드이다.
연산자 오버로딩 함수(Operator Overloading Functions)
연산자 오버로딩이란?
연산자 오버로딩은 연산자를 재 정의해서 재사용하는 것을 말한다.
JAVA에서는 연산자 오버로딩은 지원하지 않고, 메서드 오버로딩은 지원했다.
이때, 오버로딩에서 구분하는 방법은 메서드 시그니처(메서드 파라미터)를 이용해서 구분했다.
연산자에서는 피연산자들이 시그니처가 되어 구별해주는 것이다.
operator fun Int.times(str: String) = str.repeat(this)
fun main() {
println(2 * "Bye ") // times가 의미하는 연산자는 *이다.
}
Int의 time(곱하기 연산자)를 오버로딩해서 호출한 코드이다.
operator fun String.get(range: IntRange) = substring(range) // 3
val str = "Always forgive your enemies; nothing annoys them so much."
fun main() {
println(str[0..14]) // get이 의미하는 연산자는 List이다.
}
String의 get(배열 연산자)를 오버로딩해서 호출한 코드이다.
가변인자 함수(Functions with vararg Parameters)
가변인자란?
파라미터의 개수가 변하는 것을 가변인자라 한다.
즉, 함수에서 파라미터의 개수가 변한다면 갯수마다 매서드를 다시 정의해야 하지만 가변인자를 지원하는 언어라면 가변인자를 사용해서 하나의 메서드만 정의하면 된다.
Kotlin에서는 가변인자 타입을 vararg이라고 한다.
fun printAll(vararg messages: String) {
for (m in messages) println(m)
}
fun main() {
printAll("Hello", "Hallo", "Salut", "Hola", "你好", "안녕하세요")
}
가변인자를 통해서 String 객체를 여러개를 받는 함수를 정의하고 호출한 코드이다.
fun printAllWithPrefix(vararg messages: String, prefix: String) {
for (m in messages) println(prefix + m)
}
fun main() {
printAllWithPrefix(
"Hello", "Hallo", "Salut", "Hola", "你好", "안녕하세요",
prefix = "Greeting: "
)
}
위에서 나왔던 Prefix를 활용한 가변인자 함수 정의하고 호출한 코드이다.
fun log(vararg entries: String) {
printAll(*entries)
}
fun main() {
log("Hello", "Hallo", "Salut", "Hola", "你好", "안녕하세요")
}
vararg을 통해서 가변인자를 받아왔더라도 그대로 다시 가변인자로 다른 함수에게 보내줄 수 있다.
이때, 배열 앞에 '*'을 표시하는데, 이 '*'을 spread operator라고 한다.
spread operator란?
배열을 단순하게 전개하는 연산자를 말한다.
따라서 배열을 단순히 for문 돌면서 나열해주는 연산자이다.
참고 자료
https://play.kotlinlang.org/byExample/01_introduction/02_Functions
Kotlin Playground: Edit, Run, Share Kotlin Code Online
play.kotlinlang.org
https://velog.io/@haero_kim/Kotlin-Infix-Function-%EC%9D%B4-%EB%AD%90%EA%B2%8C
[Kotlin] Infix Function 이 뭐게?
Infix Function 의 내부 구현을 알아보고 직접 만들어보자
velog.io
[Kotlin] 연산자 오버로딩 (Operator overloading)
#1 메소드 오버로딩 (Method overloading)class Calculator { // 정수형 두 개를 더하는 메소드 fun add(x: Int, y: Int): Int { return x + y } // 실수형 두 개를 더하는 메소드 fun ad
kenel.tistory.com
혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!