연산자 오버로딩을 사용하는 이유
: 기본적으로 코틀린은 기본 타입(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 |