大器晩成

&& 쓸까? , 쓸까? Swift가 알려준다! 본문

iOS/Swift 문법

&& 쓸까? , 쓸까? Swift가 알려준다!

zerobugpark 2025. 4. 30. 23:16

 

우리는 이미 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

https://stackoverflow.com/questions/44989227/separating-multiple-if-conditions-with-commas-in-swift?utm_source=chatgpt.com

 

728x90

'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