본문 바로가기

Kotlin 공부(kotlin in action)11

2023 02 04 코틀린 공부 DSL DSL (Domain Specific Language) : 영역 특화 언어 - 가장 익숙한 DSL은 SQL과 정규식 등이다. 보통의 범용 프로그래밍 언어와 달리 선언적이며 원하는 결과를 기술하기만 하고 과정은 언어를 해석하는 엔진이 한다. 장점으로는 전체 과정을 한꺼번에 최적화하기 때문에 범용 프로그래밍언어와 달리 더 효율적일 수 있다. 단점은 DSL을 범용 언어로 만든 호스트 애플리케이션과 조합하기 어렵다. DSL의 자체 문법이 있어 다른 언어의 프로그램 안에 직접 포함시킬 수 없고 별도의 파일이나 문자열로 저장해야 한다. 또한 컴파일 시점에서 제대로 검증하거나 디버깅하거나 IDE를 제공하기 어려워진다. 독립적인 문법을 가진 외부DSL과 달리 내부DSL은 범용 프로그램의 일부로 동일한 문법을 사용한다... 2023. 2. 4.
2023 01 18 코틀린 공부 - 애노테이션과 리플렉션-2 KClass에서 클래스의 모든 함수와 프로퍼티는 KCallable의 인스턴스의 컬렉션 형식이다. KCallable은 함수와 프로퍼트 모두를 포함하는 공통 상위 인터페이스이다. 함수를 호출 할 때는 ::함수이름 의 경우 .invoke()를 통해서 인자를 넘기면 함수가 실행된다. 이때 KFunction의 invoke를 호출하는것이다. fun foo(x: Int) = println(x) val kFun = ::foo kFun.invoke(30) fun sum(x: Int, y: Int) = x+y val kF2 : KFunction2 = ::sum println(kF2.invoke(3,7)) 멤버 프로퍼티또한 KProperty로 get, set 메서드를 사용할 수 있다. 아래의 코드의 경우 kPro에 프로퍼티.. 2023. 1. 18.
2023 01 17 코틀린 공부 - 애노테이션과 리플렉션-1 10장 애노테이션과 리플렉션 어떤 함수를 호출할 때 함수의 이름, 파라미터등을 알아야했으나 애노테이션과 리플렉션을 사용하면 그런 제약을 벗어날 수 있다. 애노테이션을 적용하는 방법은 적용하려는 대상 앞에 붙이면 된다. @와 애노테이션 이름으로 이루어진다. JUnit의 테스트 메서드 앞에는 @Test를 붙여야 한다. 클래스를 애노테이션 인자로 지정할 때 @MyAnnotatioin(MyClass::class)처럼 클래스 이름 뒤에 ::class를 넣어야 한다. 다른 애노테이션을 인자로 지정할 때는 인자로 들어가는 애노테이션의 이름 앞에 @를 넣지 않아야 한다. 배열을 인자로 지정하려면 @RequestMapping(path = arrayOf(" ", "")처럼 arrayOf를 사용한다. 애노테이션 인자를 컴파.. 2023. 1. 17.
2023 01 16 코틀린 공부 - 제네릭 9장 제네릭스 제네릭 타입의 인스턴스에는 구체적인 타입 인자가 필요하다. 사용할 때 빈 제네릭을 만들 때 타입 인자를 추론할 근거가 없기 때문에 타입인자를 직접 명시해야 한다. 아래의 두 코드는 같은 의미이며 둘 모두 타입인자를 지정한 모습이다. val readers : MutableList = mutableListOf() val readers = mutableListOf() 모든 제네릭을 다룰 수 있는 함수인 제네릭 함수를 호출할 때 구체적인 타입으로 타입 인자를 넘겨야 한다. 아래의 코드의 경우 slice함수를 사용할 때 컴파일러가 타입 인자를 추론할 수 있으므로 타입인자를 지정하지 않아도 된다. val letters = ('a'..'z').toList() println(letters.slice(0... 2023. 1. 16.
2023 01 15 코틀린 공부 - 고차함수 8장 고차 함수 : 파라미터와 반환 값으로 람다 사용 고차함수는 다른 함수를 인자로 받거나 반환하는 함수이다. 코틀린에서 고차 함수는 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수를 의미한다. 람다로 함수를 만드는 방법은 {파라미터, 파라미터, .... -> 반환값}의 형태로 만든다. 아래의 코드를 보면 이해가 될 것이다. val sum: (Int, Int) -> Int = { x, y -> x + y } // val sum = {x:Int, y:Int -> x+y} 첫 줄 처럼 :를 사용해서 파라미터와 반환값의 타입을 지정해도 되고 마지막줄처럼 바로 사용해도 된다 고차함수는 (함수의 파라미터들...)-> 반환값 의 형태를 사용하여 함수를 받을 수 있다. 람다로 이러한 함수.. 2023. 1. 15.
2023 01 13 코틀린 공부 - 연산자 오버로딩과 기타 관계 7장 연산자 오버로딩과 기타 관례 관례의 가장 단순한 예는 산술연산자다. +,-,/,*,%등의 기본전인 연산자들이 있다. 어떤 함수가 관례를 따름을 나타내는 키워드로 함수 앞에 operator 키워드를 붙여야한다. 아래의 코드는 Point의 +연산자를 x, y좌표를 확장함수로 정의한 것이다. data class Point(var x: Int, var y: Int) operator fun Point.plus(other: Point): Point{ return Point(x+other.x,y+other.y) } 또한 +=, -=과 같은 복합대입연산자도 있다. 이들은 변경 가능한 컬렉션에 작용해 메모리에 있는 객체의 상태를 변화시킨다. 위의 연산들과 달리 한 값에만 적용하는 단한 연산자도 있다. ++, --가.. 2023. 1. 13.