KotlinInAction 46

클래스 계층 정의

코틀린 인터페이스 자바 8 인터페이스와 비슷하다 interface Clickable { fun click() } click이라는 추상 메서드가 있는 인터페이스를 정의한다. 구현 클래스 : Button class Button : Clickable { override fun click() { println("I was clicked") } } fun main(args: Array) { Button().click() } 자바에서는 extends와 implement 키워드를 사용하지만 코틀린에서는 클래스 이름 뒤에 콜론(":")을 붙이고, 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현 모두 처리한다. 자바와 마찬가지로 클래스는 인터페이스를 원하는 만큼 개수 제한 없이 구현 가능하지만 클래..

로컬 함수와 확장

자바에서는 메서드를 분리하기 쉽지 않다 너무 많이 나눠서 분리하게 되면 각 메서드 사이의 관계가 파악하기 어려워져 코드가 어려워진다. -> 내부 클래스로 어느 정도 해결되지만 이것도 부가적인 코드가 늘어난다 코틀린에서는 함수에서 추출한 함수를 원 함수 내부에 중첩시킬 수 있다. class User(val id: Int, val name: String, val address: String) { } fun saveUser(user: User){ if(user.name.isEmpty()){ throw IllegalArgumentException("Can't save user ${user.id} : empty name") } if(user.address.isEmpty()){ throw IllegalArgumen..

문자열과 정규식 다루기

코틀린 문자열은 자바 문자열과 같다 코틀린 코드가 만들어낸 문자열을 아무 자바 메서드에 넘겨도 되며, 자바 코드에서 받은 문자열을 아무 코틀린 표준 라이브러리 함수에 전달해도 문제없다. 코틀린은 다양한 확장 함수를 제공함으로써 표준 자바 문자열을 더 즐겁게 다루게 해 준다 또한 혼동이 될 수 있는 일부 메서드에 대해 명확한 확장 함수를 제공함으로써 프로그래머의 실수를 줄여준다 문자열 나누기 자바의 split함수는 배열을 반환하고, 파라미터로 정규식을 받는다. fun main(args: Array) { println("12.345-6.A".split("\\.|-".toRegex())) println("12.345-6.A".split(".", "-")) } 코틀린은 자바의 split대신 여러 가지 다른 조합..

컬렉션 처리

vararg 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다 중위 함수 호출 구문을 사용하면 인자가 하나뿐인 메서드를 간편하게 호출할 수 있다. 구조 분해 선언을 사용하면 복합적인 값을 분해해서 여러 변수에 나눠 담을 수 있다. 자바 컬렉션 API 확장 fun main(args: Array) { val strings: List = listOf("first", "second", "fourteenth") strings.last() val numbers: Collection = setOf(1, 14, 2) numbers.max() } 어떻게 자바 라이브러리 클래스의 인스턴스인 컬렉션에 대해 코틀린이 새로운 기능을 추가할 수 있었을까? last() , max() 모두 확장 함수이기..

확장 함수와 확장 프로퍼티

기존 코드와 코틀린 코드를 자연스럽게 통합하는 것은 코틀린의 핵심 목표 중 하나이다 완전히 코틀린만으로 이루어진 프로젝트 조차도 JDK나, 안드로이드 프레임워크 또는 다른 서드파티 프레임워크 등의 자바 라이브러리를 기반으로 만들어진다. 코틀린을 기존 자바 프로젝트에 통합하는 경우에는 직접 변환할 수 없거나 미처 변환하지 않은 기존 자바 코드를 처리할 수 있어야 한다 확장 함수 fun String.lastChar(): Char = this.get(this.length - 1) //fun String.lastChar(): Char = get(length - 1) //this 생략 fun main(args: Array) { println("Kotlin".lastChar()) } 확장 함수를 만들려면 추가하려는..

함수를 호출하기 쉽게 만들기

fun main(args: Array) { val list = listOf(1, 2, 3) println(list) //[1,2,3] } 컬렉션에는 toString이 구현이 되어있다 디폴트 toString이 아닌 다른 toString을 쓰고 싶다면 어떻게 해야 할까 자바에서는 구아바나 아파치 커먼즈 같은 서드파티 프로젝트를 추가하거나 직접 관련 로직을 구현해야 한다. 코틀린에서는 이런 요구사항을 해결할 수 있는 함수가 표준 라이브러리에 존재한다. fun main(args: Array) { val list = listOf(1, 2, 3) println(joinToString(list, "; ", "(", ")")) } fun joinToString( collection: Collection, separat..

코틀린에서 컬랙션 만들기

fun main(args: Array) { val set = hashSetOf(1, 7, 53) val list = arrayListOf(1, 7, 53) val map = hashMapOf(1 to "One", 7 to "Seven", 53 to "fifty-three") println(set.javaClass) println(list.javaClass) println(map.javaClass) } to는 언어가 제공하는 특별한 키워드가 아닌 일반 함수이다. 코틀린이 자신만을 컬렉션 기능을 제공하는 것이 아닌 자바의 컬렉션을 반환한다. 기존 자바 컬렉션을 그대로 이용 가능 표준 자바 컬렉션을 활용하므로 자바 코드와 상호작용 하기가 훨씬 더 쉽다 자바에서 코틀린 함수를 호출하거나 코틀린에서 자바 함수를 ..

코틀린의 예외 처리

함수는 정상적으로 종료할 수 있지만 오류가 발생하면 예외를 던질 수 있다. 함수를 호출하는 쪽에서는 그 예외를 잡아 처리할 수 있다. 발생한 예외를 함수 호출 단에서 처리하지 않으면 함수 호출 스택을 거슬러 올라가면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던진다. throw를 생성할 때에도 마찬가지로 new를 붙이지 않는다. try, catch, finally fun readNumber(reader: BufferedReader) : Int? { try { val line = reader.readLine() return Integer.parseInt(line) }catch (e: java.lang.NumberFormatException){ return null }finally { reader.c..

While과 for 루프

while 같은 경우 JAVA와 동일하고, for 같은 경우 for 아이템 in 원소들 형태를 취한다. while while(조건){ //문장 } do { //문장 } while(조건) 수에 대한 이터레이션 : 범위와 수열 코틀린에서는 초깃값, 증가값, 최종 값 루프가 없기 때문에 범위를 사용한다. 범위는 기본적으로 두 값으로 이뤄진 구간이며, 보통 그 두 값은 정수 등의 숫자 타입의 값이며 (..) 연산자로 시작 값과 끝 값을 연결해서 범위를 만든다 val oneToTen = 1..10 코틀린에서 범위는 폐구간 또는 양끝을 포함하는 구간이다 위 예에서 항상 10은 포함이 되있다는 의미 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우를 수열이라고 한다. fun fizzBuzz(i: Int) =..

enum과 when

Enum enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET } Enum은 자바 선언보다 코틀린 선언에 더 많은 키워드를 써야 한다 코틀린에서는 enum class를 사용한다. 코틀린에서 enum은 소프트 키워드 라 부른다. enum은 class 앞에 있을 때는 특별한 의미를 지니지만 다른 곳에서는 이름에 사용할 수 있다. Enum 클래스 안에 프로퍼티와 메서드 쓰기 enum class Color(var r: Int, val g: Int, val b: Int) { RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255), INDI..