Kotlin 문법 종합반 #4中. 반환과 스코프 함수

·2024년 6월 14일
0

반환

  • 액션함수 : 코드만 실행하고 값을 반환하지 않는 함수입니다.
    (실제로는 Unit 값을 반환하고, 자료형이 Unit이지만... 없는 것과 다름없습니다 !)

  • 리턴함수 : 코드를 실행한 다음, 함수에 값을 반환하는 함수입니다.
    '값'으로 쓰이기 때문에 자료형을 붙여야 합니다.

함수가 → 값으로 반환되는 경우,
보통 return 반환값 형태의 코드를 마지막 줄에 적어줍니다

Pair / Tripple 자료형

보통의 return 함수

fun 함수() : Int {
	var xxx = 10
	return xxx
}

Int를 반환값으로 갖는 함수입니다
return 뒤에 붙은 변수를 함수의 값으로 반환합니다

:Pair<> 자료형 함수

fun 함수() : Pair<Int,Int> {
	var x = 5
    var y = 10
    var xxx = Pair(5,10)
	return xxx
}

자료형 Pair를 반환값으로 갖는 함수입니다
꺾쇠 괄호 < > 에 요소 자료형을 적어줍니다

Pair( ) 형태의 데이터를 변수에 대입하여 return 하면 됩니다

:Tripple<> 자료형 함수

fun 함수() : Tripple<String, Int, Int> {
	var x = "민수"
    var y = 3
    var z = 2
    var xxx = Tripple (x, y, z)
	return xxx
}

자료형 Tripple를 반환값으로 갖는 함수입니다
꺾쇠 괄호 < > 에 요소 자료형을 적어줍니다

Tripple( ) 형태의 데이터를 변수에 대입하여 return 하면 됩니다

(예시) pair/tripple를 리스트로 변환하기

class 유틸리티클래스(){
	fun 함수(x:Int,y:Int,z:Int):Tripple<Int,Int,Int>{
    var xxx = Tripple(x, y, z)
    return xxx
    } 
}
  • 함수(x,y,z) 메서드는 Tripple을 반환합니다
  • 메서드를 저장하고 꺼내쓰기 위해 유틸리티클래스를 만들었습니다

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]
    
}
  • 유틸리티 클래스를 활용해 인스턴스를 선언했습니다. 메서드를 꺼내오는 심부름꾼이 될거예요.
  • 인스턴스.함수(x,y,z)로 메서드를 꺼내 씁니다.
    • 함수(x,y,z)는 Tripple을 반환합니다
    • Tripple은 .first / .second / .third 형식으로 요소를 특정합니다

.toList()

  • .toList()로 Tripple 컬렉션을 List 컬렉션으로 바꾸었습니다
    • List는 [index] 형식으로 요소를 특정합니다

인스턴스.메서드()

메서드를 "유틸리티클래스"에 담아두고 → 인스턴스를 생성한 다음
인스턴스.메서드() 형태로 꺼내쓰는 경우가 굉장히 많습니다
.
클래스 선언, 함수 선언, 인스턴스 생성, 메서드 사용...
번거롭고 낯설지만 적응하도록 합시다 !!!


Scope Funtion

Scope 함수는 객체를 참고해 반환하는 함수입니다. 짧은 코딩에 도움이 됩니다

반환

run { }

var xxx = run {
	var a = 5
    var b = 10
	a+ b
}

코드를 즉시 실행하고 마지막 값을 무조건 반환합니다
return 함수를 즉석으로 만들어쓰는 셈입니다


let/run :: 참고하여 반환

객체를 참고하여 코드를 실행하고, 마지막 값을 무조건 반환합니다

객체.let { }

var 인사길이 = "안녕하세요".let{
	it.length
}

.let 안에서는 객체를 it 으로 짧게 호명하고, 마지막 값을 반환합니다

인스턴스.run { }

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 :: 참고하여 코드실행 (반환X)

.also와 .apply는 반환값을 가지지 않습니다
코드처리만 할 뿐, 반환하지 않기 때문에 참고/확인용으로 쓰기 좋습니다

객체.also { }

var xxx = "안녕하세요".also{
	println(it.length)
}

.also 안에서는 객체를 it 으로 짧게 호명합니다. 편합니다!

인스턴스.apply { }

class 유틸클래스(){
	var 색상 = "red"
}

var 인스턴스 = 유틸클래스().apply{
	println($색상)
}

.apply 안에서는 인스턴스를 this로 짧게 호명합니다.
프로퍼티/메서드를 경로 없이 부를 수 있습니다. 매우 편합니다!

apply는 반환값이 없기 때문에 인스턴스를 변경할 수 없지만,
" this.프로퍼티 " 에 대입하여 인스턴스의 프로퍼티를 변경하는 것이 가능합니다
그래서 사실상 기능적으로 .run과 거의 동일합니다


Scope 함수 정리

run{ } ★

  • 마지막 줄 반환하는 즉석 return 함수

.let{ } ★

  • it으로 객체 호명 + 마지막 줄 반환

.run{ }

  • this로 인스턴스 호명 + 마지막 줄 반환

.also{ }

  • it으로 객체 호명하여 참고

.apply{ } ★

  • this로 인스턴스 호명하여 참고

with( xxx ){ }

  • this로 인스턴스 호명 + 마지막 줄 반환
  • .run에 밀려서 잘 안씁니다

저라면 ★ 표시한 run , let , apply를 애용할 것 같습니다

scope를 중복으로 쓰게 된다면
it이 중복 사용되지 않도록, { a -> 를 붙여 객체를 a 로 호명합니다

profile
디자이너의 개발 창업 도전기

0개의 댓글