본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] 로컬 클래스(Local Class)

by 조희우 2025. 9. 5.

로컬 클래스(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 내부에서만 정의되고 사용

용도

  1. 특정 함수 안에서만 사용하는 간단한 구조
  2. 외부에 노출하지 않으면서 캡슐화
  3. 복잡한 로직을 분리하여 가독성을 높히기

예시

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)을 사용하여 바깥 변수에 접근 가능: 로컬 클래스와는 다르게 동작

  • 로컬 클래스 대신 람다나 확장 함수로 처리할 수 있는 일이 많아서 로컬 클래스를 직접 선언하는 일은 드묾
  • 가독성, 구조화, 캡슐화가 필요한 경우에는 유용