본문 바로가기
Learnings/Swift & iOS

===와 !==, 참조 비교 연산자 - Swift

by abcdesong 2021. 1. 13.

노션에서 보기

 

LeetCode의 Linked List Cycle 문제를 풀다가

===~=와 헷갈리는 바람에 gae고생을 하였다.

 

너무 크게 얻어 맞은 느낌이라 정리를 안 해도 까먹진 않을 것 같지만...

그래도 그냥 넘어가면 아쉬우니 정리를 해보려고 한다.



비교 연산자 (Comparison Operator)

===~= 모두 비교 연산자에 속한다.

=== 의 반대 격이라고 할 수 있는 !== 도 당연히 비교 연산자다.

 

연산자 설명
== A == B : A와 B의 value가 같은가
!= A != B : A와 B의 value가 다른가
> A > B : A의 value가 B의 value보다 큰가
< A < B : A의 value가 B의 value보다 작은가
>= A >= B : A의 value가 B의 value보다 크거나 같은가
<= A <= B : A의 value가 B의 value보다 작거나 같은가
=== A === B : A와 B의 reference가 같은가
!== A !== B : A와 B의 reference가 다른가
~= A ~= B : A와 B의 pattern이 일치하는가

 

초보 입장에서 값 비교를 할 일은 많아도

참조나 패턴 비교를 할 일은 비교적 적다 보니 이해도가 낮았던 것 같다.



✏️ reference 비교 예시

class는 참조 타입의 대표격이라고 할 수 있다.

 

비교 연산을 실험해보기 위해 Book이라는 class를 생성했다.

class Book {
    let title: String
    let author: String

    init(title: String, author: String) {
        self.title = title
        self.author = author
    }
}

 

그리고 4개의 인스턴스를 생성해준 뒤, bookShelf에 3권을 담았다.

let book1 = Book(title: "Swift왕 김애플", author: "김애플")
let book2 = Book(title: "사과 농장 차리는 방법", author: "김애플")
let book3 = Book(title: "와장창 알고리즘", author: "와장창")
let book4 = Book(title: "와장창 자료구조", author: "와장창")

var bookShelf = [book1, book2, book3]

 

그리고 당근마켓을 들어갔더니 탐나는 개발 서적들이 올라와 있었다.

갑자기 시작된 스토리텔링

let 🥕market = [book1, book3, book4]

 

이미 가진 책은 구매할 필요가 없으므로,

내가 가진 책이 무엇인지 파악해보기 위해 참조 비교를 해보았다.

for 🥕 in 🥕market {
    for mine in bookShelf {
        if 🥕 === mine {
            print("\(🥕.title)은 이미 가지고 있다.")
        }
    }
}
//Swift왕 김애플은 이미 가지고 있다.
//와장창 알고리즘은 이미 가지고 있다.

 

print 결과를 통해 === 연산의 결과가 true인 책들(book1book3)을 걸러낼 수 있었다.

 

이처럼, ===은 두 인스턴스의 참조가 같은 경우 true이며, 반대인 !==은 참조가 다를 경우 true이다.

print(book1 === book2) //false
print(book1 !== book2) //true

 

참조가 같다는 것은 title과 author에 할당된 값이 일치하는 것과는 다르다.

아래의 예시를 보면, book5에 book4와 같은 프로퍼티 값을 담은 인스턴스를 생성해주었지만 === 연산 결과는 false인 것을 알 수 있다.

let book5 = Book(title: "와장창 자료구조", author: "와장창")
print(book5 === book4) //false

 

book4의 참조를 그대로 받은 book6의 경우엔 === 연산 결과가 true인 것을 알 수 있다.

let book6 = book4
print(book6 === book4) //true



이젠 까먹을 수 없다.

댓글