일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- javascript
- 연산자
- Array
- adapter
- 자바스크립트
- 배열
- Android
- golang
- js
- 노트북 추천
- 싱글 스레드
- 자바
- 파이썬
- HP
- var
- 리스트 뷰
- Kotlin
- 함수
- go
- 안드로이드
- 코틀린
- 노트북
- ListView
- Python
- node.js
- as?
- 패널 교체
- 오버로딩
- Overloading
- Java
- Today
- Total
Bbaktaeho
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(2) 본문
비교 연산자)
기본 타입의 경우 이미 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 : Int, val 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 가 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 |
타입이 생소할 수 있는데 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 |
LocalDate 클래스는 자바 클래스이고 이 클래스의 now() 함수는 컴퓨터의 시스템 클럭에서 현재 날짜를 가져온다. PlusDays() 는 인자 값을 일자에 더한 날짜를 반환한다.
'프로그래밍 (Programming) > 코틀린 (Kotlin)' 카테고리의 다른 글
코틀린(Kotlin) 10. if와 when (0) | 2019.01.30 |
---|---|
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(3) (0) | 2019.01.30 |
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(1) (0) | 2019.01.25 |
코틀린(Kotlin) 8. 입력과 출력 (0) | 2019.01.24 |
코틀린(Kotlin) 7. 추론 (0) | 2019.01.24 |