2/28 강의

hyunji·2023년 2월 28일
0
post-thumbnail

도메인 특화 언어

  • 런타임 시 검증

코틀린 DSL

  • 코틀린 코드를 원하는 대로 사용할 수 있다.
    => 컴파일 시 검증 가능

확장함수

fun String.lastChar(): Char {
    return this.get(this.length - 1)
}
  • this 생략 가능
"jason".lastChar() //위와 같이 만들면 이런 확장함수 처럼 보이게 할 수 있음 

중위 표기

fun Any.to(other: Any) = Pair(this, other)
  • 인자가 2개임

  • infix는 무조건 single Value parameter 여야한다.

연산자 오버로딩

  • operator fun plus : 사용 시 '+' 를 원하는 대로 사용

  • get 메서드가 연산자 오버로딩과 관련있다.
    => 원래 get이라는 함수가 있는데 오버로딩 된 함수이다.

람다를 괄호 밖으로 빼내는 관례 Passing a lambda to the last parameter

  • 마지막 인자에 한해서 람다가 나올 수 있다.

수신 객체 지정 람다 Lambda with receiver

  • apply, also, with, run, let
    => stringBuilder이 갖고 있는 아무 함수 사용 가능
val sb = StringBuilder()
sb.apply {
    this.append("Yes")
    append("No")
}.also {
/*...*/
}.let {
/*...*/
}

=> 말이 되면 가능~! 막 추가해서 쓸 수 있음
=> 왜 굳이 apply를 써야할까? 생각해보기

코틀린 DSL 실습

introduce {
  name("박재성")
  company("우아한형제들")
  skills {
    soft("A passion for problem solving")
    soft("Good communication skills")
    hard("Kotlin")
  }
  languages {
    "Korean" level 5
    "English" level 3
  }
}

class DslTest{
@Test
fun name() {
	val person = introduce{
    		name("박재성")
    	}
        assertThat(person.name).isEqaulTo("제이슨")
	}
}

@Test
fun company() {
	val person = introduce{
    		name("박재성")
            company("우아한테크코스")
    	}
        assertThat(person.name).isEqaulTo("제이슨")
        assertThat(person.company).isEqaulTo("우아한테크코스")
	}
}

//Person의 아무 함수나 받겠다는 뜻
//block이란 함수 갖고 있음
fun introduce(block: Person.() -> Unit): Person {	
	//1
    //return Person().apply {
    //	block
    //}
    
    //2
    return Person().apply(block)
    
    //3
	//val person = Person()
    //person.block()
    //return person
}

data class Person (){
	var name : String  = ""
    var company: String = ""
    
    fun name(name: String) {
    	this.name = name
    }
    
    fun company(company: String) {
    	this.company = company
    }
}

0개의 댓글