Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241008 코틀린의 함수 선언 & 사용법 본문

Kotlin

[TIL]20241008 코틀린의 함수 선언 & 사용법

최밤빵 2024. 10. 8. 19:06

▶코틀린의 함수 선언 방식

코틀린에서 함수를 선언할 때는 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() 메서드를 사용할 수 있게 된다.

 

코틀린은 자바에 비해 함수 선언이 간결하고 직관적이며, 반환 타입 추론, 기본 인자값, 고차 함수 등 다양한 유용한 기능을 제공한다. 특히 함수 선언 방식의 차이로 인해 코드의 가독성이 크게 향상되며, 개발 효율성을 높일 수 있다는 점이 코틀린의 장점이다.