[KOTLIN] 연산자 오버로드를 할때는 의미에 맞게 사용

2022. 7. 3. 10:43·KOTLIN
728x90

연산자 오버로딩

  • 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법 (자바에서 Iterable 객체에 대해 for Loop를 사용할 수 있는 것 과 비슷함)

산술 연산자 오버로딩

  • 자바는 원시 타입이 String에 대해서만 산술 연산자를 지원하지만 코틀린은 다른 클래스에서 산술연산자를 오버로딩하면 그대로 사용할 수 있음

이항 산술 연산자 오버로딩

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

val p1 = Point(10, 20)
val p2 = Point(30, 40)
println(p1 + p2)
// Point(x=40, y=60)
  • 연산자 오버로딩을 사용시 함수에 operator 키워드를 사용
  • operator 키워드는 어떤 함수가 연산자 오버로딩 Convention을 사용하도록 명시하는 역할을 함

연산자 오버로드를 할 때 의미에 맞게 사용해야하는 이유

//팩토리얼 정의한 확장함수
fun Int.factorial(): Int = (1..this).product()
fun Iterable<Int>.product(): Int = 
		fold(1) { acc, i -> acc * i }

print(10 * 6.facorial()) // 10 * (6!) = 7200

// 연산자 오버로딩
opertaor fun Int.not() = factorial()
print(10 * !6) // 더 간결해..졌나?
  • 함수 이름이 not이라서 논리연산에 맞지 않게 사용했기 때문에 오히려 혼란을 주고 오해의 소지가 발생함
  • 관례에 어긋나는 케이스
  • 하지만 관례에 어긋나도 되는 경우가 있음 

연산자 오버로드에 대하여 관례 및 규칙을 무시해도 되는 경우

// HTML DSL. 코틀린 문법을 활용해서 만든 DSL이다.
body {
	div {
		+"Some Text" // <- String.unaryPlus 가 문자열 앞에 사용되었다.
	}
}

// Gradle DSL. 이것도 코틀린 문법을 이용해서 만든 DSL 이다. Gradle 5.0부터 지원한다.
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.6.10"
    application
}

version = "1.0-SNAPSHOT"

dependencies {
    testImplementation(kotlin("test"))
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClass.set("MainKt")
}
  • 도메인 특화 언어(Domain Specific Language, DSL)을 설계할 경우 해당 규칙을 무시해도 됨
  • DSL같은 경우 연산자를 잘못 이해할 일이 없기 때문
저작자표시

'KOTLIN' 카테고리의 다른 글

[KOTLIN] 제네릭 타입과 VARIANCE 한정자를 활용하라 (이펙티브 코틀린)  (0) 2022.07.10
[KOTLIN] 타입 파라미터의 섀도잉을 피하라 (이펙티브 코틀린)  (0) 2022.07.10
[KOTLIN] NULLABLE UNIT 을 리턴하지 말라 (이펙티브코틀린)  (0) 2022.07.03
[KOTLIN] 변수의 스코프 최소화 (이펙티브코틀린)  (0) 2022.06.18
[KOTLIN] CONTEXT / DISPATCHER  (0) 2022.06.15
'KOTLIN' 카테고리의 다른 글
  • [KOTLIN] 제네릭 타입과 VARIANCE 한정자를 활용하라 (이펙티브 코틀린)
  • [KOTLIN] 타입 파라미터의 섀도잉을 피하라 (이펙티브 코틀린)
  • [KOTLIN] NULLABLE UNIT 을 리턴하지 말라 (이펙티브코틀린)
  • [KOTLIN] 변수의 스코프 최소화 (이펙티브코틀린)
집한구석
집한구석
  • 집한구석
    tgyun615.info
  • 전체
    오늘
    어제
    • 카테고리 (183)
      • JAVA (38)
      • SPRING (15)
      • KOTLIN (23)
      • NETTY (1)
      • DEVOPS (3)
      • DOCKER (7)
      • KUBERNETES (2)
      • JAVASCRIPT (1)
      • SPLUNK (3)
      • ELK (7)
      • KAFKA (2)
      • GO (4)
      • ALGORITHM & DATA STRUCTURE (9)
      • IDE (5)
      • OS (16)
      • NETWORK (14)
      • GCP (2)
      • AWS (2)
      • DATABASE (10)
      • CLEANCODE (7)
      • OTHER (12)
  • 최근 글

  • 태그

    docker
    ElasticSearch
    Kafka
    엘라스틱서치
    Spring
    splunk
    클린코드
    자바
    java
    JPA
    이펙티브 코틀린
    go
    SQL
    AWS
    코틀린
    이펙티브코틀린
    Elk
    IntelliJ
    cleancode
    프로그래머스
  • 링크

    • github
    • linkedin
    • resume
  • hELLO· Designed By 정상우. v4.10.3
집한구석
[KOTLIN] 연산자 오버로드를 할때는 의미에 맞게 사용
상단으로

티스토리툴바