Deperecated/Kotlin

코틀린 - 고차함수와 람다식2 (고차함수, 람다식 사례)

누알라리 2020. 4. 10. 21:43
고차함수와 람다식1에서는 개념적인 설명, 2에서는 사례를 써놓는다.

 

1. 동기화 관련 사례

동기화: 변경이 일어나면 안되는 특정 코드를 보호하기 위한 잠금 기법
임계 영역(Critical Section): 동기화로 보호되는 코드 
-> 보통 try ~ finally 블록으로 많이 쓴다.
-> try에서 뻑나도 finally는 실행되니까 공유자원에 대한 잠금은 막을 수 있음

특정 공유 자원을 쓰고싶을 때 공유자원에 아무나 접근하면 안되니까

1. 내가 쓸 동안 아무도 건들지마 -> Lock 라이브러리의 lock() 함수 호출

2. 임계 영역에 수행할 작업 코드 작성 -> 쓰는중..

3. 다 썼으니 이제 너네 써 -> Lock 라이브러리의 unlock() 함수 호출

 

var sharable = 1

fun <T> Lock(reLock : ReentrantLock , body : () -> T) : T {	

	reLock.lock()
    
    try {
    	// 임계 영역의 코드
        return body()
    } finally {
    	reLock.unlock()
    }
}

// 임계 영역에서 사용하고 싶은 함수
fun criticalFunc() {
	// 공유자원에 접근한다 흐흐
    sharale += 1
}

fun main() {

	val reLock = ReentrantLock()
    
    // 셋 다 같은 표현
    lock(reLock, { criticalFunc() })
    lock(reLock) { criticalFunc() }
    lock(reLock, ::criticalFunc )
}

출력 결과
4

 

2. 네트워크 호출 관련 코드

네트워크로부터 무언가를 호출하고 성공하거나 실패했을 때 특정 콜백 함수를 만든다고 가정.

 

콜백(Callback)함수: 특정 이벤트가 발생할 때 까지 처리되지 않다가 이벤트가 발생하면 즉시 호출되어 처리되는 함수. 사용자가 아닌 시스템이나 이벤트에 따라 호출 시점을 결정한다.
자바의 경우....

1. CallBack 인터페이스 만든다.
 1-1. 1의 인터페이스에 성공할 경우의 onSuccess() 함수 선언
 1-2. 1의 인터페이스에 실패할 경우의 onError() 함수 선언

2. CallBack 인터페이스를 매개변수로 쓰는 networkCall 함수 선언
 2-1. try~catch로 성공하면 Callback의 onSuccess() 호출
 2-2. catch로 Exception 받으면 Callback의 onError() 함수 호출
 
3. 2에서 만든 networkCall을 사용 - 인자에서 인터페이스 구현을 익명 객체를 만들어 처리 한다.
 3-1. networkCall(new CallBack() {
 		public void onSuccess(ResultType result) { .. } 웅앵웅
 		public void onError(Exception e) {...} 웅앵웅
        
        
        
자바는 네트워크 성공과 실패 처리를 위해
1. 인터페이스 인터페이스 구현을 위한 
2. 익명 객체를 사용
3. 이벤트에 따라 콜백함수 호출

@_@ 졸라복잡
코틀린의 경우.....

// 네트워크를 호출하는 함수를 선언
fun networkCall( onSuccess : (ResultType) -> Unit, onError : (Throwable) -> Unit ) {
	try {
    	onSuccess(myResult)
    } catch ( e : Exception ) {
    	onError(e)
    }
}

//함수 호출 - 인자 형식에 람다식을 사용
networkCall( result -> { 
	네트워크 호출에 성공했을 때 구현부
   }, error -> {
    네트워크 호출에 실패했을 때 구현부
   });
    
함수 호출에 바로 람다식으로 구현부를 작성해버림 ㅠ_ㅠ GOOOOOD

 

'Deperecated > Kotlin' 카테고리의 다른 글

두잇 코틀린 프로그래밍 공부 < 2강>  (0) 2020.06.12
두잇 코틀린 프로그래밍 공부 <1강>  (0) 2020.06.12
코틀린 기본 -2 (변수)  (0) 2020.04.08
코틀린 프로젝트 구성  (0) 2020.04.07
코틀린 - 상수  (0) 2020.02.18