목록Kotlin in Action (11)
Jisoo’s devlog

DSL(영역 특화 언어 Domain Specific Language)을 사용해서 표현력 좋고 코틀린다운 API를 설계하는 방법 코틀린 DSL 설계는 코틀린 언어의 여러 특성을 활용한다. 1. 수신 객체 지정 람다 - 코드 블록에서 변수가 가리키는 대상을 결저앟는 방식 변경 가능 2. invoke 관례 - DSL 코드 안에서 람다와 프로퍼티를 유연하게 대입 가능 API에서 DSL로 목표: 코드의 가독성과 유지 보수성 향상 -> 인터페이스, 클래스의 API를 살펴봐야 한다 => 모든 개발자는 클래스 간의 상호작용을 이해하기 쉽고 명확하게 표현할 수 있어야 한다. 깔끔한 API를 작성할 수 있게 돕는 코틀린 기능 -> 확장 함수, 중위 함수 호출, 람다 구문에 사용할 수 있는 it 등의 문법적 편의, 연산자 ..

애노테이션과 리플렉션을 사용하면 소스코드에서 함수와 클래스 이름을 알지 못해도 임의의 클래스를 다룰 수 있다. 애노테이션 선언과 적용 애노테이션 적용 애노테이션을 적용할 때는 @과 애노테이션 이름을 입력하면 된다. ex_제이유닛 프레임워크(http://junit.org/junit4/) -> @Test 애노테이션 붙이기 @Deprecated 애노테이션 : replaceWith 파라미터를 사용하는 패턴 @Deprecated("Use removeAt(index) instead.", ReplaceWith("removeAt(index)")) fun remove(index: Int) { ... } ㄴ 애노테이션에 인자를 넘길 때는 일반 함수처럼 괄호 안에 인자를 넣는다. [애노테이션 인자를 지정하는 문법] 애노테이..

제네릭 타입 파라미터 제네릭스를 사용하면 타입 파라미터를 사용하는 타입을 정의할 수 있다. 타입 파라미터를 사용하면 구체적으로 원하는 타입을 정의할 수 있다. 코틀린에서는 타입 인자도 추론할 수 있다. val authors = listOf("Dmitry", "Svetlana") 두 값이 문자열이기 때문에 컴파일러는 여기서 생기는 리스트가 문자열을 담는 리스트라는 것을 추론할 수 있다. 만약 빈 리스트를 만든다고 하면 타입 인자를 추론할 수 없기 때문에 직접 변수의 타입 또는 타입 인자를 지정해야 한다. val readers: MutableList = mutableListOf() val readers = mutableListOf() ㄴ 이 두 선언은 동등하다. 제네릭 함수와 프로퍼티 제네릭 함수는 모든 리..

고차 함수 정의 고차 함수 : 다른 함수를 인자로 받거나 함수를 반환하는 함수 => 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 함수 타입 람다를 인자로 받는 함수를 정의하려면 -> 람다 인자의 타입을 어떻게 선언? =>변수 타입을 지정하지 않아도 람다를 변수에 대입할 수 있기 때문에 함수 타입 정의: 함수 파라미터의 타입을 괄호 안에 넣고, 그 뒤에 화살표(->) 추가, 함수의 반환 타입 지정. => 변수 타입을 함수 타입으로 지정하면 -> 파라미터로부터 람다의 파라미터 타입을 유추할 수 있다. 인자로 받은 함수 호출 //인자로 받은 함수를 호출 fun twoAndThree(operation: (Int, Int) -> Int) { val result = operation(2,..

산술 연산자 오버로딩 자바에서는 원시 타입에 대해서만 산술 연산자를 사용하거나 String에 대해 +연산자를 사용할 수 있다. 코틀린은 이외의 클래스에서도 산술 연산자를 사용하는 것을 허용하고 있다. 어떻게 클래스에 대해 일반 산술 연산자를 정의할 수 있을까. 이항 산술 연산 오버로딩 Point 클래스에서 두 점을 더하는 연산. x 좌표와 y 좌표를 각각 더한다. data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } } >>> val p1 = Point(10, 20) >>> val p2 = Point(30, 40) >>> println(..

널 가능성 널이 될 수 있는 타입 코틀린은 널이 될 수 있는 타입을 명시적으로 지원한다는 점이 특징이다. 널이 될 수 있는 타입 == 프로퍼티나 변수에 null을 허용 null을 허용하는 인자를 받을 수 있게 하려면 타입 이름 뒤에 ?를 명시한다. String은 문자열만 인자로 받을 수 있는 타입이지만, Sring? 은 null 또는 문자열을 인자로 받을 수 있는 타입이 된다는 것이다. fun strLenSafe(s: String?): Int = if (s != null) s.length else 0 >>> val x: String? = null >>> println(strLenSafe(x)) 0 >>> println(strLenSafe("abc")) 3 타입의 의미 자바의 타입 시스템은 null을 잘 ..

람다 식? 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다. 람다 식과 멤버 참조 람다 소개: 코드 블록을 하수 인자로 넘기기 람다식을 사용하면 함수를 선언할 필요가 없고 코드 블록을 직접 함수의 인자로 전달할 수 있다. 코드가 더욱 간결해지는 것이다. 자바에서 무명 내부 클래스로 리스너를 구현하는 코드이다. /* Java */ button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { /* 클릭 시 수행할 동작 */ } }); 아래는 코틀린에서 람다로 리스너를 구현하는 코드이다. button.setOnClickListener { /* 클릭 시 수행할 동작 */ } 람다와 컬렉션 자바..

