大器晩成
&& 쓸까? , 쓸까? Swift가 알려준다! 본문
우리는 이미 gurad문이나 if 문을 사용할 때, ", "를 자주 사용한다. 그러면 둘의 차이는 있을까? 아니면 없을까?
참고 자료 중 Soojin Ro 블로그에 따르면 콤마는 codition을 이어 붙이는 용도로 쓰는 것이고 &&는 두 개의
Boolean expression 파라미터로 받는 논리 연산자이다.
쉽게 와닿는 부분은 아닌지만, Swift 공식 문서에 따르면 condition들을 condition list라고 지칭한다.
condition에는 다음과 같은 항목이 포함된다.
- Expression
- avaliablity - condition
- case-condition
- optional-binding-condition
여기서 우리가 알 수 있는 건 "condition을 condition 또는 condition-list'라고 이야기할 수 있으며,
Expression은 하나의 Condition이라고 이야기할 수 있다.
예제로 살펴보자
if 1 == 1 , 2 == 2{
print(true)
}
if 1 == 1 && 2 == 2 {
print(true)
}
Playground에서 위와 같은 형태는 정상적으로 true가 출력되는 것을 확인할 수 있다.
둘 다 기능적으로 동일하지만 컴파일러 입장에서는 다르게 표현이 될 것이다.
let optionalA: Int? = 10
let optionalB: Int? = 20
// works
if let a = optionalA, let b = optionalB {
print(a,b)
}
// error
if let a = optionalA && let b = optionalB {
print(a,b)
}
하지만 이런 식으로 옵셔널 바인딩을 할 때 &&는 "Expected ', ' joining parts of a multi-clause condition"
오류가 발생하는 것을 확인할 수 있다.
이때 첫 번째는 condition-list를 사용한 거지만, 두 번째의 경우에 은 bool expression이 아니기 때문에 문제가 발생하는 것이다.
내부적으로 어떻게 처리되길래 이런 현상이 발생할까?
extension Bool {
@_transparent
@inline(__always)
public static func && (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows
-> Bool {
return lhs ? try rhs() : false
}
스위프트 오픈소스를 보면 &&는 위와 같이 구성되었다. 왼쪽값이 True면 True를 false면 더 이상 계산을 하지
않는다. 그렇기 때문에, 바인딩 같은 경우에서는 T/F의 조건이 나올 수 없기 때문에, &&을 사용할 수 없는 것이다.
Short-Circuit Evaluation: 조건들은 왼쪽에서 오른쪽으로 순차적으로 평가되며, 앞의 조건이 false일 경우 뒤의 조건은
평가되지 않는다. 이를 통해 불필요한 연산을 피하고, 예기치 않은 오류를 방지할 수 있다.
(콤마보다 성능이 빠르다)
condition을 사용할 경우 컴파일러는 중첩된 If처럼 처리한다.
if conditionA, conditionB {
if conditionA {
if conditionB {
let b: Int? = 10
//work
if let a = b, a > 10 {
}
//error
if let a = b && a > 10 {
}
중첩되지 않았으니, 스코프 내에서는 일단 "a"를 찾을 수 없다.
그리하여 두 번째 조건문에서는 "Cannot find 'a' in scope"의 오류가 발생한다.
if b != nil {
let a = b!
if a > 10 {
}
}
동작하는 코드를 풀어서 보면 위에 코드와 동일하다.
**[정리]**
condition-list는 스위프트 (5.1 이후)에서 생긴 문법이고, &&는 그냥 연산자일 뿐이다. &&은 condition이지만,
condition은 expression이 아니다.
위에서 condition은 condition-List라고 할 수 있다고 했는데, 그럼 두 개는 동일한가??
일반적으로는 동일할 수 있지만, repeat while Block에서는 contion-list는 사용할 수 없기 때문에,
구분을 해서 사용하는 게 맞다. 하지만 코드를 작성하면서 repeat - while문을 작성하는 경우가 많을까?..
참고 자료
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/statements/
https://soojin.ro/blog/swift-comma-vs-and-operator
'iOS > Swift 문법' 카테고리의 다른 글
싱글톤 패턴 Class / Struct 차이 (0) | 2025.03.19 |
---|---|
Result Type (0) | 2025.03.03 |
제네릭(Generics) (0) | 2025.03.03 |
에러 처리 (Error Handling) (0) | 2025.03.03 |
캡처리스트 (0) | 2025.03.03 |