Uknow's Lab.
article thumbnail
[코파기 3부] 10. 코틀린과 꼬리재귀와 tailrec

꼬리재귀 (Tail Recursion)? 재귀함수는 함수가 자기 자신을 호출하는 함수를 의미합니다. 그 중에서도 꼬리재귀(Tail Recursion)는 재귀 함수 종류 중에서도 재귀 함수의 마지막 부분에서 자기 자신을 호출하는 재귀 함수를 의미합니다. 재귀함수의 대표적인 예시 중 하나인 팩토리얼을 갖고와봤습니다. 위 코드 같은 경우는 자기 자신을 호출하는 부분이 함수의 맨 마지막 줄이 n * fact(n-1)로, n을 곱하는 추가적인 연산이 있습니다. 마지막 줄에 n을 곱해주는 연산을 없애기 위해 인자를 하나 더 늘려 재귀 호출이 함수의 마지막 부분인 꼬리 재귀 형태로 만들었습니다. 재귀함수의 문제점? 재귀 함수는 간결하게 짤 수 있어 DFS 등에서 저도 애용하나, 몇 가지 문제점이 있습니다. 1. 때때..

article thumbnail
[코파기 3부] 9. 코틀린과 컬렉션 프레임워크 (3) : 컬렉션 + 람다식

컬렉션과 람다식 코틀린에서 정말 편했던 기능 중 하나인 컬렉션 + 람다식입니다. 자바와 마찬가지로, 코틀린은 배열, 리스트, 집합, Map 등에 sum, avg, sort, max, min, reverse, contain 등 여러 메소드를 지원합니다. (자료구조와 타입 따라 지원되는 메소드는 조금씩 다릅니다.) 그 중, 코틀린에서는 위 메소드들에 람다식을 사용한 여러 편의기능을 제공하는데요. 대표적인 몇 가지의 기능들을 알아보겠습니다. 아래 메소드들은 대부분 List, Set, Map등 컬렉션 뿐만 아닌 배열에서도 사용이 가능합니다. forEach, forEachIndex val arr = arrayOf(10, 20, 123, 64, 12) arr.forEach { println(it) } // 출력 1..

article thumbnail
[코파기 3부] 8. 코틀린과 컬렉션 프레임워크 (2) : Map

