연산자

우리가 기존에 알고 있던 연산자를 클래스끼리, 혹은 구조체 끼리 한다면?, 객체(구조체, 클래스)에 대한 연산 행위는 무엇이 있는지 알아보자!

  • 객체의 행위
    • 메소드
    • 연산자
  • 기존의 연산자 정의
    • 다른 타입에서의 사용자 정의를 그대로
    • 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