kotlin 33

[TIL] Kotlin - 기타 표준 함수

※ 기타 함수의 활용 - takeIf() 함수는 람다식이 true면 객체 T를 반환하고 그렇지 않다면 null을 반환하고 takeUnless() 함수는 람다식이 false면 T를 반환하고 그렇지 않다면 null을 반환한다. ※ 엘비스 연산자(?:)를 함께 사용 val input = "Kotlin" val keyword = "in" //입력 문자열에 키워드가 있으면 인덱스를 반환하는 함수를 takeIf를 사용해 구현 input.indexOf(keyword).takeIf { it >= 0 } ?: error("keyword not found") // takeUnless를 사용해 구현 input.indexOf(keyword).takeUnless { it < 0 } ?: error("keyword not fou..

[TIL] Kotlin - use()

※ use() 활용하기 - use()를 사용하면 객체를 사용한 후 close() 등을 자동적으로 호출하여 닫는다 // 표준 함수 정의 public inline fun T.use(block: (T) -> R): R 혹은 public inline fun T.use(block: (T) -> R): R - T의 제한된 자료형을 보면 Closeable?로 block은 닫힐 수 있는 객체를 지정해야 한다 - Java 7 이후는 AutoCloseable? 로 사용된다 fun main() { PrintWriter(FileOutputStream("d:\\test\\output.txt")).use { it.println("hello") } } PrintWriter는 파일을 열거나 새롭게 생성해 파을에 출력할 수 있다. 이..

[TIL] Kotlin - with() 활용

※ with() 활용하기 - 인자로 받는 객체를 이어지는 block의 receiver로 전달하며 결과값을 반환한다 - run() 함수와 기능이 유사하지만 run은 receiver가 없고 with에서는 receiver로 전달할 객체를 처리 한다는 차이가 있다 //표준 함수의 정의 public inline fun with(receiver: T, block: T.() -> R): R = receiver.block() with는 세이프 콜(?.)을 지원하지 않아 다음과 같이 let을 사용해야 한다 supportActionBar?.let { with(it) { ...... ...... } } ※ let과 with 표현 병합 - run과 동일하다 supportActionBar?.run { ..... ..... }

[TIL] Kotlin - run()

※ run() 활용하기 - run() 함수는 인자가 없는 익명 함수처럼 동작하는 형태와 객체에서 호출하는 형태 두가지로 사용한다 public inline fun run(block: () -> R): R = return block() public inline fun T.run(block: T.() -> R): R = return block() 독립적으로 사용할 경우 block에 처리할 내용을 넣어 마지막 식을 반환한다 val a = 10 skills = run { val level = "kotlin Level;" + a level // 마지막 표현식 미반환 } 할당 없이 사용할 경우 체이닝을 사용해 특정 결과에 대한 메서드를 실행할 수 있다. run { if (firstTimeView) introView ..

[TIL] Kotlin - apply()

※ 확장시키고 반환한다 - apply() - applY() 함수는 also() 함수와 마찬가지로 호출하는 객체 T를 이어지는 block으로 전달하고 객체 자체인 this 반환 public inline fun T.apply(block: T.() -> Unit): T { block(); return this } T.()와 같은 표현에서 람다식이 확장 함수로서 처리할 수 있다. ※ 디렉터리 생성 시 apply() 활용하기 //기존 코드 fun makeDir(path: String): File { val result = File(path) result.mkdirs() retrun result } - apply는 확장 함수로서 person을 this로 받아오는데 이것은 사실상 클로저를 사용하는 방식과 같다. 따라..

[TIL] Kotlin - also()

※ also() 활용 - also() 는 함수를 호출하는 객체 T를 이어지는 block에 전달하고 객체 T 자체를 반환함 public inline fun T.let(block: (T) -> R): R = { block(this) public inline fun T.also(block: (T) -> Unit): T { block(this); return this } - also는 블록 안의 코드 수행 결과와 무관하게 T인 바로 객체 this를 반환한다 ※ 디렉터리 생성 활용 // 기존 디렉터리 생성 함수 fun makeDir (path: String): File { val result = File(path) result.mkdirs() return result } // let과 also를 통한 개선된 함수..

[TIL] Kotlin - 결과와 함께 반환하기, let()

※ 코틀린의 표준 라이브러리 - 람다식을 사용하는 코틀린의 표준 라이브러리에서 let(), apply(), with(), also(), run() 등 여러 표준 함수를 제공함 - 표준 함수들은 대략 확장 함수 형태의 람다식으로 구성되어 있다. 함수명 람다식의 접근 방법 반환 방법 T,let it block 결과 T.also it T caller (it) T.apply this T caller (this) T.run 혹은 run this block 결과 with this Unit ※ let() 활용 - let 동작: 함수를 호출하는 객체 T를 이어지는 block의 인자로 넘기고 block의 결과값 R을 반환한다 public inline fun T.let(block: (T) -> R): R { ... ret..

[TIL] Kotlin - 클로저(Closure)

※ 클로저(Closure) - 람다식으로 표현된 내부 함수에서 외부 범위에 선언된 변수에 접근할 수 있는 개념 - 람다식 안에 있는 외부 변수는 값을 유지하기 위해 람다가 포획(capture)한 변수 기본적으로 함수 안에 정의된 변수는 로컬 변수로 스택에 저장되어 있다 함수가 끝나면 같이 사라지게 되지만 클로저 개념에서 포획한 변수는 참조가 유지되어 종료되어도 사라지지 않고 접근하거나 수정할 수 있다. fun main() { val calc = Calc() var result = 0 // 외부의 변수 calc.addNum(2,3) { x, y -> result = x + y } // 클로저 println(result) // 값을 유지해 5 출력 } class Calc { fun addNum(a: Int,..

[TIL] Kotlin - 람다식과 고차함수 요약

※ 람다식 (Lambda Expression) - 구성 { 매개변수[,...] -> 람다식 본문 } 람다식은 항상 중괄호로 묶여 있고 중괄호 내의 매개변수는 화살표 표기법 좌측에 배치되고 우측은 식을 구성한다.\ 매개변수가 한 개인 경우엔 매개변수를 생략하고 it으로 표기할 수 있다. val sum: (Int, Int) -> Int = { x, y -> x + y } val mul = { x: Int, y: Int -> x * y } val add: (Int) -> Int = { it + 1 } ※ 고차 함수(Higher-Order Function) - 함수의 매개변수로 함수를 받거나 함수 자체를 반환할 수 있는 함수 fun high (name: String, body: (Int)->Int): Int {..

[TIL] Kotlin - 예외 발생

※ 예외 처리 예외(exception) - 실행 도중 잠재적인 오류까지 검사할 수 없기에 정상적으로 실행이 되다 비정상적으로 종료되는 경우 - 운영체제 문제 (잘못된 시스템 호출 문제) - 입력값 문제 (존재하지 않는 파일/숫자 입력란에 문자 입력 등) - 받아들일 수 없는 연산 (0으로 나누기) - 메모리 할당 실패 및 부족 - 컴퓨터 자체의 문제 (전원 문제, 기억 장치의 오류) 예외 대비 구문 try { 예외 발생 가능성 있는 문장 }catch (e: 예외처리 클래스명) { 예외를 처리하기 위한 문장 }finally { 반드시 실행되어야 하는 문장 } 반드시 실행해야 할 작업이 없는 경우는 finally 블록은 생략하고 try~catch 블록만 작성하여 구성하여도 된다. 즉, finally 블록은 ..