[Kotlin] 영역 함수 (run, let, with, apply, also)

2022. 12. 21. 12:00·컴퓨터 언어/Kotlin
728x90

코틀린에는 영역 함수라는 것이 존재한다.

 

영역 함수를 사용하면 특정 객체에 대한 식이라는 것을 알 수 있어서 가독성이 좋아진다.

 

영역 함수 모두 사용하는 목적은 비슷하지만 사용 방식에 있어서 약간의 차이점들이 존재한다.

 

객체 반환 여부에 따라서 구분해보자면 run, let, let과 apply, also로 나눌 수 있다.

 

먼저 영역 함수를 사용하지 않을 때와 사용할 때를 비교해보겠다.

 

사용하지 않을 때

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
    val s = Student()
    s.number = "1234"
    s.name = "chulsoo"
    s.printInfo()

사용할 때

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
    Student().run{
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

 

기능 자체는 큰 차이가 없다. 그러나 후자의 경우 영역 함수 안에 있는 코드들이 Student 클래스와 관련된 코드라는 것을 한눈에 확인할 수 있다.

 

이제 각각의 영역 함수들의 차이점과 사용 방법에 대해 공부해보려 한다.

 

run, let, with의 경우 함수 안 마지막 값을 반환하고 apply, also의 경우 객체를 반환한다.

 

이 의미는 아래 예시를 보면 이해할 수 있다.

 

다음 Student 클래스를 기준으로 설명해보려 한다.

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
run
    Student().run{
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

run 함수 안의 코드가 실행되고 run 함수의 반환 값은 마지막 값이다.

 

위의 경우 따로 반환하는 값이 없지만 아래와 같이 영역 함수를 사용하여 반환 값을 저장할 수도 있다.

    val res = Student().run{
        number = "1234"
        name = "chulsoo"
        "your number : $number your name : $name"
    }
    //res의 저장 값 : your number : 1234 your name : chulsoo

 

let
    Student().let{
        it.number = "1234"
        it.name = "chulsoo"
        it.printInfo()
    }

run과 거의 동일하지만 다른 점은 run의 경우 프로퍼티를 바로 호출할 수 있지만 let의 경우 it을 거쳐서 프로퍼티를 호출할 수 있다.

 

마찬가지로 마지막 값이 반환값이 된다.

with
    with(Student()){
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

run과 유사하게 it을 거치지 않고 바로 변수를 호출할 수 있다.

 

그러나 with 함수의 인자로 클래스 객체를 받는다.

 

마찬가지로 마지막 값이 반환값이 된다.

 

지금까지는 함수의 반환 값이 함수 안의 마지막 값이었다.

 

apply와 also는 함수의 반환 값이 객체이다.

 

apply
    Student().apply{
        number = "1234"
        name = "chulsoo"
    }.printInfo()

apply의 경우 객체를 반환하기 때문에 위의 예시에서는 number의 값이 "1234", name의 값이 "chulsoo"인 Student 객체를 반환하게 된다. 

 

반환받은 객체의 printInfo 함수를 실행하는 모습이다.

 

also
    Student().also{
        it.number = "1234"
        it.name = "chulsoo"
    }.printInfo()

apply와 유사하지만 프로퍼티를 바로 호출하지 않고 it을 거쳐서 호출한다.

 

마찬가지로 객체를 반환한다.

let을 이용하여 null에 대한 안정성을 확보할 수 있다.

    
    item?.let{
        ...
        //item이 null이 아닐 때 안의 내용을 실행한다.
    }
728x90

'컴퓨터 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 데이터 클래스(data class)의 장점  (0) 2022.12.22
[Kotlin] 고차 함수와 람다 함수  (0) 2022.12.20
[Kotlin] 클래스 사용법  (0) 2022.12.08
[Kotlin] try-catch문을 활용한 예외 처리 (finally)  (0) 2022.12.07
[Kotlin] 내포된 반복문과 레이블  (0) 2022.12.06
'컴퓨터 언어/Kotlin' 카테고리의 다른 글
  • [Kotlin] 데이터 클래스(data class)의 장점
  • [Kotlin] 고차 함수와 람다 함수
  • [Kotlin] 클래스 사용법
  • [Kotlin] try-catch문을 활용한 예외 처리 (finally)
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    codetree
    nn.RNN
    bfs
    RNN
    스프링 OAuth2
    openvidu 배포
    binary search
    embedding
    Vector Store
    ci/cd
    parametric search
    파이썬
    푸쉬 알람
    AWS Lambda
    Merge
    influxDB CLI
    스택
    ChatPromptTemplate
    다익스트라
    code tree
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[Kotlin] 영역 함수 (run, let, with, apply, also)
상단으로

티스토리툴바