밤빵's 개발일지
[TIL]20241008 코틀린의 함수 선언 & 사용법 본문
▶코틀린의 함수 선언 방식
코틀린에서 함수를 선언할 때는 fun 키워드를 사용한다. 자바의 메서드와 달리, 코틀린에서는 반환 타입을 함수 선언의 끝에 명시하, 함수 본문은 함수 선언부와 바로 이어서 쓸 수 있다.
fun greet(name: String): String {
return "Hello, $name!"
}
→ 코틀린에서 greet라는 이름의 함수를 선언하는 코드. 이 함수는 name이라는 String 타입의 인자를 받아서 문자열을 반환한다. 반환 타입은 함수 선언부의 마지막에 : 뒤에 명시되, 함수 본문은 중괄호 안에 작성된다. 자바에서는 반환 타입을 함수 선언의 앞에 명시하지만, 코틀린에서는 함수의 끝에 명시하는 것이 차이점이다.
val greeting = greet("Kotlin")
println(greeting) // 출력: Hello, Kotlin!
→ 함수 호출은 자바와 비슷하게, 함수 이름과 인자를 사용하여 호출할 수 있다.
▷여기서 Hello는 greet함수 내부에서 이미 "Hello"라는 문자열을 반환하도록 설정되어 있다.
fun greet(name: String): String {
return "Hello, $name!" // 여기서 "Hello" 부분이 이미 포함됨
}
val greeting = greet("Kotlin")
println(greeting) // 출력: Hello, Kotlin!
→ greet 함수는 인자로 전달된 name(즉, "Kotlin")을 받아 "Hello, Kotlin!"이라는 문자열을 반환한다. 그래서 val greeting = greet("Kotlin")에서 greet("Kotlin")을 호출하면 "Hello, Kotlin!"이 반환되고, println(greeting)으로 해당 문자열을 출력하게 된다. "Hello, "는 greet 함수 안에서 하드코딩된 값이므로 별도의 추가 작업 없이 함수 호출만으로 "Hello, Kotlin!"이 출력된다.
▶자바와의 차이점
▷자바에서의 메서드 선언
자바에서는 메서드를 선언할 때 반환 타입을 함수 선언부의 가장 앞에 명시하고, 그 다음에 메서드 이름과 매개변수를 작성한다. 자바에서는 기본적으로 메서드가 클래스 내부에 정의되며, 클래스의 인스턴스를 생성해야 호출할 수 있는 경우가 많다. 하지만 코틀린에서는 함수가 클래스 외부에도 정의될 수 있다.
public String greet(String name) {
return "Hello, " + name + "!";
}
→ 자바에서는 메서드 선언 시 접근 제어자(public), 반환 타입(String), 그리고 메서드 이름과 매개변수 순으로 작성된다. 자바의 경우 기본적으로 중괄호로 메서드 본문을 감싸며, 메서드가 값을 반환할 때는 return 키워드를 사용한다. 이 점은 코틀린과 유사하지만, 코틀린에서는 접근 제어자를 명시하지 않으면 기본적으로 public이 된다.
▷자바 메서드 호출 예시
String greeting = greet("Java");
System.out.println(greeting); // 출력: Hello, Java!
→ 자바에서 메서드를 호출할 때는 메서드 이름과 인자를 이용해 호출한다. 메서드를 호출하기 위해 클래스의 인스턴스를 생성해야 할 경우도 있다.
▷차이점 요약
구분 | 코틀린 함수 선언 | 자바 메서드 선언 |
키워드 | fun | 반환 타입을 먼저 명시 (public String) |
반환 타입 | 함수 선언의 끝에 : 뒤에 명시 | 함수 선언의 앞에 명시 |
접근 제어자 | 기본 public, 명시하지 않아도 됨 | 명시적으로 public, private 등의 제어자 필요 |
함수 위치 | 클래스 외부에도 정의 가능 | 반드시 클래스 내부에 정의 |
간결성 | 반환 타입 추론 가능, 더 간결한 코드 작성 가능 | 반환 타입과 접근 제어자 명시로 코드가 다소 길어짐 |
▶코틀린의 반환 타입 추론
코틀린에서는 반환 타입을 명시하지 않고도, 함수의 반환 값을 코틀린 컴파일러가 자동으로 추론할 수 있다. 불필요한 코드를 줄이고 간결하게 작성할 수 있다.
fun greet(name: String) = "Hello, $name!"
→ '='을 사용하여 반환값을 지정하고, 반환 타입을 생략. 코틀린 컴파일러는 이 함수가 String을 반환한다는 것을 자동으로 추론한다. 이렇게 작성하면 코드가 훨씬 간결해진다.
▶기본 인자값 사용
코틀린에서는 함수의 매개변수에 기본값을 지정할 수 있다. 자바에서는 불가능한 기능으로, 코틀린의 함수 선언에서 유용한 기능이다. 기본값을 통해 호출할 때 모든 인자를 전달하지 않아도 되고, 필요한 인자만 전달할 수 있다.
fun greet(name: String = "World"): String {
return "Hello, $name!"
}
println(greet()) // 출력: Hello, World!
println(greet("Kotlin")) // 출력: Hello, Kotlin!
→ name 인자에 기본값으로 "World"를 설정. 이 함수는 greet()처럼 아무 인자도 전달하지 않으면 기본값 "World"를 사용하고, 인자를 전달하면 해당 인자로 동작하게 된다.
▶고차 함수와 람다 표현식
코틀린의 함수는 일급 객체(First-class Citizen)이므로, 함수 자체를 변수에 저장하거나 다른 함수의 인자로 전달할 수 있다. 이러한 특징을 활용해 고차 함수를 만들 수 있고, 코틀린에서는 자바보다 람다 표현식을 더 간결하게 사용할 수 있다.
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val sum = operate(3, 4) { x, y -> x + y }
println(sum) // 출력: 7
→ operate 함수는 두 개의 정수와, 두 정수를 입력받아 결과를 반환하는 함수를 인자로 받는다. 코틀린에서는 고차 함수와 람다를 이용하여 더 유연하고 간결한 코드를 작성할 수 있다.
▶함수 확장 기능
코틀린에서는 클래스 외부에서 해당 클래스의 기능을 확장할 수 있는 확장 함수(Extension Function)를 제공한다. 기존의 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있는 매우 유용한 기능이다.
fun String.greet(): String {
return "Hello, $this!"
}
val greeting = "Kotlin".greet()
println(greeting) // 출력: Hello, Kotlin!
→ String 클래스에 greet() 함수를 확장하여 새로운 기능을 추가한 예시로 String 클래스를 직접 수정하지 않고도 greet() 메서드를 사용할 수 있게 된다.
코틀린은 자바에 비해 함수 선언이 간결하고 직관적이며, 반환 타입 추론, 기본 인자값, 고차 함수 등 다양한 유용한 기능을 제공한다. 특히 함수 선언 방식의 차이로 인해 코드의 가독성이 크게 향상되며, 개발 효율성을 높일 수 있다는 점이 코틀린의 장점이다.
'Kotlin' 카테고리의 다른 글
[TIL]20241010 데이터 클래스(Data Class) (0) | 2024.10.10 |
---|---|
[TIL]20241009 Extension Functions (0) | 2024.10.09 |
[TIL]20241007 Safe Call(?.), Elvis 연산자(?:), Not-null Assertion(!!) 활용 (0) | 2024.10.07 |
[TIL]20241006 Nullable과 Non-Nullable 타입: 코틀린의 null 안전성 (0) | 2024.10.06 |
[TIL]20241005 자바와 코틀린의 변수 선언 방식 차이 (1) | 2024.10.05 |