액션함수 : 코드만 실행하고 값을 반환하지 않는 함수입니다.
(실제로는 Unit 값을 반환하고, 자료형이 Unit이지만... 없는 것과 다름없습니다 !)
리턴함수 : 코드를 실행한 다음, 함수에 값을 반환하는 함수입니다.
'값'으로 쓰이기 때문에 자료형을 붙여야 합니다.
함수가 → 값으로 반환되는 경우,
보통 return 반환값 형태의 코드를 마지막 줄에 적어줍니다
fun 함수() : Int {
var xxx = 10
return xxx
}
Int를 반환값으로 갖는 함수입니다
return 뒤에 붙은 변수를 함수의 값으로 반환합니다
fun 함수() : Pair<Int,Int> {
var x = 5
var y = 10
var xxx = Pair(5,10)
return xxx
}
자료형 Pair를 반환값으로 갖는 함수입니다
꺾쇠 괄호 < > 에 요소 자료형을 적어줍니다
Pair( ) 형태의 데이터를 변수에 대입하여 return 하면 됩니다
fun 함수() : Tripple<String, Int, Int> {
var x = "민수"
var y = 3
var z = 2
var xxx = Tripple (x, y, z)
return xxx
}
자료형 Tripple를 반환값으로 갖는 함수입니다
꺾쇠 괄호 < > 에 요소 자료형을 적어줍니다
Tripple( ) 형태의 데이터를 변수에 대입하여 return 하면 됩니다
class 유틸리티클래스(){
fun 함수(x:Int,y:Int,z:Int):Tripple<Int,Int,Int>{
var xxx = Tripple(x, y, z)
return xxx
}
}
fun main(){
var 인스턴스 = 유틸리티클래스()
var 트리플정보 = 인스턴스.함수(3, 5, 7)
var a = 트리플정보.first
var b = 트리플정보.second
var c = 트리플정보.third
var 리스트화 = 트리플정보.toList()
var a = 리스트화[0]
var b = 리스트화[1]
var c = 리스트화[2]
}
인스턴스.메서드()
메서드를 "유틸리티클래스"에 담아두고 → 인스턴스를 생성한 다음
→ 인스턴스.메서드() 형태로 꺼내쓰는 경우가 굉장히 많습니다
.
클래스 선언, 함수 선언, 인스턴스 생성, 메서드 사용...
번거롭고 낯설지만 적응하도록 합시다 !!!
Scope 함수는 객체를 참고해 반환하는 함수입니다. 짧은 코딩에 도움이 됩니다
var xxx = run {
var a = 5
var b = 10
a+ b
}
코드를 즉시 실행하고 마지막 값을 무조건 반환합니다
return 함수를 즉석으로 만들어쓰는 셈입니다
객체를 참고하여 코드를 실행하고, 마지막 값을 무조건 반환합니다
var 인사길이 = "안녕하세요".let{
it.length
}
.let 안에서는 객체를 it 으로 짧게 호명하고, 마지막 값을 반환합니다
class 유틸클래스(){
var 색상 = "red"
}
var 인스턴스 = 유틸클래스().run{
색상 = "blue"
this
}
.run 안에서는 인스턴스를 this로 짧게 호명하고, 마지막 값을 반환합니다
덕분에 this.프로퍼티와 같이 경로를 짧게 표현할 수 있는데,
아예 " 프로퍼티 "만 다이렉트로 언급해도, this.프로퍼티로 인식합니다
프로퍼티/메서드를 경로 없이 부를 수 있습니다. 매우 편합니다!
.run은 마지막 줄의 인스턴스를 반환해야하지만,
반환할 인스턴스가 없을 시, 자동으로 this를 반환합니다.
그래서 사실상 .apply 와 기능적으로 거의 동일합니다.
.run은 run 과 다릅니다
with(인스턴스){ }
var 인스턴스 = with( 유틸클래스() ){ 색상 = "blue" }
.run 과 동일하게, 인스턴스를 this로 짧게 호명하고, 마지막 값을 반환합니다
with() 형태로 파라미터 안에 집어넣습니다.
어차피 . run을 더 많이 쓸 거니까 알아만 둡시다~!
.also와 .apply는 반환값을 가지지 않습니다
코드처리만 할 뿐, 반환하지 않기 때문에 참고/확인용으로 쓰기 좋습니다
var xxx = "안녕하세요".also{
println(it.length)
}
.also 안에서는 객체를 it 으로 짧게 호명합니다. 편합니다!
class 유틸클래스(){
var 색상 = "red"
}
var 인스턴스 = 유틸클래스().apply{
println($색상)
}
.apply 안에서는 인스턴스를 this로 짧게 호명합니다.
프로퍼티/메서드를 경로 없이 부를 수 있습니다. 매우 편합니다!
apply는 반환값이 없기 때문에 인스턴스를 변경할 수 없지만,
" this.프로퍼티 " 에 대입하여 인스턴스의 프로퍼티를 변경하는 것이 가능합니다
그래서 사실상 기능적으로 .run과 거의 동일합니다
저라면 ★ 표시한 run , let , apply를 애용할 것 같습니다
scope를 중복으로 쓰게 된다면
it이 중복 사용되지 않도록, { a -> 를 붙여 객체를 a 로 호명합니다