관리 메뉴

Bbaktaeho

코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(2) 본문

프로그래밍 (Programming)/코틀린 (Kotlin)

코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(2)

Bbaktaeho 2019. 1. 28. 21:16
반응형

비교 연산자)

표기

코드

설명

a > b

a.compareTo(b) > 0

a가 b보다 큰가?

a < b

a.compareTo(b) < 0

a가 b보다 작은가?

a >= b

a.compareTo(b) >= 0

a가 b보다 큰 거나 같은가?

a <= b

a.compareTo(b) <= 0

a가 b보다 작거나 같은가?

기본 타입의 경우 이미 compareTo() 함수가 정의되어 있다. 하지만 프로그래머가 만든 클래스의 객체를 비교하려면 Compareable 인터페이스에 정의된 함수 compareTo() 함수를 오버라이딩 해야 된다.

여기서 오버로딩(overloading)과 오버라이딩(overriding)의 차이점

오버로딩(overloading) : 같은 함수를 여러 개 정의하고 매개변수의 개수나 타입을 다르게 선언하나 기능은 같음

오버라이딩(overriding) : 상위 클래스에 정의된 함수를 같은 이름으로 정의하는 기술로 기능이 다름(함수 재정의)

밑에 코드를 보고 이해해 보자.

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
    val a = shape(10,10)
    val b = shape(10,20)
    println(a>b)
    println(a<b)
}
class shape(val w : Intval h : Int) : Comparable<shape>{
    val area = w*h
    override fun compareTo(other: shape): Int {
        return compareValuesBy(this,other,shape::area)
    }
}
cs

출력은

1
2
false
true
cs

메인함수부터 읽어보면 변수 a와 변수 b는 shape 클래스의 객체이고 println() 함수를 통해 두 객체의 비교 후 맞는지 틀린 지 출력한다.

shape 클래스를 보면 구현할 Comparable 인터페이스를 콜론(:)을 사용해서 선언하고 생성자에서 변수 w와 h를 받아온다. (참고로 자바에서 인터페이스를 구현할 때는 콜론 대신에 implements 키워드를 사용한다)

shape 클래스의 멤버 중 area는 w와 b를 곱한 값을 저장한다.

Comparable 인터페이스에 정의돼있는 compareTo() 함수를 오버라이딩한다. (intelliJ IDEA에서는 compareTo 만 타이핑해도 알아서 다 만들어준다)

a > b 는 a.compareTo(b) 이므로 other는 b가 된다.

여기서 comparevaluesBy() 는 compareTo() 함수를 쉽게 구현할 수 있도록 코틀린 라이브러리에서 제공한다.

사실 우리 나름대로 구현해도 되지만 비교 연산자 왼쪽의 피연산자가 오른쪽 피연산자보다 작을 때는 음수를, 클 때는 양수를, 같을 때는 0을 반환하도록 구현해야 한다.

in 연산자)

List, Map과 같은 객체를 저장하는 데이터 구조를 컬렉션(collection)이라고 한다. in 연산자를 사용하면 특정 객체가 컬렉션에 저장되어 있는지 쉽게 확인할 수 있다.(내부적으로 함수를 호출하지만 쉽게 사용하도록 한다는 의미에서 이런 연산자를 컨벤션(convention)이라고도 한다)

표기

코드

설명

a in b

b.contains(a)

b에 a가 있는가?

a 가 b에 있다면 true 아니면 false 가 리턴된다.

배열에서 in 연산자를 사용해보자.

1
2
3
4
5
fun main(args: Array<String>) {
    val arr = arrayOf(1,2,3,4,5,6,7,8,9)
    println(10 in arr) //println(arr.contains(10))
    println(1 in arr)
}
cs

1
2
false
true
cs

범위 연산자)

시작값..끝값 으로 나타낸다. 시작값과 끝값은 동일한 타입이어야 한다. 그리고 끝값이 시작값과 같거나 커야 한다.

1
2
val alpha : CharRange = 'a'..'z'
val num : IntRange = 0..9
cs

타입이 생소할 수 있는데 CharRange 타입은 문자 범위 타입이고 IntRange 타입은 정수 범위 타입이다. 자바에는 없는 타입이다.

범위 연산자는 기본 타입이 아닌 다른 타입에도 사용할 수 있다. 예시로 날짜 범위를 사용하는 코드를 보자.

1
2
3
4
5
fun main(args: Array<String>) {
    val s = LocalDate.now()
    val e = s..s.plusDays(7)
    println(e)
}
cs

출력은

1
2019-01-28..2019-02-04
cs

LocalDate 클래스는 자바 클래스이고 이 클래스의 now() 함수는 컴퓨터의 시스템 클럭에서 현재 날짜를 가져온다. PlusDays() 는 인자 값을 일자에 더한 날짜를 반환한다.


반응형