클래스 계층 정의 코틀린 인터페이스 코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다. interface Clickable { fun click() } 이 인터페이스는 구현되어 있지 않은 click() 추상 메서드를 정의한다. 이 인터페이스를 구현하는클래스는 click()에 대한 구현을 해야한다. class Button : Clickable { override fun click() = println("I was clicked") } >>> Button().click() I was clicked 코틀린에서는 [ 클래스 이름 : 인터페이스와 클래스 이름 ] 으로 클래스를 확장하고 인터페이스를 구현한다. 인터페이스 구현은 한 번에 여러 개 가능하지만 클래스 확장은 한 번에 하..

코틀린에서 컬렉션 만들기 코틀린은 자체 컬렉션이 없고 표준 자바 컬렉션을 사용한다. 표준 자바 컬렉션을 사용하는 것이 자바 코드와 상호작용하기가 더 수월하기 때문이다. 코틀린 컬렉션이 자바 컬렉션과 완전히 동일하지만 코틀린에서는 더 많이 활용할 수 있다. 예를 들어, 리스트의 마지막 요소를 찾거나(last) 숫자들 사이에서 최댓값(max)을 찾을 수 있다. (자바에서는 못하나봄?) >>> val strings = listOf("first", "second", "fourteenth") >>> println(strings.last()) fourteenth >>> val numbers = setOf(1, 14, 2) >>> println(numbers.max()) 14 함수를 쉽게 호출 내용을 출력 : 아주 ..

기본 구성 요소: 함수와 변수 fun main(args: Array) { println("Hello, world!") } 위 짧은 예시에서: 1. fun 키워드는 함수 선언을 할 때 사용된다. 2. 매개 변수 타입은 이름 뒤에 선언된다. 3. 함수는 파일의 최상위 수준에 선언된다. 4. 배열은 일반적인 클래스이다. 자바와 다르게 코틀린은 배열 타입을 선언하기 위한 문법이 존재하지 않는다. 5. System.out.println 대신 println이라고 쓴다. 6. 줄 끝에 세미콜론(;)을 붙이지 않아도 된다. 함수 fun max(a: Int, b: Int): Int { return if (a > b) a else b } >>> println(max(1, 2)) 2 이 코드는 더욱 간단해질 수 있다. fu..