[Swift] 스위프트 기초 - 연산자

koi·2022년 9월 27일
0
post-thumbnail

연산자

스위프트의 연산자는 특정한 문자로 표현한 함수


연산자의 분류

분류설명
단항 연산자피연산자가 한 개!A
이항 연산자피연산자가 두 개A+B
삼항 연산자피연산자가 세 개A?B:C
전위 연산자연산자가 피연산자 앞에 위치!A
중위 연산자연산자가 피연산자 사이에 위치A+B
후위 연산자연산자가 피연산자 뒤에 위치A!

연산자의 종류

할당 연산자

분류부호설명
할당 연산자A=BA에 B의 값을 할당, 다른 데이터 타입이면 오류 발생

산술 연산자

연산자부호
덧셈 연산자A+B
뺴기 연산자A-B
곱셈 연산자A*B
나누기 연산자A/B
나머지 연산자A%B
  • 스위프트는 부동소수점 타입의 나머지 연산까지 지원한다.
    Double.truncatingRemainder(divider: Double)

비교 연산자

연산자부호설명
값이 같다.A==BA와 B가 같은지 Bool값 반환
값이 크거나 같다.A>=BA가 B보다 크거나 같은 값인지 Bool값 반환
값이 작거나 같다.A<=BA가 B보다 작거나 같은 값인지 Bool값 반환
값이 크다.A>BA가 B보다 큰 값인지 Bool값 반환
값이 작다.A<BA가 B보다 작은 값인지 Bool값 반환
값이 같지 않다.A!=BA와 B가 다른 값인지 Bool값 반환
참조가 같다.A===BA와 B가 참조 타입일 때 같은 인스턴스를 가르키는지 비교하여 Bool값 반환
참조가 같지 않다.A!==BA와 B가 참조 타입일 때 다른 인스턴스를 가르키는지 비교하여 Bool값 반환
패턴 매치A~=BA와 B의 패턴이 매치되는지 확인하여 Bool값을 반환
  • 스위프트의 유일한 참조 타입인 클래스의 인스턴스만 참조 비교 연산자를 사용할 수 있다.
  • 스위프트의 기본 데이터 타입은 모두 구조체로 구현되어 있기 때문에 값타입이다.

🤔 ~= 연산자가 뭐지?

어떤 범위에 값이 속하는지 불리언 값으로 알려주는 연산자
{Range 값} ~= {하나의 값}

이런 식으로 활용할 수 있네요!


삼항 조건 연산자

연산자부호설명
삼항 조건 연산자Question? A:BQuestion(Bool)값이 참이면 A, 거짓이면 B를 반환

범위 연산자

연산자부호설명
폐쇄 범위 연산자A...BA부터 B까지의 수를 묶어 범위를 표현합니다.
A와 B를 포함합니다.
반폐쇄 범위 연산자A..<BA부터 B미만까지의 수를 묶어 범위를 표현합니다.
A를 포함하고 B를 포함하지 않습니다
단방향 범위 연산자A...
...A
..<A
A 이상의 수를 묶어 범위를 포함합니다.
A 이하의 수를 묶어 범위를 표현합니다.
A 미만의 수를 묶어 범위를 표현합니다.

부울 연산자

연산자부호설명
NOT(부정) 부울 연산자!BB 값의 참, 거짓을 반전합니다.
AND 부울 연산자A && BA와 B의 불리언 AND 논리 연산을 실행합니다.
OR 부울 연산자A || BA와 B의 불리언 OR 논리 연산을 실행합니다.

비트 연산자

연산자부호설명
NOT(부정) 비트 연산자~AA의 비트를 반전한 결과를 반환합니다.
AND 비트 연산자A & BA와 B의 비트 AND 비트 논리 연산을 실행합니다.
OR 비트 연산자AB
XOR 부울 연산자A ^ BA와 B의 비트 XOR 논리 연산을 실행합니다.
비트 이동 연산자A >> B
A << B
A의 비트를 B만큼 시프트(이동)합니다.

복합 할당 연산자

복합 할당 연산자로 표현
A = A + BA += B
A = A - BA -= B
A = A*BA *= B
A = A/BA /= B
A = A % BA %= B
A = A << BA <<= B
A = A >> BA >>= B
A = A && BA &= B
A = A || BA |= B
A = A ^^ BA ^= B

오버플로 연산자

스위프트는 기본 연산자를 통해 오버플로에 대비할 수 있도록 해놓았다. 오버플로 연산자를 사용하면 오버플로를 자동으로 처리한다.

부호설명
&+오버플로에 대비한 덧셈 연산을 합니다.
&-오버플로에 대비한 뺄셈 연산을 합니다.
&*오버플로에 대비한 곱셈 연산을 합니다.

부호가 없는 양의 정수만 표현하는 UInt8 타입에 뺄셈을 했더니 런타임 에러가 발생하네요.
그럼 이렇게 오버플로우 연산자를 사용하면 됩니다!


기타 연산자

연산자부호설명
nil 병합 연산자A ?? BA가 nil이 아니면 A를 반환, A가 nil이면 B를 반환
부호변경 연산자-AA의 부호를 변경
옵셔널 강제 추출 연산자O!옵셔널 개체 O의 값을 강제로 추출
옵셔널 연산자V?옵셔널 값 V를 안전하게 추출하거나, 데이터 타입 V가 옵셔널임을 표현

옵셔널 강제 추출 연산자는 지양하는 편이 좋습니다.

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

우선순위가 높은 연산자가 자신에 비해 우선순위가 낮은 연산자보다 먼저 실행됩니다. 스위프트의 연산자의 연산자 우선순위는 절대치가 아닌 상대적 수치입니다.

연산자가 연산하는 결합방향도 지정되어 있습니다. 결합 방향이 같은 우선순위에 있는 연산자끼리 나열됐을 때 어느 방향부터 그룹 지을 것인지 나타냅니다.

예를 들어 1+2+3+4라는 수식이 있다면 +의 연산 방향은 왼쪽이기 때문에 ((1+2)+3)+4)처럼 연산이 됩니다.


precedencegroup BitwiseShiftPrecedence {
    higherThan: MultiplicationPrecedence
}

precedencegroup FunctionArrowPrecedence {
    associativity: right
    higherThan: AssignmentPrecedence
}

precedencegroup TernaryPrecedence {
    associativity: right
    higherThan: FunctionArrowPrecedence
}

precedencegroup DefaultPrecedence {
    higherThan: TernaryPrecedence
}

precedencegroup LogicalDisjunctionPrecedence {
    associativity: left
    higherThan: TernaryPrecedence
}

precedencegroup LogicalConjunctionPrecedence {
    associativity: left
    higherThan: LogicalDisjunctionPrecedence
}

precedencegroup ComparisonPrecedence {
    higherThan: LogicalConjunctionPrecedence
}

precedencegroup NilCoalescingPrecedence {
    associativity: right
    higherThan: ComparisonPrecedence
}

precedencegroup AdditionPrecedence {
    associativity: left
    higherThan: RangeFormationPrecedence
}

precedencegroup CastingPrecedence {
    higherThan: NilCoalescingPrecedence

precedencegroup AssignmentPrecedence {
    associativity: right
    assignment: true
}

precedencegroup RangeFormatPrecedence {
    higherThan: CastingPrecedence
}
profile
Don't think, just do 🎸

0개의 댓글