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인 책들(book1
과 book3
)을 걸러낼 수 있었다.
이처럼, ===
은 두 인스턴스의 참조가 같은 경우 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
이젠 까먹을 수 없다.
'Learnings > Swift & iOS' 카테고리의 다른 글
[iOS] UIScrollView 만들기 (0) | 2021.03.15 |
---|---|
Swift Protocol - CustomStringConvertible 간단 정리 (0) | 2021.02.15 |
Swift 지연실행 실험 - NSTimer, asyncAfter, DispatchSourceTimer (0) | 2021.01.27 |
고차함수 내용정리 (map, filter, reduce) (1) | 2021.01.06 |
REPL로 swift하기: invalid active developer path error 해결 (0) | 2020.12.20 |
댓글