로컬 클래스(Local Class)
- 함수 또는 블록 내부에 선언된 클래스
- 외부에는 보이지 않으며 해당 함수 내부에서만 사용 가능
예시
fun exampleFunction() {
class LocalUser(val name: String) {
fun sayHello() {
println("Hello, my name is $name")
}
}
val user = LocalUser("희우")
user.sayHello() // 출력: Hello my name is 희우
- LocalUser은 exampleFunction 내부에서만 정의되고 사용
용도
- 특정 함수 안에서만 사용하는 간단한 구조
- 외부에 노출하지 않으면서 캡슐화
- 복잡한 로직을 분리하여 가독성을 높히기
예시
fun processNumbers(numbers: List<Int>){
class EvenChecker {
fun isEven(n: Int): Boolean = n % 2 == 0
}
val checker = EvenChecker()
for (n in numbers) {
if (checker.isEven(n)){
println("$n is even")
}
}
}
- EvenChecker은 함수 외부에서 사용할 일이 없음 + 내부 로직 보조용으로 사용 ⇒ 로컬 클래스가 적절한 사용
주의점
- 가시성: 오직 선언된 블록 내에서만 사용 가능
- 상태 접근: 바깥 함수의 지역 변수에 접근은 불가능
fun test() {
val a = 10
class Sample {
println(a) // 불가능
}
}
- 복잡성: 자주 사용할 경우 코드의 가독성이 떨어짐
📌 로컬 클래스와 바깥 지역 변수 접근
로컬 클래스는 함수 안에 정의된 클래스로 해당 클래스 내부에서 바깥 함수의 로컬 변수에 접근이 불가능
fun myFunctoin() {
val message = "Hello"
class LocalClass {
fun printMessage() {
println(message) // error
}
}
}
- 로컬 클래스는 함수의 실행 시점과 무관하게 동작
- 함수를 벗어나지 않더라도 클래스 내부에서 사용되는 변수의 생명 주기와 함수의 로컬 변수 생명의 주기가 맞지 않아 안정성을 위하여 제한
- 바깥 지역 변수: 스택 프레임
- 로컬 클래스: 힙
- 바깥 지역 변수를 사용해야할 경우에는 생성자 또는 메서드 파라미터로 전달
fun myFunctionb() {
val message = "Hello"
class LocalClass(private val message: String) {
fun printMessage() {
println(message)
}
}
val localClass = LocalClass(msg)
localClass.printMessage()
}
- 람다나 익명 클래스는 클로저(closure)을 사용하여 바깥 변수에 접근 가능: 로컬 클래스와는 다르게 동작
- 로컬 클래스 대신 람다나 확장 함수로 처리할 수 있는 일이 많아서 로컬 클래스를 직접 선언하는 일은 드묾
- 가독성, 구조화, 캡슐화가 필요한 경우에는 유용
'개발새발 > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] enum / enum class (0) | 2025.09.08 |
---|---|
[코틀린/Kotlin] qualifiedName (0) | 2025.09.06 |
[코틀린/Kotlin] 익명 클래스(Anonymous Class) (0) | 2025.09.04 |
[코틀린/Kotlin] is, as, as? (0) | 2025.09.03 |
[코틀린/Kotlin] 구체화(reifeid) (0) | 2025.09.02 |