Hello, Android!
DSL 본문
DSL(Domain Specific Languages) 이란
도메인 특화 언어로써 특정 애플리케이션, 특정 분야에 특화된 언어를 의미한다.
대표적으로 오로지 데이터베이스만을 다루며, DB에 접근하기 위한 SQL이 있다.
일반적인 프로그래밍 언어와 DSL의 차이점은 프로그래밍 언어와 비교하여 덜 복잡하다는 것이다.
대부분의 경우 DSL은 해당 DSL의 대상 분야에 전문적인 분들이 사용하도록 제작된다.
이런 DSL의 특성을 이용하여 화면 레이아웃을 단순화한 DSL, 웹 접근을 쉽게하는 DSL등 많은 프레임 워크가 있다.
기존에 제작되어있는 프레임 워크를 사용하는것도 가능하지만, 코틀린에서는 람다식 확장함수 등을 사용하면 DSL 형태의 언어를 만들 수 있다.
예를들어 위와 같이 도서정보를 관리하는 DSL을 만든다고 하자
위의 경우 book 클래스의 객체를 만드는것 같지만 변수명과 값만 존재하여 알기쉬운 DSL 형태이다
우선 Book의 데이터클래스와 Publisher의 데이터 클래스를 만든다
book 함수에서는 람다식을 매개변수로 받으며 Book클래스의 객체를 받으며, Book 객체를 생성하여 반환한다
publisher 함수 또한 람다식을 매개변수로 받으며 Publisher클래스의 객체를 받으며
Publisher 객체를 생성하여 Book의 publisher에 넣어준다
main에서 호출시 두 함수의 람다식의 매개변수는 하나밖에 없기때문에 it으로 접근이 가능하다
만약 it 대신 this를 사용하기 위해서는 람다식을 각각의 객체에서 받는 확장함수의 형태로 만들어야한다
함수의 매개변수에서 객체.() -> Unit 의 형태로 확장함수로 만들었다
이렇게 되면 함수 호출시 this를 사용한 접근이 가능하며, this는 생략이 가능하다
여기서 book함수와 publisher 두 함수가 하는 일을 보면, 객체를 만들어 어딘가에 넣어주는 작업이 전부이다
이런 경우 스코프함수를 사용하여 더욱 간단하게 축약이 가능하다
스코프 함수 apply를 활용하여 더욱 간략하게 줄였다
book함수는 Book의 객체를 만든 뒤 해당 객체를 apply의 block에 넘긴 다음 해당 객체를 반환하게 된다
리턴값이 존재하기때문에 '=' 을 활용하여 더욱 간략하게 줄이는것이 가능하다
publisher함수 또한 Publisher객체를 만든 뒤 apply의 block에 넘긴 다음
해당 객체를 publisher에 할당한다
이번에는 return으로 반환하는것이 아닌 할당만 하고 끝나기 때문에 '=' 을 활용하여 축약이 불가능하다
이와같이 코틀린에서 외부 프레임워크, 라이브러리를 통하여 DSL을 활용하는것도 가능하지만
코틀린의 람다식, 확장함수를 활용하여 간단하게 DSL을 만드는것이 가능하다
'Kotlin' 카테고리의 다른 글
I/O 입출력 (입력) (0) | 2020.08.16 |
---|---|
I/O 입출력 (출력) (0) | 2020.08.15 |
takeif() takeUnless() (0) | 2020.08.08 |
use함수 (0) | 2020.08.02 |
Scope Function with (0) | 2020.08.02 |