밤빵's 개발일지
[TIL]20241029 Nested Functions 본문
코틀린에서는 함수 안에 또 다른 함수를 선언할 수 있는데, 이를 통해 코드 구조를 개선하고 특정 기능을 캡슐화하여 가독성을 높이는 데 도움이 된다. 중첩된 함수는 특정 함수 내에서만 사용되는 보조 기능을 정의할 때 유용하고, 자바와 비교했을 때 더 간결하고 유연한 코드를 작성할 수 있다. 이번 개발일지에서는 코틀린에서 중첩된 함수를 사용하는 방법과 그 장점에 대해 정리해보았다.
▶중첩된 함수(Nested Functions)란?
중첩된 함수(Nested Functions)는 함수 내부에 선언된 또 다른 함수를 의미한다. 중첩된 함수는 해당 함수 외부에서 접근할 수 없고, 주로 해당 함수 내에서 반복적으로 사용되는 로직이나 보조 기능을 분리할 때 유용하다. 중첩된 함수를 사용하면 코드의 가독성이 향상되고, 외부에 노출될 필요가 없는 기능을 캡슐화할 수 있어 코드 관리가 용이하다.
▶코틀린에서 중첩된 함수 선언 방법
코틀린에서 중첩된 함수를 선언하는 방법은 간단하다. 함수 안에 fun 키워드를 사용하여 또 다른 함수를 정의하면 된다. 예를 들어, 아래는 계산 함수 안에 validateInput이라는 중첩된 함수를 정의한 예시이다.
fun calculate(value: Int): Int {
fun validateInput(input: Int) {
if (input < 0) throw IllegalArgumentException("Input must be non-negative")
}
validateInput(value) // 중첩된 함수 호출
return value * value
}
→ 이 예시에서 validateInput 함수는 calculate 함수 내에서만 사용되며, 입력 값이 올바른지 검증하는 역할을 한다. calculate 함수 외부에서는 validateInput에 접근할 수 없기 때문에, 코드가 더 안전해진다.
▶중첩된 함수의 장점
중첩된 함수를 사용하면 코드의 가독성과 유지보수성이 크게 향상된다. 코틀린의 중첩된 함수가 가지는 장점을 정리하면 다음과 같다.
캡슐화
→ 중첩된 함수는 외부에 노출되지 않아, 외부 코드에서 접근할 수 없다. 따라서 함수 내부에서만 사용되는 로직을 숨길 수 있다.
가독성
→ 함수 내부에 보조 로직을 분리하여 정의할 수 있어, 메인 로직과 부가적인 기능을 분리함으로써 코드가 더 깔끔해진다.
중복 방지
→ 중첩된 함수로 반복되는 로직을 함수화하면 코드 중복을 줄일 수 있다.
▶자바와의 차이점
자바에서는 메서드 내에 또 다른 메서드를 선언할 수 없기 때문에, 함수 내부에 함수를 중첩하는 방식이 허용되지 않는다. 자바에서 비슷한 역할을 하려면 익명 클래스나 람다 표현식을 사용해야 하며, 이 경우 코드가 길어지고 복잡해질 수 있다. 반면, 코틀린에서는 중첩된 함수를 손쉽게 정의할 수 있어 간결하게 코드를 구성할 수 있다는 점에서 큰 차이가 있다.
▶실제 활용 예시
중첩된 함수는 특정 작업 내에서만 필요한 검증이나 로직을 함수로 분리할 때 매우 유용하다. 아래는 더 복잡한 예시로, 문자열 리스트의 각 항목을 특정 패턴에 따라 변환하고, 변환이 올바르게 수행되었는지 검증한다.
fun processStrings(strings: List<String>): List<String> {
fun validateString(str: String) {
if (str.isEmpty()) throw IllegalArgumentException("String cannot be empty")
}
fun transformString(str: String): String {
return str.lowercase().replace(" ", "_")
}
return strings.map {
validateString(it)
transformString(it)
}
}
→ validateString: 각 문자열이 비어 있지 않은지 검증하는 중첩된 함수이다.
→ transformString: 각 문자열을 소문자로 변환하고 공백을 언더바로 바꾸는 변환 로직을 수행하는 중첩된 함수이다.
이 코드는 문자열 리스트에 대해 map 함수를 이용해 변환 작업을 수행하고, 각 문자열이 올바르게 변환되는지 중첩된 함수를 사용해 검증할 수 있다. validateString과 transformString 함수는 processStrings 함수 내에서만 사용되므로 외부에 노출되지 않으며, 코드의 의도를 명확하게 드러내면서도 코드 중복을 줄여준다.
▶중첩된 함수의 제한 사항
중첩된 함수는 함수 내부에서만 접근할 수 있기 때문에, 여러 함수에서 같은 기능을 공유하려면 중첩된 함수로 정의하는 대신 별도의 함수로 분리해야 한다. 또한 중첩된 함수가 지나치게 많아지면 코드가 오히려 복잡해질 수 있으므로, 적절히 사용할 필요가 있다.
중첩된 함수는 코틀린에서 코드 구조를 개선하고 가독성을 높이는 데 유용한 기능이다. 특히 특정 함수 내에서만 필요한 보조 로직을 분리할 수 있어 코드의 안전성과 유지보수성이 향상된다. 자바와 달리 함수 내에서 함수 정의가 가능해 코드 구성이 더 유연해지는 것도 큰 장점이다.
'Kotlin' 카테고리의 다른 글
[TIL]20241031 Operator Overloading (4) | 2024.10.31 |
---|---|
[TIL]20241030 try-with-resources & use (4) | 2024.10.30 |
[TIL]20241028 by 와 Delegation (1) | 2024.10.28 |
[TIL]20241027 sealed class 와 Enum (0) | 2024.10.27 |
[TIL]20241026 apply, with, run (2) | 2024.10.26 |