kotlin 33

[TIL] Kotlin - 흐름의 중단과 반환 (2)

※ 람다식에서 라벨과 함께 return 사용 - 암묵적 라벨 ... inlineLambda(13, 3) { a, b -> .... .... if(result>10) return@inlineLambda .... } ※ 익명 함수를 사용한 반환 - 익명 함수 사용: 익명 함수는 fun (...) {...} 과 같은 형태로 이름 없이 특정 함수의 인자로 넣을 수 있으며 익명함수 내부에서 라벨을 사용하지 않고 단순히 return 만 사용하더라도 비지역 반환이 발생하지 않아 일반 함수의 반환처럼 편하게 사용이 가능하다. 람다식 방법은 다음 예시와 같이 사용이 가능하다. ... if(num !in 1...100) { return@lambda "Error" // 레이블을 통한 반환 } "Success" // 마지막 ..

Kotlin - 흐름의 중단과 반환

※ 흐름 제어 - 흐름 제어문 return : 함수에서 결과값을 반환하거나 지정된 라벨로 이동 break: for나 while의 조건식에 상관없이 반복문 끝냄 continue: for나 while의 반복문의 본문을 모두 수행하지 않고 다시 조건으로 넘어감 ※ return 사용 - return이용 값 반환하기 보통 return 문은 함수 등에서 값을 반환하는데 사용하지만 코드의 흐름을 중단하고 함수를 빠져나가기 위해서도 사용이 가능하다. 인라인(inline)으로 선언되지 않은 람다식 함수에서 return을 사용할 때는 그냥 사용할 수 없고 return@label 과 같이 라벨 표기와 함께 사용해야 한다. 라벨이란 코드에서 특정한 위치를 임의적으로 표시해, @ 기호를 뒤에 이름을 붙여 사용한다. fun ad..

[TIL] Kotlin - 반복문

※ for문 for (요소 변수 in 컬렉션 혹은 범위) { 반복할 본문 } - for문은 조건식에 따라 반복하게 되는데 대부분 in연산자와 컬렉션, 범위 연산자를 사용해 반복 조건을 구성한다. 범위 연산을 이용하는 경우는 기본적으로 상행 형태로 증가하고 감소하기 위해 downTo를 사용한다. ※ 하행, 상행 및 다양한 반복 방법 - 하행 반복 - downTo (5, 4, 3, 2, 1) 숫자가 하행으로 반복하며 변수 i 값을 출력하는 방식이다 for (i in 5 downTo 1) print(i) - 필요한 단계 증가 - step (1, 3, 5) 상행으로 반복하며 i값을 출력시키는 방식이지만 홀수의 계수만 사용해 계단식을 의미하는 step이 사용된다. for (i in 1..5 step 2) prin..

[TIL] Kotlin - 조건문 분기(2)

※ when문으로 다양한 조건 처리 - 인자를 사용하는 when문 when (인자) { 인자에 일치하는 값 혹은 표현식 -> 수행할 문장 인자에 일치하는 범위 -> 수행할 문장 ... else -> 문장 } - 일치되는 여러 조건 when (x) { 0, 1 -> print("x == 0 or x == 1") else -> print("기타") } - 함수의 반환값 사용하기 when (x) { parseInt(s) -> print("일치함!") else -> print('기타") } 인자를 사용하는 when문(Cont.) - in 연산자와 범위 지정자 사용 방식과 is 키워드 함께 사용하기 방식으로 조건 처리가 가능하다. 인자가 없는 when은 특정 인자에 제한하지 않고 다양한 조건을 구성할 수 있다는 ..

[TIL] Kotlin - 조건문 분기(1)

※ if문, if~else문 - if 문의 경우 조건식이 참인 경우에만 수행이 되고 - if~else문의 경우 또한 if에 맞는 조건은 참인 경우만 수행이 되고 else는 거짓인 경우만 수행이 된다 - 수행할 문장이 한줄로 간단히 구성할 수 있는 경우엔 중괄호를 없애고 한줄로 구성이 가능하다 예시는 다음과 같다 val max = if (a>b) a else b ※ else~if문으로 조건문 중첩하기 - 여러 조건을 중첩하여 적용하기 위해선 else if 문을 이용해 조건문을 중첩할 수 있다. 마지막을 else로 구성하여야 한다 val number = 0 val result = if (number > 0) "양수 값" else if (number < 0) "음수 값" else "0"

[TIL] Kotlin - 함수와 변수의 범위

※ 함수의 실행 블록 - 함수의 블록({ }) : 블록내에서 사용하는 변수로 지역 변수(Local variable)이라고도 함 - 함수의 범위(Scope) - 최상위 함수와 지역 함수 최상위 함수(top-level function)는 main() 함수 전, 후 어디든 선언하고 코드 내에서 호출이 가능하며 지역 함수는 먼저 선언되어야 그 함수를 호출할 수 있다는 것을 주의하여야 한다 ○ 전역 변수 - 최상위에 있는 변수로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지됨 - 여러 요소가 동시에 접근하는 경우 잘못된 동작 유발 가능 - 자주 사용되지 않는 전역변수는 메모리를 낭비함 ○ 지역 변수(local function) - 특정 코드 블록 내에서만 사용 - 블록 시작시 임시로 사용되며 주로 스택 메..

[TIL] Kotlin - 중위/꼬리재귀 함수

※ 중위 표현법(infix notation) - 클래스의 멤버 호출 시 사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 생략해 직관적인 이름이 사용가능한 표현 중위 함수의 조건 멤버 메소드 혹은 확장 함수여야 한다 하나의 매개변수를 가져야 한다 infix 키워드를 사용해 정의한다 ※ 꼬리 재귀(recursion) 함수 - 재귀? - 자기 자신을 다시 참조하는 것, 재귀 함수는 자기 자신을 계속 호출한다는 특징이 있다 스택에 계속 쌓이는 방식이 함수가 계속 씌워지는 꼬리를 무는 형태이며 코틀린 고유의 tailrec 키워드를 사용해 선언 또한, 코틀린에선 꼬리 재귀 함수를 통해 스택 오버플로 현상을 해결할 수 있는데 이는 스택에 계속 쌓이는 방식이 아닌 꼬리를 무는 형태로 반복이 된다. 이를 위해서 t..

[TIL] Kotlin - 인라인/확장 함수

※ 인라인 함수의 제한과 인라인 금지 - 인라인 함수의 단점: 코드가 복사되어 내용이 많은 함수에 사용할 경우 코드의 길이가 늘어난다 - noinline 키워드: 일부 람다식 함수를 인라인이 되지 않도록 하며 분기하여 호출이 된다 ○ 인라인 함수와 비지역 반환 - 코틀린은 익명 함수를 종료하기 위해 return을 사용할 수 있는데 특정 반환값 없이 return만 사용해야 한다 람다식 함수를 인자로 사용하는 함수는 의도치 않게 람다식 함수 밖에 있는 함수가 같이 반환이 되는데 이를 비지역 반환이라고 한다. 비지역 반환을 금지하려면 crossinline이라는 키워드를 람다식 함수 앞에 사용하여 함수의 본문 블록에서 return이 되는 것을 금지할 수 있다 ※ 확장 함수(extension function) -..

[TIL] Kotlin - 익명/인라인 함수

※ 익명 함수(anonymous functions) - 함수가 이름이 없는 것 [예시: fun (x: Int, y: Int): Int = x + y // 함수 이름이 생략된 익명 함수] - 일반 익명 함수에선 return, break, continue가 사용 가능하나 람다식에 적용하기는 어려움(라벨 표기법과 같이 사용해야 함) ※ 인라인(inline) 함수 - 함수가 호출되는 곳에 내용을 모두 복사, 함수의 분기 없이 처리하기 때문에 성능이 증가함 또한, 인라인 함수는 코드가 복사되어 들어가기 때문에 대개 내용이 짧게 작성이 되는데 인라인 함수는 람다식 매개변수를 가지고 있는 함수 형태를 권장함

[TIL] Kotlin - 람다식 이해(2)

※ 람다식 이해(2) - 매개변수 개수에 따라 람다식을 구성하는 법 매개변수가 없는 경우 fun main() { // 매개변수 없는 람다식 함수 npParam({ "Hello World!" }) noParam { "Hello World!" } // 위와 동일 결과, 소괄호 생략 가능 } // 매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨 fun noParam(out: () -> String) = println(out()) 매개변수가 한 개인 경우 fun main() { // 매개변수 없는 람다식 함수 // 매개변수가 하나 있는 람다식 함수 oneParam({ a -> "Hello World! $a" }) oneParam { a -> "Hello World! $a" } //..