일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 패널 교체
- 함수
- 안드로이드
- Kotlin
- 파이썬
- Android
- node.js
- 연산자
- golang
- Python
- 자바
- 자바스크립트
- 싱글 스레드
- 코틀린
- 배열
- 리스트 뷰
- Array
- 노트북 추천
- 오버로딩
- Overloading
- Java
- HP
- js
- var
- as?
- go
- javascript
- ListView
- adapter
- 노트북
- Today
- Total
Bbaktaeho
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(1) 본문
코틀린 연산자를 사용하는 법은 다른 프로그래밍 언어와 유사하지만 내부적으로 연산자를 오버로딩한 함수를 사용한다.
코틀린에서 A+B는 덧셈 연산자를 오버로딩한 A.plus(B) 가 수행된다. 그래서 피연산자가 어느 타입이라도 우리는 + 로만 나타내도 돼서 편리하다.
산술 연산자)
기본 타입의 변수를 연산할 때는 우리가 굳이 연산자를 오버 로딩하지 않아도 된다. 이미 오버로딩되어 있다.
다른 연산자도 확인해보자.
단항 연산자)
복합 대입 연산자)
비트 연산자)
참고로 위의 함수 순서대로 자바에선 <<, >>, >>>, &, |, ^, ~ 입니다.
논리 연산자)
동등 비교 연산자)
=== 이 표현은 조금 생소하다. 이 표현은 변수가 똑같은 객체를 참조하는지를 비교할 때 사용하는 연산자이다.
즉, 변수의 참조 값이 같은지 비교하는 것이다.
위의 표에서 a?.equals(b) ?: (b == null) 이 어떤 의미인지 알아보자.
우선 a가 null이 아닌지 확인한다. null이 아니라면 equals() 함수를 호출한다. 그리고 equals(b) 를 실행한 결괏값이 null이 아니면 그 값을 리턴한다. 만약 null 이라면 b == null 의 값을 반환한다. (b가 null이면 true 아니면 false)
?: 연산자는 엘비스 연산자라고 부르는 연사자이다. 나중에 다시 다뤄보겠다.
연산자 오버로딩)
우선 연산자 오버로딩이란 연산자가 하는 일을 객체의 필요에 맞게 구현한 것이다.
학교에서 c++, c# 을 배울 때 연산자 오버로딩에 대해 배웠다. 주관적으로 중요한 부분이라 생각해서 예를 들어 설명하겠다.
예를 들어 철수가 1000원 1장과 10달러 1장이 있고 영희가 1000원 4장과 10달러 2장이 있다. 그럼 철수가 가지고 있는 지폐의 수는 2장이고 영희가 가지고 있는 지폐의 수는 6장이다.
[철수가 가지고 있는 지폐 + 영희가 가지고 있는 지폐 = 8장]
그러나 우리가 원하는 것이 1000원 지폐 따로, 10달러 지폐 따로 계산해서 알고 싶다.
그러면 무작정 둘이 가지고 있는 지폐를 더하기보단 [철수.원 + 영희.원] 그리고 [철수.달러 + 영희.달러] 로 따로 계산해야 된다. 이렇게 하게되면 번거로우니 연산자 오버로딩을 통해 편리하게 구현할 수 있다.
[철수가 가지고 있는 지폐 + 영희가 가지고 있는 지폐 = 1000원 5장, 10달러 3장] 처럼 덧셈으로만 나타내면 되므로 굉장히 편리하다.
(예시가 별로다..)
그럼 이제 코틀린으로 연산자 오버로딩 하는 법을 알아보자.
1 2 3 4 5 6 7 8 9 10 | fun main(args: Array<String>) { val chul = Person(1,1) val yeong = Person(4,2) println(chul+yeong) } data class Person(val w:Int, val d:Int){ //원이랑 달러 operator fun plus(other:Person):Person{ //plus함수 오버로딩(연산자 오버로딩) return Person(w+other.w , d+other.d) } } | cs |
클래스 외부에서 확장 함수로 사용하는 법
1 2 3 4 5 6 7 8 9 10 | fun main(args: Array<String>) { val chul = Person(1,1) val yeong = Person(4,2) println(chul+yeong) } data class Person(val w:Int, val d:Int) operator fun Person.plus(other:Person):Person{ return Person(w+other.w,d+other.d) } | cs |
데이터를 저장하는 것이 주목적인 클래스를 정의할 때는 데이터 클래스로 정의하면 편리하다. 클래스를 선언할 때 data 키워드를 달아주면 된다.
데이터 클래스의 속성은 클래스 이름 다음에 괄호 속에 정의하면 된다.(괄호가 생성자 역할이 됨)
앞에서 얘기했듯이 덧셈의 오버로딩 함수는 plus() 이므로 함수 이름을 반드시 plus 로 해야 된다. operator 키워드도 빼먹지 않도록 하자.
'프로그래밍 (Programming) > 코틀린 (Kotlin)' 카테고리의 다른 글
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(3) (0) | 2019.01.30 |
---|---|
코틀린(Kotlin) 9. 연산자와 연산자 오버로딩(2) (0) | 2019.01.28 |
코틀린(Kotlin) 8. 입력과 출력 (0) | 2019.01.24 |
코틀린(Kotlin) 7. 추론 (0) | 2019.01.24 |
Kotlin(코틀린) 6. 다차원 배열 (1) | 2019.01.24 |