Book/Kotlin in Action
-
Kotlin in Action : ch 11. DSL 만들기Book/Kotlin in Action 2023. 1. 25. 18:51
11. DSL 만들기 DSL은 영역 특화 언어(Domain-Specific Language)를 의미한다. 즉, 특정 도메인에 특화된 언어이다. "문제 영역의 해결에는 그 영역의 언어를 전제로 둬야하며, 거기에서 프로그래밍 솔루션을 꺼내는 것이 중요하다" 라고 말한 Dave Thomas가 한 말을 생각하면 이해하기 쉽다. 특정 언어의 문제 해결에는 그 영역에 맞는 특화된 도구를 사용하자라는 것이다. 아래에 DSL에 대해 더 자세히 나오니 지금은 이정도만 알고 넘어가자. 코틀린의 DSL 설계는 코틀린 언어의 여러 특성을 활용한다. 그 중 두가지 특성을 살펴보면 수신 객체 지정 람다 수신 객체 지정 람다를 사용하면 코드 블록에서 이름(변수)가 가리키는 대상을 정할 수 있었다. 이러한 방식을 변경해서 DSL 구..
-
Kotlin in Action: ch 10. 애노테이션과 리플렉션Book/Kotlin in Action 2023. 1. 20. 09:23
어떤 함수를 호출하려면 그 함수가 정의된 클래스의 이름과 함수 이름, 파라미터 이름 등을 알아야만 했다. 애노테이션과 리플렉션을 사용하면 그런 제약을 벗어나서 미리 알지 못하는 임의의 클래스를 다룰 수 있다. 애노테이션을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있고, 리플렉션을 사용하면 실행 시점에 컴파일러 내부 구조를 분석할 수 있다. 10.1 애노테이션 선언과 적용 애노테이션을 사용하면 추가 메타데이터를 선언과 연결할 수 있다. 메타데이터는 애노테이션 구성 방식에 따라 소스 코드, 컴파일된 클래스 파일 또는 런타임 시 작업하는 도구에서 액세스할 수 있다. 메타데이터란 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알..
-
Kotlin in Action: ch 9. 제네릭스Book/Kotlin in Action 2023. 1. 11. 23:21
Generics(제네릭스) Generics를 사용하면 타입 파라미터(type parameter)를 받는 타입을 정의할 수 있다. 제네릭 타입의 인스턴스를 만들려면 타입 파라미터를 구체적인 타입 인자(type argument)로 치환해야 한다. 예를 들어 List라는 타입이 있다면 그 안에 들어가는 원소의 타입을 안다면 쓸모가 있을 것이다. 타입 파라미터를 사용하면 “이 변수는 리스트다”라고 말하는 대신 정확하게 “이 변수는 문자열을 담는 리스트다”라고 말할 수 있다. 자바와 달리 코틀린에서는 제네릭 타입의 타입 인자(type argument)를 프로그래머가 명시하거나 컴파일러가 추론할 수 있어야 한다. 자바는 맨 처음에 제네릭 지원이 없었고 자바 1.5에 뒤늦게 제네릭을 도입했기 때문에 이전 버전과 호환..
-
Kotlin in Action: ch 8. 고차 함수: 파라미터 반환 값으로 람다 사용(2)Book/Kotlin in Action 2023. 1. 11. 08:43
8.2 인라인 함수: 람다의 부가 비용 없애기 inline 변경자를 어떤 함수에 붙이면 컴파일러는 그 함수를 호출하는 모든 문장을 함수 본문에 해당하는 바이트코드로 바꿔준다. 무의미한 객체 생성 예방 인라인 함수를 사용하면 람다식을 사용했을 때 무의미하게 객체가 생성되는 것을 막을 수 있다. fun nonInlined(block: () -> Unit) { block() } fun doSomething() { nonInlined { println("do something") } } nonInlined라는 함수는 고차 함수로 함수 타입을 인자로 받고 있다. 그리고 doSomething()은 noInlined 함수를 호출하는 함수이다. 이러한 코드를 자바로 표현한다면 아래와 같다. public void non..
-
Koltin in Action: ch 8. 고차 함수 : 파라미터와 반환 값으로 람다 사용 (1)Book/Kotlin in Action 2023. 1. 8. 23:59
8.1 고차 함수 정의 고차 함수란? 고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 따라서 고차 함수는 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수이다. 함수 타입 함수 타입을 정의하려면 함수 파라미터의 타입을 괄호 안에 넣고, 그 뒤에 화살표(->)를 추가한 다음, 함수의 반환 타입을 지정하면 된다. Unit 타입은 의미 있는 값을 반환하지 않는 함수 반환 타입에 쓰는 특별한 타입이다. 그냥 함수를 정의한다면 함수의 파라미터 목록 뒤에 오는 Unit 변환 타입 지정을 생략해도 되지만 함수 타입을 선언할 때는 반환 타입을 반드시 명시해야하므로 Unit을 빼먹어서는 안된다. 예를 들기..
-
Kotlin in Action: 7.4-7.5 구조 분해 선언과 component 함수, 프로퍼티 접근자 로직 재활용: 위임 프로퍼티Book/Kotlin in Action 2023. 1. 6. 14:05
7.4 구조 분해 선언과 component 함수 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화 할 수 있다. data class Point(val x: Int, val y: Int) fun main(args: Array) { val p = Point(10, 20) val (x, y) = p println(x) println(y) } 구조 분해 선언은 = 의 좌변에 여러 변수를 괄호로 묶어 사용한다. 내부에서 구조 분해 선언은 다시 관례를 사용한다. 각 변수를 초기화하기 위해 componentsN 이라는 함수를 호출한다. 여기서 N 은 구조 분해 선언에 있는 변수 위치에 따라 붙는 번호다. data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 컴파일러가 자동으로 com..
-
Kotlin in Action: 7.2-7.3 비교 연산자 오버로딩, 컬랙션과 범위에 대해 쓸 수 있는 관례Book/Kotlin in Action 2023. 1. 6. 13:40
7. 2 비교 연산자 오버로딩 동등성 연산자 : equals 코틀린에서는 모든 객체에 대해 비교 연산을 수행하는 경우 equals나 compareTo를 호출해야하는 자바와 달리 "==" 비교 연산자를 직접 사용할 수 있어서 비교하는 코드가 더 간결하며 이해하기 쉽다. 코틀린은 "=="연산자 호출을 equals()로 컴파일하며, "!="역시 equals()를 사용하여 결과 값을 not 처리하는 식으로 동작한다. a==b라는 코드는 실제로 내부에서 인자의 null 체크를 하므로 다른 연산자와 달리 null이 될 수 있는 값(nullable)에도 적용할 수 있다. 동등성 검사 ==는 equals 호출과 null 체크로 컴파일된다. 실제 내부 코드는 아래와 같이 구현되어 있다. 이 경우 a가 null인지 판단해..
-
Kotlin in Action: 7.1 산술 연산자 오버로딩Book/Kotlin in Action 2023. 1. 6. 12:59
7. 1 산술 연산자 오버로딩 오버로딩 : 한 클래스내에 같은 이름의 메서드를 여러개 정의 하는 것 코틀린에서는 특정 연산자의 역할을 함수로 정의할 수 있다. 이를 Convention(관례)이라고 한다. 가장 기본적인 예로는 산술 연산자가 있다. 자바에서는 원시 타입(primitive)에 대해서만 산술 연산자를 사용할 수 있고, 추가로 String에 대해 "+" 연산자를 사용할 수 있다. 이항 산술 연산 오버로딩 코틀린에서는 +, - 같은 산술 연산자를 오버로딩해서 사용할 수 있다. 객체끼리 더하거나 뺄 때, 원하는 동작을 함수 안에 구현하면 연산자를 통해 이를 표현할 수 있다. data class Point(val x: Int, val y: Int) { operator fun plus(other: Po..