본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

Kotlin_Basic03 - 연산자 오버로딩

by print_soo 2024. 9. 20.

연산자 오버로딩을 사용하는 이유

: 기본적으로 코틀린은 기본 타입(int, float, double, ...)에 대해서만 연산자가 적용되어 있기 때문에 커스텀 타입에 연산자를 사용하기 위해서 사용한다.

: 🚨 유의할 점은 operator 키워드는 꼭 붙여줘야한다. 🚨

 

예시1 - times(곱셈)

커스텀 타입 생성하기

class Point(val x: Int, val y: Int) {
}

 

 

커스텀 타입에서 곱셈 오버로딩하기

//[방법 1 - 클래스 내부]
class Point(val x: Int, val y: Int) {
    operator fun times(p: Point): Point {
        return Point(this.x * p.x, this.y * p.y)
        // [설명]
        // this는 현재 해당 메소드를 사용한 객체 자신을 나타낸다.
        // 예를 들어 p1.times(p2)라고 했다면 this.x는 p1의 x이고, / p.x는 p2의 x이다.
    }
}

//[방법 2 - 클래스 외부]
class Point(val x: Int, val y: Int) {
}

operator fun Point.times(p: Point): Point {
    return Point(this.x * p.x, this.y * p.y)
}

 

 

커스텀 타입을 이용한 곱셈 사용하기

fun main() {
    // 연산자 오버로딩 - times
    val p1 = Point(10, 20)
    val p2 = Point(3, 4)
    val p3 = p1 * p2
    println("${p3.x}, ${p3.y}")
}

 

예시2 - in 연산자 오버로딩

 

커스텀 타입 생성하기

class AlphabetRange(val start: Char, val end: Char) {

}

 

 

커스텀 타입에서 in 연산자 오버로딩하기

class AlphabetRange(val start: Char, val end: Char) {
    operator fun contains(char: Char): Boolean {
        return char in start..end
    }
}

 

 

커스텀타입을 이용한 in 연산자 사용하기

fun main() {
    // 연산자 오버로딩X - in
    val ch = 'g'
    val range = 'a'..'m'
    if (ch in range) {
        println("$ch is in range $range")
    }

    // 연산자 오버로딩X - contains 사용
    val ch2 = 'g'
    val range2 = 'a'..'m'
    if (range2.contains(ch2)) {
        println("$ch2 is in range $range2")
    }

    // 연산자 오버로딩O - in 사용 후
    val ch3 = 'g'
    val range3 = AlphabetRange('a', 'm')
    if (ch3 in range3) {
        println("$ch3 is in range ${range3.start} to ${range3.end}")
    }

    //1번 : 코틀린의 내장 타입인 CharRange에서 기본 in 연산자를 사용하여 값이 범위에 속하는지 확인.
    //2번 : contains 메소드를 직접 호출하여 값이 범위에 있는지 확인, in 연산자를 사용하지 않음.
    //3번 : 커스텀 타입(AlphaberRange)에 대해 contains 메소드를 오버로딩하여 in 연산자를 사용할 수 있도록 함.

    // 'a'..'m'도 하나의 타입으로 본다. CharRange라는 타입이다.
}

'2학년 2학기 > 모바일 소프트웨어 - 코틀린' 카테고리의 다른 글

Class(1) - 클래스 선언과 생성자  (0) 2024.09.30
Kotlin_Basic03 - when(2)  (0) 2024.09.20
Kotlin_Basic03 - when(1)  (0) 2024.09.20
Kotlin_Basic03 - null 처리  (0) 2024.09.20
Kotlin_Basic03 - if 식  (0) 2024.09.20