코틀린에서 함수를 정의하는 여러가지 방법과 특성에 대해서 알아보겠습니다. 코틀린은 완전히 함수형 프로그래밍 언어는 아니지만 최근에 생긴 언어답게 함수형 언어의 특징을 갖고 있습니다. 또한, 자바와 비슷하지만 자바보다 함수 정의 방법에 대해서 더 많은 자유도를 줍니다.
기본적인 함수 정의 방법
기본적으로 함수는 아래와 같이 정의합니다. 함수는 fun
키워드로 시작하며 리턴 타입은 : String
처럼 세미콜론 다음에 적어줍니다.
fun hello() : String {
return "hello world"
}
만약 인자를 받고 싶다면 name: String
처럼 변수 이름과 그 변수의 타입은 : String
처럼 세미콜론 다음에 적어줘야 합니다.
fun hello2(name: String) : String {
return "hello, my name is $name"
}
리턴 값이 없을 때는 Java가 void
를 사용하는 것처럼 코틀린은 Unit
을 사용합니다.
fun hello3(str: String): Unit {
println(str)
}
리턴 타입 Unit
은 아래처럼 생략할 수도 있습니다.
fun hello4(str: String) {
println(str)
}
Single expression functions(한 줄로 함수를 정의하는 방법)
Single expression functions는 한줄로 함수를 정의하는 방법을 말합니다.
위에서 정의한 hello world
를 리턴하는 함수는 아래처럼 한줄로 정의할 수 있습니다.
fun hello5() : String = "hello world"
인자를 사용한 함수도 이렇게 한줄로 정의할 수 있습니다.
fun hello6(name: String): String = "hello, my name is $name"
기본적인 함수 정의 방법과는 다르게 Single expression functions는 컴파일러가 리턴 타입을 추론할 수 있다면 생략해도 됩니다. 아래 코드는 "hello world"를 리턴하고 타입은 String입니다. 컴파일러가 이 함수는 String을 리턴한다고 추론할 수 있기 때문에 이렇게 생략할 수 있습니다.
fun hello7() = "hello world"
Local funtions(지역 함수)
Local functions(지역 함수)는 함수 안에 함수를 정의하는 방법입니다. 함수 안에 정의된 함수는 외부에서 사용할 수 없고 함수 내부에서만 사용할 수 있습니다. 함수 내부에서 동일한 코드를 반복적으로 사용해야 한다면 Local functions를 정의하여 중복 코드를 줄일 수 있습니다.
아래 코드는 dfs
라는 재귀함수를 Local functions로 정의하였습니다.
fun dfs(graph: Graph) {
fun dfs(current: Vertex, visited: Set<Vertex>) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v, visited)
}
dfs(graph.vertices[0], HashSet())
}
Local functions의 장점은 자신을 정의한 부모 함수의 변수에 접근할 수 있다는 것입니다.
위의 코드에서 dfs
함수는 인자는 두개인데요. 이 중에서 HashSet()
을 부모 변수에 정의하고 (마치 전역변수처럼) 지역변수 내에서 사용할 수 있습니다.
아래처럼 코드를 변경하니 인자가 1개 줄어들었습니다. 더 깔끔해졌네요.
fun dfs(graph: Graph) {
val visited = HashSet<Vertex>()
fun dfs(current: Vertex) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v)
}
dfs(graph.vertices[0])
}
Member functions(멤버 함수)
Member functions(멤버 함수)는 클래스의 멤버로 정의된 함수를 말합니다. 자바 프로그래머라면 익숙하게 보던 형태입니다.
class Sample() {
fun foo() { print("Foo") }
}
외부에서는 클래스 객체를 통해 호출을 할 수 있습니다.
Sample().foo()
정리
코틀린에서 함수를 정의하는 다양한 방법과 함수의 사용방법에 대해서 간단히 알아보았습니다. 이 글의 코드 중 일부는 Kotlin - 함수 정의 및 사용 방법를 참고하였습니다. 이 페이지를 참고하시면 더 자세한 함수의 사용방법에 대해서 알 수 있습니다.
참고
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 체크