Map 자료구조 Map은 Key, Value(키 - 값)를 정의할 때 쓰이는 자료구조입니다. 파이썬의 딕셔너리, JSON을 떠올리면 쉬울 텐데요. Key를 통해 Value에 접근하거나 검색, 수정, 삭제 등 접근을 할 수 있으며, Key를 통해 접근하므로, Key는 중복이 불가능하며, Value는 중복이 가능합니다. Map 사용법 fun main() { val map = mapOf("키1" to "값1", "키2" to "값2", "키3" to "값3") map["키1"] = "값2" // 에러 발생 val map2 = mutableMapOf("키1" to "값1", "키2" to "값2", "키3" to "값3") map2["키1"] = "값2" // 가능 // MapOf로 생성 시, 자료형 생략 가능..

article thumbnail
[코파기 3부] 7. 코틀린과 컬렉션 프레임워크 (1) : Set

코틀린에서는 자주 사용하는 자료구조들을 모아 정의해놓은 컬렉션 프레임워크(Collection Framework)를 지원합니다. 자바 프로그래머들에겐 굉장히 익숙한 녀석이죠? 처음 들어보시나요? 사실 이 시리즈를 따라오신 분들이라면 이미 사용해본 경험이 있으실 겁니다. List, ArrayList, LinkedList 등의 List도 컬렉션 프레임워크의 일종이거든요. List는 이미 한 번 다뤄봤으니, 컬렉션 삼형제의 다른 녀석들인 Set과 Map을 한 번 볼까요? 집합 (Set) Set은 집합입니다. 수학시간때 배운 기억을 더듬더듬 꺼내봅시다… 집합은 일반적으로 중복을 허용하지 않으며, 순서가 없습니다. List의 경우, 중복을 허용하며 순서 역시 유의미한데 비해, Set의 경우는 집합이며, 중복을 허용..

article thumbnail
[코파기 3부] 6. 코틀린과 함수형 프로그래밍 (2) : 람다식

익명 함수 (Anonymous Functions) 익명 함수란, 이름처럼 익명, 즉 이름을 가지지 않는 함수를 의미합니다. // 익명함수 val sum = fun(x: Int, y: Int): Int { return x + y } fun main() { println(sum(1, 2)) } // 출력 >>> 3 익명함수는 위와 같이 이름없이 정의되는 함수입니다. 앞서 (1)편에서 언급했듯이, 함수는 일급객체이기 때문에 변수에 할당이 가능합니다. 자바스크립트에서 많이 본 형태이죠? 저는 JS를 별로 안다뤄본 탓에 익숙해지는데 조금 걸렸습니다. fun main() { val testP2 = ::testPrintln testP2() } fun testPrintln() { println("Hello World!..

article thumbnail
[코파기 3부] 5. 코틀린과 함수형 프로그래밍 (1) : 함수형 프로그래밍이란?

함수형 프로그래밍 (Functional Programming) 함수형 프로그래밍이란? 데이터 처리를 위해 수학적 함수의 계산으로 취급하고, 가변 데이터를 멀리하며 부수효과를 줄인 일종의 프로그래밍 패러다임이다. 이러한 함수형 프로그래밍은 무엇을 하는지 선언하는 형식에 가깝다 하여 선언형 프로그래밍이라고도 합니다. 기존의 절차적/객체지향 프로그래밍은 무엇을 할 지 명령한다 하여 명령형 프로그래밍이라고 하죠. 함수형 프로그래밍은 과정보다는 결과를, 어떻게(How) 할 지 보다는, 무엇(What)을 할 지에 포커스를 둡니다. 최신의 언어들 (Scala, Swift, Python)은 함수형 프로그래밍을 지원하며, Kotlin 역시 함수형 프로그래밍을 지원합니다. 자바는 자바 8버전부터 함수형 프로그래밍을 지원하..

article thumbnail
[코파기 3부] 4. 코틀린과 스코프 함수 : apply, run, with, also, let

스코프 함수 (Scope Function) 스코프 함수(Scope Function)란, 객체의 컨텍스트 내에서 코드 블록을 실행하는 것이 유일한 목적인 여러 함수들 입니다. 개체에서 스코프 함수를 호출하면 람다식으로 임시 범위(스코프)가 형성되며, 이 범위에서는 개체 이름 없이 개체에 액세스할 수 있습니다. 스코프 함수의 종류에는 let, run, with, apply, also가 있습니다. 무슨 말인지 잘 모르겠죠? 사실 저도 첫 문단을 어떻게 작성해야 하나 고민하다가, The Kotlin standard library contains several functions whose sole purpose is to execute a block of code within the context of an ob..

article thumbnail
[코파기 3부] 3. 코틀린과 예외처리 : try - catch, finally

오류(Error) 오류는 프로그래밍을 하다 보면 정말 수도 없이 마주칩니다. 예기치 못한 동작을 하거나, 의도하지 않게 동작하거나, 심지어 프로그램이 아에 종료될 수도 있습니다. 대표적인 오류 상황이 뭐가 있을까요? 길이가 3인 배열의 10번째 원소를 접근한다면? fun main() { val arr = arrayOf(1, 2, 3) arr[10] = 12345 } // 에러 메시지 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3 at PracticeKt.main(Practice.kt:7) at PracticeKt.main(Practice.kt) 길이가 3인 배열이지..

article thumbnail
[코파기 3부] 2. 코틀린과 infix 함수

Infix? infix... 뭔가 많이 들어본 단어죠? prefix, infix, postfix... 전위 표기법, 중위 표기법, 후위 표기법을 떠올리셨나요? 아주 훌륭합니다! A + B라는 식을 표기할 때, prefix -> +AB infix -> A+B postifx -> AB+ 와 같이, 연산자와 피연산자의 위치에 따라 전위(prefix), 중위 (infix), 후위 (postfix)로 나눕니다. 우리가 일상생활에서 자주 쓰는 표기법은 중위(infix)죠? 연산자가 중간에 오는 infix와 같이, infix 함수는 두 피연산자 사이 함수가 들어가는 형태입니다. infix 함수 정의 infix fun Int.plus(n: Int): Int { return this + n } fun main() { p..

article thumbnail
[코파기 3부] 1. 코틀린과 확장함수 (Extension Functions)

코파기 3부는 기초편에서 다루지 않는 코틀린의 요소들을 다룰 생각입니다. 딱히 별 마무리 짓지 않고 생각나는 대로 계속 추가할 것 같네요. 코틀린과 확장함수 (Extension Functions) 확장함수(Extension Functions)이란, 클래스에 새 매소드를 추가하는 기능입니다. 엥? 그거 걍 클래스 안에 새 메소드 넣으면 되는거 아니에요? 맞습니다. 본인이 만든 클래스라면 굳이 확장함수를 쓸 이유 없이 클래스 내 메소드를 정의하면 됩니다. 하지만, 코틀린 표준 라이브러리라면? 서드 파티 라이브러리라면? 클래스 내 새 메소드를 추가하는 건 그닥 쉬운 일이 아닙니다. 코틀린의 표준 라이브러리중 하나인 String은 많은 메소드를 지원합니다. 그리고, 저는 여기에 String 내 대문자가 몇개인지..