고차함수와 람다식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 |