05. 연산자

JinStory77·2022년 5월 11일
0

Swift 공부_기초

목록 보기
5/11

연산자

  • 특정한 문자로 표현한 함수를 뜻한다. 특정 연산자의 역할을 프로그래머의 의도대로 변경 가능하다.
  • 연산 되는 값의 수에 따라 단항(!A), 이항(A+B), 삼항(A?B:C) 등으로 구분하기도 하고, 연산자의 위치에 따라 전위(!A), 중위(A+B), 후위(A!) 등으로 구분하기도 한다.
  • 띄어쓰기에 주의해야한다.
    - A != B와 A! = B는 전혀 다른 의미
    - A > B? A : B에서 ?는 B에서 띄어 써야한다.


1. 연산자의 종류

1.1. 할당 연산자

  • 값을 할당 할 때 사용한다.
    • A = B
      • A에 B의 값을 할당한다.
      • 서로 다른 데이터 타입이면 오류가 발생한다.

1.2. 산술 연산자

  • 수학의 연산자와 같은 역할을 한다.
    • A + B
    • A - B
    • A * B
    • A / B
    • A % B

1.3. 비교 연산자

  • 두 값을 비교할 때 사용한다.

    • A == B
      • A와 B가 같은 값인지 불리언 값을 반환
    • A >= B
      • A가 B보다 크거나 같은 값인지 비교하여 불리언 값을 반환
    • A <= B
      • A가 B보다 작거나 같은 값인지 비교하여 불리언 값을 반환
    • A > B
      • A가 B보다 큰 값인지 비교하여 불리언 값을 반환
    • A < B
      • A가 B보다 작은 값인지 비교하여 불리언 값을 반환
    • A != B
      • A와 B가 다른 값인지 비교하여 불리언 값을 반환
    • A === B
      • A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같은 인스턴스를 가르키는지 값인지 비교하여 불리언 값을 반환
    • A !== B
      • A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같지 않은 인스턴스를 가르키는지 값 인지 비교하여 불리언 값을 반환
    • A ~= B
      • A와 B의 패턴이 매치되는지 확인하여 불리언 값을 반환

1.4. 삼항 조건 연산자

  • 피연산자가 세 개인 조건 연산자이다.
    • Question ?A:B
      • Question(불리언 값)이 참이면 A를, 거짓이면 B를 반환
var valueA: Int = 3
var valueB: Int = 5
var biggerValue: Int = valueA > valueB ? valueA : valueB   // 5

valueA = 0
valueB = -3
biggerValue = valueA > valueB ? valueA : valueB   // 0

var stringA: String = ""
var stringB: String = "String"
var resultValue: Double = stringA.isEmpty ? 1.0 : 0.0   // 1.0
resultValue = stringB.isEmpty ? 1.0 : 0.0   // 0.0

1.5. 범위 연산자

  • 값(수)의 범위를 표현 할 때 사용한다.
    • A...B(폐쇄 범위 연산자)
      • A부터 B까지의 수를 묶어 범위를 표현(A와 B를 포함한다)
    • A...B(반폐쇄 범위 연산자)
      • A부터 B 미만까지의 수를 묶어 범위를 표현(A를 포함하고 B를 포함하지 않는다)
    • A...(단방향 범위 연산자1)
      • A 이상의 수를 묶어 범위를 표현
    • ...A(단방향 범위 연산자2)
      • A 이하의 수를 묶어 범위를 표현
    • ..<A(단방향 범위 연산자3)
      • A 미만의 수를 묶어 범위를 표현

1.6. 부울 연산자

  • 불리언 값의 논리 연산을 할 때 사용한다.
    • !B(NOT(부정)부울 연산자)
      • B(불리언 값)의 참, 거짓을 반전
    • A && B(AND 부울 연산자)
      • A와 B의 불리언 AND 논리 연산을 실행
    • A || B(OR 부울 연산자)
      • A와 B의 불리언 OR 논리 연산을 실행

1.7. 비트 연산자

  • 비트 논리 연산을 위한 연산자이다.
    - ~A
    - A의 비트를 반전한 결과를 반환
    • A & B
      • A와 B의 비트 AND 논리 연산을 실행
    • A | B
      • A와 B의 비트 OR 논리 연산을 실행
    • A ^ B
      • A와 B의 비트 XOR 논리 연산을 실행
    • A >> B, A << B
      • A의 비트를 B만큼 비트를 이동

