연산자
우리가 기존에 알고 있던 연산자를 클래스끼리, 혹은 구조체 끼리 한다면?, 객체(구조체, 클래스)에 대한 연산 행위는 무엇이 있는지 알아보자!
- 객체의 행위
- 메소드
- 연산자
- 기존의 연산자 정의
- 다른 타입에서의 사용자 정의를 그대로
- point1 + point2
- 새로운 연산자 정의
- 기존의 없는 연산자 정의
연산자 정의
- 피 연산자 개수
- 단항 연산자(Unary)
- 이항 연산자(Binary)
- 삼항 연산자
- 연산자 위치
- 전위(prefix): 단항 연산자의 경우
- 중위(infix): 이항 연산자의 경우
- 후위(postfix): 단항 연산자의 경우
- 불가능한 연산자: 연산자 정의가 불가능한 연산자
- 할당: =
- 반환 타입: ->
- 주석: //
- 메소드, 프로퍼티 접근용 점: .
- 등등.
- 연산자 함수 정의
- 연산자 함수는 타입 메소드로 작성
- 연산자 함수의 이름은 연산자: + - * …
- 단항 연산자 - 파라미터 1개, 연산자 위치 정보 필요(앞, 뒤 일수 있음)
- 이항 연산자 - 파라미터 2개
* 연산자 정의 하기
struct Point {
var x : Int
var y : Int
static func +(left : Point, right : Point) -> Point {
return Point(x: left.x + right.x, y: left.y + right.y)
}
}
* 연산자 사용하기
var p1 = Point(x: 10, y: 10)
var p2 = Point(x: 20, y: 20)
p1 + p2
단항 연산자
- 전위 연산자: prefix operator
- 후위 연산자: postfix operator
extension Point {
static prefix func -(point : Point) -> Point {
var another = Point()
another.x = -point.x
nother.y = -point.y
return another
}
}
let p1 = Point(x: 10, y: 10)
let p2 = -p1 // (-10, -10)
비교 연산자
- == 연산자
- Equatable 프로토콜
func ==(lhs: Self, rhs: Self) -> Bool
: 실제 구현되는 객체를 self에 넣으면 됩니다.
* 기능 작성
extension Size : Equatable {
static func ==(lhs: Size, rhs: Size) -> Bool {
return lhs.width == rhs.width
&& lhs.height == rhs.height
}
}
var obj1 = Size(width: 10, height: 10)
var obj2 = Size(width: 10, height: 10)
var obj3 = Size(width: 20, height: 20)
obj1 == obj2 // true
obj1 == obj3 // false