[Kotlin] Scope Functions (범위지정함수)

Jinny·2021년 1월 27일
0

Kotlin

목록 보기
8/9
post-thumbnail

🚩 함수형 언어 : 코틀린

자바와 같은 객체지향 언어의 단점은 뭐가 있을까?
바로 무한한 확장이 가능하다는 점이다.
일부가 아닌 전체를 상속 받아야하니 사이즈가 계속 커진다는 단점이 있다.
이를 보완하고자 나온 언어가 함수형 언어이다.
함수 위주로 디자인을 한다. (대표적인 예가 바로 코틀린!)

🚩 Scope Functions란?

자바와는 다른 함수형 프로그래밍 언어 코틀린의 큰 특별한 점을 뽑자면 Scope Functions가 있다.
Kotlin의 표준 라이브러리에는 객체 컨텍스트 내에서 코드 블록을 실행하는 것이 유일한 목적인 여러 함수가 포함되어 있다.
람다식을 사용하여 개체에서 이런 함수를 호출 하게 되면 임시 범위가 형성된다.
이 범위 내에서는 이름 없이 개체에 액세스 할 수 있다.

이러한 함수를 Scope Fuctions (범위 함수) 라고 한다 .
(종류는 5가지가 있다.)

let, run, with apply, also

val bob = Person("Bob", 21, "Student")

위 코드와 같이 변수 bob이 선언되어있을 때, 계속하여 변수를 호출하여 사용하는 방법이 있다.

println(bob)
bob.moveTo("Korea")
bob.incrementAge()

하지만, 범위함수 사용을 통해 코드를 더 간결하게 짤 수 있다.

bob.let{    //여기서 bob가 수신 객체
      println(it)
      it.moveTo("Korea")
      it.incrementAge()
    }

현재는 예시가 짧아 비슷해 보이지만 긴 코드를 사용할 수록 간결해짐을 느낄 수 있다.

◾ let

위 예제에서 사용한것이 let이다.
let은 주로 null이 아닌 값에 대해서 코드를 실행해야 하는 경우 사용한다.
null인 경우 실행되지 않는다.
null이 아닌 개체에 대해 작업을 수행하려면 해당 개체에 ?.(안전 호출 연산자)를 사용한다.

val str: String? = "let"   
val length = str?.let {
	//실행되는 경우 여기서의 it은 null이 아니다. 
	println(it)
}

//자바였다면
if( str ! = null) {
	println(str);
}

◾ with

with는 수신 객체이며, 결과값이 필요 없을 때만 사용한다. (return 이 없음)

with(bob){    //여기서 bob가 수신 객체
        println($this)
        moveTo("Korea")
        incrementAge()
    }

◾ apply

수신 객체가 값을 반환하지 않고, 자기 자신을 다시 반환 하려는 경우에 apply 를 사용한다.

bob.apply{    //여기서 bob가 수신 객체
        println("$this")
        moveTo("Korea")
        incrementAge()
    }

◾ also

also는 수신객체의 속성을 변경하지 않을 때 사용하며, apply 와 마찬가지로 수신 객체를 반환 한다.
속성을 변경하지 않으니 대입연산(=)의 사용이 없다.
데이터의 유효성을 검사할때 유리하다. (ex. age의 값이 음수니?)

bob.also{    //여기서 bob가 수신 객체
        println("$it")
        moveTo("Korea")
        incrementAge()
    }
    
Random.nextInt(100).also{
	print("값은 $it")
}

let과 비슷하게 동작하지만 let 에서는 내부 결과를 변화 시킬 수 있고, also 에서는 변화 시킬 수 없다.

◾ run

어떠한 값을 계산할 필요가 있거나 또는 객체 구성과 결과 계산을 한번에 할 때 유용하다.

val result = service.run{
	port = 100
    query()
}

//자바였다면
service.port = 100
Result result = service.query()

출처 : 코틀린 공식문서
profile
신입 개발자👩‍💻

0개의 댓글