연산자
우리가 기존에 알고 있던 연산자를 클래스끼리, 혹은 구조체 끼리 한다면?, 객체(구조체, 클래스)에 대한 연산 행위는 무엇이 있는지 알아보자!
- 객체의 행위
    - 메소드
- 연산자
 
- 기존의 연산자 정의
    - 다른 타입에서의 사용자 정의를 그대로
- 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