inflearn logo
강의

Course

Instructor

Kotlin Advanced

Lesson 18. Creating a Kotlin DSL Yourself

DSL 만들기

288

apples13099305

1 asked

0

안녕하세요 강사님. 내용을 몇번 더 봐야 더 잘 알겠지만

막히는 부분이 있어서 질문올립니다.

 

18강 내용중에서

service(name = "db") {
image { "mysql" }
env("USER").`is`("myuser")
env("PASSWORD").`is`("mypassword")
port(host = 9999, container = 3306)
}

 

env("USER").`is`("myuser") 이 DSL은 어떻게 만들수 있을지 감이 오지 않습니다. ㅜㅜ

kotlin 함수형-프로그래밍 객체지향

Answer 1

3

lannstark

안녕하세요 혜민님! 🙂 좋은 질문 감사드려요!!!

하나씩 설명 드려볼게요! 👍

 

먼저 env().`is`() 를 뜯어보면, env() 라는 함수를 호출한 이후, 곧 바로 is() 라는 함수를 연이어 호출한 모양입니다! 간단하죠?! 그럼 다음과 같이 코드를 작성할 수 있을거에요!

data class Environment(
  val key: String,
  val value: String?
) {
  fun `is`(value: String): Environment {
    this.value = value
    return this
  }
}

fun env(key: String): Environment() {
  return Environment(key, null)
}

여기서 is 라는 함수를 쓸 때 백틱 ` 을 붙이는 이유는, 코틀린에서 is 라는 별도의 예약어가 있기 때문입니다! 👍

 

위의 코드를 사용해보면요!

env("USER")

까지 했을 때 Environment 클래스가 USER 라는 문자열이 key에 들어가 생성되고

 

env("USER").`is`("PASSWORD")

is 라는 함수를 호출까지 하면, value에 "PASSWORD"라는 문자열이 들어간 후 최종적으로 Environment 클래스가 완성되게 됩니다!

 

물론 is 함수를 클래스 안에 넣으셔도 되고, 코틀린의 확장 함수를 사용하셔도 될 것 같아요~ 👍

 

이 DSL 이란 부분 자체가 코틀린의 문법을 요렇게 저렇게 막 돌려 활용하다 보니, 완성된 DSL만 봤을 때는 어렵게 느껴질 수 있어요! 🥺 이럴 때는 정말 단계별로 하나씩! 문법적인 내용과 코드를 함께 보시면 이해가 훨씬 쉬위실 겁니다~~~

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다!! 🙏

싱글턴패턴

0

1

1

KType 관련 Kotlin 2.3 변경점

1

61

2

Kotlin 2.0(K2 컴파일러)에서 달라진 Java SAM 변환 동작

2

98

3

SuperTypeSafeCage에 대해 질문드립니다

0

62

2

좋은 코드 예시

0

94

2

val 키워드도 setValue가 있나요?

0

86

2

반공변성 질문드립니다.

1

114

3

[23강] SuperTypeToken의 equals 관련 질문

1

96

2

23강 타입 안전 이종 컨테이너 예제 관련 문의 드립니다.

0

111

2

abstract class Fish(name:String):Animal(name)

0

105

2

지식공유자님 inline에 대해서의 질문과 추가적인 질문 1가지가 있습니다!

1

118

1

안녕하세요 JMH 설정 관련 팁을 드릴까 합니다! (24년 12월 16일 기준)

0

164

2

Generic Func 질문이 있습니다

1

104

1

2강부터 영상 재생이 안되네요ㅠㅠ

0

152

2

by lazy 블럭 안에서 suspend 함수의 결과값을 받는게 가능한가요?

0

389

1

Sequence vs Stream

1

251

1

코틀린 indent 코드 스타일 질문입니다.

0

263

1

non-local return 질문입니다.

1

227

1

SynchronizedLazyImpl 함수관련 질문

0

424

2

제네릭 클래스를 정의하는 경우, 반드시 변성을 고려하는 것이 바람직한가요?

4

1327

1

실무에서 lateinit 이 필요한 경우는 어떤 상황일까요?

1

455

1

4강 타입소거 관련 질문

1

331

2

추상클래스의 공변 / 반공변, 추상 제네릭 일급컬랙션 리팩토링 에 대한 질문입니다.

2

598

1

lateinit 키워드 관련해서 질문드립니다!

1

314

1