1.8. 복합 할당 연산자

  • 할당 연산자와 다른 연산자가 하는 일을 한번에 할 수 있도록 연산자를 결합한다.
    • A += B
      • A = A + B
    • A -= B
      • A = A - B
    • A *= B
      • A = A * B
    • A /= B
      • A = A / B
    • A %= B
      • A = A % B
    • A <<= N
      • A = A << N
    • A &= B
      • A = A & B
    • A |= B
      • A = A | B
    • A ^= B
      • A = A ^ B

1.9. 오버플로 연산자

  • 기본 연산자를 사용해 오버플로에 대비할 수 있도록 해준다. 오버플로 연산자를 사용하면 오버플로를 자동으로 처리한다.
    • &+
      • 오버플로에 대비한 덧셈 연산
    • &-
      • 오버플로에 대비한 뺄셈 연산
    • &*
      • 오버플로에 대비한 곱셈 연산
var unsignedInteger: UInt8 = 0

let errorUnderflowResult: UInt8 = unsighnedInteger - 1  // 런타임 오류
let underflowValue: UInt8 = unsignedInteger &- 1         // 255

unsignedInteger = UInt8.max                              // 255
let errorOverflowResult: UInt8 = unsignedInteger + 1    // 런타임 오류
let overflowValue: UInt8 = unsignedInteger &+ 1           // 0

1.10. 기타 연산자

  • 스위프트 라이브러리에 기본적으로 정의된 연산자들을 정리한 것들이다.
    • A ?? B(nil 병합 연산자)
      • A가 nil이 아니면 A를 반환하고, A가 nil이면 B를 반환
    • -A(부호변경 연산자)
      • A(수)의 부호를 변경
    • O!(옵셔널 강제 추출 연산자)
      • O(옵셔널 개체)의 값을 강제로 추출
    • V?(옵셔널 연산자)
      • V(옵셔널 값)을 안전하게 추출하거나, V(데이터 타입)가 옵셔널임을 표현


2. 연산자 우선순위와 결합방향

  • 연산자 우선순위를 지정해 놓았기 때문에 헷갈리는 경우 확인을 할 수 있다.
  • 연산자가 연산하는 결합방향도 지정되어 있다.
  • 연산자 우선순위는 절대치가 아닌 상대적인 수치이다.


3. 사용자 정의 연산자

  • 기존에 존재하지 않던 연산자 기호를 만들어 추가할 수 있다.
  • 기존에 없던 연산자를 만드는 만큼 연산자 정의를 먼저 해줘야한다. 정의한다는 뜻은 '이제 이 연산자를 사용하겠다'를 알리는 것과 같다. 정의된 연산자는 모듈 전역에서 사용가능하다.

3.1. 전위 연산자

prefix operator **
prefix operator **

prefix func ** (value: Int) -> Int{
    return value * value                // 25
}

let minusFive: Int = -5
let sqrtMinusFive: Int = **minusFive    // 25

print(sqrtMinusFive)                    // 25

3.2. 후위 연산자

postfix operator **
postfix operator **

postfix func ** (value: Int) -> Int{
    return value + 10
}

let valueA: Int = 5
let result: Int = valueA**      // 15

print(result)                   // 15
  • 하나의 피연산자에 전위 연산과 후위 연산을 한 줄에 사용하면 후위 연산을 먼저 한다.
prefix operator ^^
postfix operator ^^

prefix func ^^ (value: Int) -> Int {
    return value * value
}

postfix func ^^ (value: Int) -> Int {
    return value + 10
}

let five: Int = 5
let sqrtFivePlusTen: Int = ^^five^^
// 후위 연산인 5 + 10을 하고 난 후 값인 15, 전위 연산인 15 * 15 로 값이 255

3.3. 중위 연산자

  • 전위 연산자나 후위 연산자와 정의는 크게 다르지 않다. 다만 중위 연산자는 우선순위 그릅을 명시해줄 수 있다.
infix operator
precedencegroup 우선순위 그룹{
    higherThan: 더 낮은 우선순위 그룹 이름
    lowerThan: 더 높은 우선순위의 그룹 이름
    associativity: 결합 방향(left/right/none)
    assignment: 할당방향 사용 (true/ false)
}
// String 타입의 contains(_:) 메서드를 사용하기 위해 Foundation 프레임워크를 임포트 합니다.
import Foundation

infix operator ** : MultiplicationPrecedence

func  ** (lhs: String, rhs: String) -> Bool {
    return lhs.contains(rhs)
}

let helloJin: String = "Hello Jin"
let Jin: String = "Jin"
let isContainsJin: Bool = helloJin ** Jin
  • 중위 연산자를 정의할 때 우선순위 그룹을 명시해주지 않는다면 우선순의가 가장 높은 DefaultPrecedence 그룹을 우선순위 그룹으로 갖게 된다.
profile
Let's smile for future 🤩

0개의 댓글