[우테코] 코틀린을 코틀린 답게 ~

Yerin·2023년 4월 7일

우아한테크코스

목록 보기
8/10
post-thumbnail

4월 7일인데.. 2월 28일 수업을 이제야 정리하고 있다..
방학이 끝나기 전에는 이 모든 것을 정리할 수 있겠지?
(일단 눈물 닦는데 10일 걸릴 듯...)

이날은.. 코틀린을 더 깔끔하게 ~ 코틀린 답게 작성하는 법에.. 배웠던 것으로 추측된다 ^^..!

  • 확장 함수
  • 중위 호출
  • 연산자 오버로딩
  • get 메서드에 대한 관례
  • 람다를 괄호 밖으로 빼내는 관례
  • 수신 객체 지정 람다

Extention functions : 확장함수

확장?

Kotlin은 클래스에서 상속하거나 Decorator 와 같은 디자인 패턴을 사용하지 않고도 새로운 기능으로 클래스 또는 인터페이스를 확장할 수 있는 기능을 제공한다. 이는 확장이라는 특수 선언을 통해 수행된다.
이때 추가적인 메소드를 구현하면 확장 함수, 추가적인 프로퍼티를 구현하면 확장 프로퍼티

확장함수

확장 함수를 선언하려면 확장되는 유형을 참조하는 수신자 유형을 해당 이름 앞에 붙인다.
generic 타입도 확장함수를 선언할 수 있다.

확장함수는 실제로 인자를 2개를 가지고 있다. -> decompile해보면 바로 알 수 있다.
(java에는 확장함수 X, 대신java8의 default 메서드와 유사)

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

확장함수는 OOP를 위반하는가?

public으로 무분별하게 사용되는 확장함수는 확실히 oop를 위반한다고 생각한다.
또한 기본 자료형에 대한 확장함수도 무분별하게 사용될 수 있으므로 private하게 사용해야 한다.
그렇다면 확장함수를 사용하기 좋은 때는 언제일까?
레벨 1에서는, domain에서 view를 관리하지 않기 위해 view에서 확장 함수를 이용하는 것이 바람직했다.
그 외에는 외부 라이브러리를 사용 시 유용하게 쓰인다고 한다.


Infix notation : 중위 표기

infix 키워드로 선언된 함수들은 중위 표기식으로 작성가능하다.
-> 호출에 대한 점과 괄호를 생략가능하다.
중위 표기를 하기 위해서는 다음과 같은 조건이 필요하다.

  • 멤버 함수 또는 확장 함수여야 한다.
  • 단일 매개변수가 있어야 한다.
  • 매개변수는 가변 개수의 인수를 허용 하지 않아야 하며 기본값이 없어야 한다.
1.to("one")

fun Any.to(other: Any) = Pair(this, other)

infix를 사용하면 위의 코드가 아래처럼 쓰일 수 있다.

1 to "one"

infix fun Any.to(other: Any) = Pair(this, other)

Operator overloading : 연산자 오버로딩

operator 키워드를 이용하면 오버라이드 할 수 있게 된다.

Point(0, 1).plus(Point(1, 2))

data class Point(val x: Int, val y: Int) {
    fun plus(other: Point): Point = Point(x + other.x, y + other.y)
}

위의 코드를 다음과 같이 작성할 수 있다.

Point(0, 1) + Point(1, 2)

data class Point(val x: Int, val y: Int) {
    operator fun plus(other: Point): Point = Point(x + other.x, y + other.y)
}

get

get은 코틀린에서 [ ]로 이용가능하다

사실 get 메서드가 정의되어있고,
[ ] 연산자를 오버로딩 한 것이란다,, 웁스 ㅇ_ㅇ ~


람다를 밖으로..

마지막 인자에 한해서 람다는 괄호 밖으로 나올 수 있다.

check(false, { -> "Check failed." })

// 위의 코드를 이와 같이 작성 가능하다.
check(false) { "Check failed." }

수신객체 지정 람다

마지막으로는 수신객체 지정 람다 (this) 를 설명했는데,
이에 관해서는 따로 scope function 게시글로 소개하겠다.
왜냐면은 내 테코톡.. 주제이기 때문에 ㅎㅎ


DSL을 수업에서 다루고, 실습까지 했지만,, 나는 아직 완벽 이해가 안되었기 때문에 추후에.. 꼭 공부하도록 하겠다.

👻 DSL
👻 Scope function
👻 수신 객체, 수신 객체 지정 람다

profile
𝙸 𝚐𝚘𝚝𝚝𝚊 𝚕𝚒𝚟𝚎 𝚖𝚢 𝚕𝚒𝚏𝚎 𝙽𝙾𝚆, 𝙽𝙾𝚃 𝚕𝚊𝚝𝚎𝚛 !

0개의 댓글