이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

[Kotlin] 클로저(Closure)

  • 2025.01.30 03:28
  • Programming Language
글 작성자: Coding Groot

최근에 Refactoring2를 읽으며 자바로 1장을 그대로 실습하려고 했지만 중첩 함수가 지원되지 않아서 따로 클래스, static 함수, 람다로 빼다 보니 책의 흐름과 다소 달라져서 그냥 코틀린으로 실습해보았다. 코틀린은 중첩함수와 Closure가 지원되기 때문에 중첩함수를 자주 활용하는 JS 예제도 비슷하게 따라할 수 있어서 좋았다~!

클로저란 뭘까?

클로저(Closure)는 함수가 정의될 때의 환경을 기억(Capture)하고 유지하는 개념이다. 클로저는 자신이 선언된 범위(scope)의 변수를 계속해서 유지하고 이후(그 당시에 환경이 소멸됐더라도!)에도 변경할 수 있다.

예제 코드

먼저 코드부터 봐보자

fun incrementFrom(start: Int): (Int) -> Int { // 외부 함수
    var n = start // "n"이 클로저에 의해 캡처됨
    
    fun increaseBy(x: Int): Int { // 내부 함수
        n += x // 외부 함수의 변수 n을 증가
        return n
    }
    
    return ::increaseBy
}

incrementFrom(start: Int)은 시작값을 받아 내부 함수 increaseBy를 반환하는 고차 함수이다.
이 내부 함수에 주목해보자!
변수 n은 incrementFrom에서 선언된 지역 변수이지만 내부 함수인 increaseBy 함수에서 n을 참조/변경/반환하고 있다.
incrementFrom에서 선언된 n은 incrementFrom 실행이 끝나면 어떻게 될까?
→ incrementFrom의 실행이 끝나더라도 n이 유지되고 + 나중에 수정할 수 있습니다. 이 부분이 클로저의 핵심이다.
n은 increaseBy 내부에서 참조할 수 있게 계속 유지된다. 같은 클로저를 호출하면 같은 n을 참조해서 이전 값이 반영된다.

실행

실행해서 확인해보자.

동작 과정을 살펴보면 다음과 같다.
1. fromThreeAdd = incrementFrom(3) → n = 3인 클로저 생성
2. fromThreeAdd(1) → fromThreeAdd의 n이 3 -> 4로 변경
3. fromThreeAdd(1) → fromThreeAdd의 n이 4 -> 5로 변경
4. fromThreeAdd(10) → fromThreeAdd의 n이 5 -> 15로 변경
5. fromTenAdd = incrementFrom(10) 실행 → n = 10인 새로운 클로저 생성
6. fromTenAdd(10) → fromTenAdd의 n이 10 -> 20으로 변경
다음의 코드를 보면 추가로 fromThreeAdd와 fromTenAdd는 각각 독립적인 클로저를 유지하는 것을 알 수 있다.

언제 활용할까?

클로저를 사용하면 위의 예제처럼 동일한 로직을 여러 개의 클로저 인스턴스로 활용할 수 있다.
그리고 n을 추가로 내부 함수에 추가로 파라미터로 넘겨줄 필요 없이 그 당시의 변수를 캡처해서 가져갈 수 있어서 잘만 활용하면 더 리팩터링하기 쉬운 코드를 만들 수 있다.

단점은 없을까?

클로저의 캡처된 변수는 언제 free될까? 클로저의 메모리 관리를 생각하지 않으면 메모리 누수가 발생할 수 있기 때문에 주의해야 한다. 예를 들어서, 매번 어떤 동작(ex 페이지를 방문)을 할 때마다 클로저가 생성되는데 free가 언제 되는지는 하나도 고려하지 않는 코드 등을 조심하자.
무거운 객체를 캡처하는 것도 경계해야 할 것이다.
클로저 내부 변수는 외부에서 직접 접근할 수 없고 내부 함수에서만 변경 가능하기 때문에 디버깅하기도 어렵다. 하지만 변수를 감춘다는 점에서 OOP에서 추구하는 정보 은닉의 이점을 가지기도 한다.

반응형

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (182)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (49)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 서평
  • javascript
  • git
  • tutorial
  • 한빛미디어
  • aws
  • Github
  • 회고
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바