[SWIFT] Patterns, Pattern Matching - 패턴과 패턴매칭 (1)

2021. 1. 10. 16:07SWIFT

반응형

오랜만에 SWIFT 문법에 대해 작성을 해보네요..!!

 

오늘은 SWIFT 문법의 패턴과 패턴 매칭에 대해 작성해볼까 합니다.

 

딱 패턴, 패턴 매칭 두 단어를 듣고 오는 느낌은 어떻나요?

 

패턴은 어떤 구조를 정형화시켜서 나타나는 느낌(?) 같죠.

패턴 매칭은 이러한 패턴을 찾아내는 것을 말하는 것 같죠.

 

말의 뜻은 알겠지만 저게 SWIFT에서 어떻게 쓰이지..?

느낌이 잘 오지 않죠.

 

지금부터 패턴들을 하나하나 보면서 패턴과 패턴매칭을 위한 패턴이 어떻게 사용되나 볼게요~~

 

 

와일드 카드 패턴(Wildcard Pattern)

와일드 카드 패턴은 여기에 들어오는 값은 모두 값을 무시하고 동일하게 처리할 수 있습니다.

밑줄("_") 식별자를 사용합니다.

크게 사용되는 곳은 for-in, switch 구문들을 자주 볼 수 있는데요.

 

한번 예제로 알아볼게요!

for _ in 0...3 {
    // Wildcard Pattern
}

이렇게하면 0~3까지의 값은 의미가 없고 그냥 반복할 뿐이죠..?

원래는 _ 자리에 다른 문자를 넣어서 대입하여 사용하지만 와일드카드 패턴은 모든 값을 일치시키고 무시합니다!

 

그렇다면 이번엔 switch문 예시를 통해 어떻게 사용되는지 볼게요.

// String
let some: String = "Hi"

switch some {
    case _: print("some")
}

// Tuple
let tuples: (String, String, Int) = ("Hi", "Dong Dong", 100)

switch tuples {
    case (_, _, 100): print("100이 들어올때만 실행")
    case ("Hi", _, _): print("Hi가 들어올때만 실행")
    case (_, _, _): print("모든 값 상관없음")
}

밑줄("_") 식별자를 사용해서 어떤 값이 들어와도 일치시키고 실행되는 것을 알 수 있죠?

튜플에서 사용한 예시는 각 자리에 밑줄("_")을 사용해서 그 자리에 오는 값은 상관없이 일치시킨다는 뜻이에요!!

그렇다면 모든 자리에 밑줄("_")을 넣으면 어떻게 될까요?

 

전부 무시되겠죠?

어떤 경우라도 저 구문으로 들어와서 실행되게 될겁니다!

 

와일드 카드 패턴은 느낌이 오시나요?

 

 

식별자 패턴(Identifier Pattern)

식별자 패턴은 아마 가장 익숙하고 아 이런것도 패턴이라고 하구나라고 사소하지만 당연한 패턴입니다!

변수나 상수에 이름에 맞게 값을 바인딩시키는 패턴입니다.

 

예로 바로 볼게요.

쉽게 알 수 있을거에요

let someValue: Int = 42
var somethingValue: Int = 42

 

바로 아시겠죠..?

 

저희가 그냥 변수에 값을 할당하고 사용하는 것이 이 식별자 패턴이라는 것 때문이었어요.

패턴인지도 모르고 그냥 당연하게 사용해왔는데, 이제부터는 식별자 패턴(..?!)이라고 하면 될 것 같아요.

 

쉬웠죠?

 

 

값 바인딩 패턴(Value-Binding Pattern)

값 바인딩 패턴은 기존에 식별자 패턴으로 바인딩 된 값들을 새로운 변수에 바인딩하는 것입니다!

 

튜플이나 열거형에서 자주사용할 수 있을 것 같은데, 예시로 알아볼게요.

let food = ("Pizza", "Chicken")

switch food {
case let (food1, food2): 
    print("\(food1), \(food2)")
case (let food1, let food2):
    print("\(food1), \(food2)")
}

우선 튜블로 알아봤어요.

 

둘다 동일하게 사용할 수 있는 패턴이랍니다.

첫번째는 let을 앞으로 빼줬을 뿐이고 두번째는 넣어 준것이랍니다.

 

저기에 저희가 배웠던 와일드 카드 패턴도 결합할 수 있겠죠?

let food = ("Pizza", "Chicken")

switch food {
case (let food1, _):
    print("\(food1)")
}

이렇게 활용하시면 될 것 같습니다.

 

그렇다면 열거형에서도 어떻게 사용하는지 볼게요.

enum Job {
    case student
    case teacher(Int)
}

let job: Job = Job.teacher(1000)

switch job {
case .student: print("Student")
case .teacher(let sallery): print(sallery)
}

바로 이런식으로 사용할 수 있어요!

sallery에 값을 가져와서 새롭게 바인딩해서 사용하는 방식이죠.

 

값 바인딩 패턴도 어떤 것인지 알 수 있겠죠?!

아마 다들 아무렇지 않게 사용했던 패턴일 수도 있어요~

 

 

튜플 패턴(Tuple Pattern)

튜플 패턴은 튜플을 이용해서 기존의 튜플 값들을 값을 매칭하는 것입니다.

 

한번 예시로 바로 알아볼게요.

let (x, y): (Int, Int) = (1, 2)
print(x)
print(y)

 

 

우선 가장 기본적인 활용방법입니다.

(x, y): (Int, Int)에 기존에 튜플 값을 할당하는 방법입니다.

 

(x, y)에 (1, 2)의 값들이 각각 할당되었죠?

 

조금 더 활용해서 사용할 수 있는데,

이번에는 switch 문에서 활용을 해볼게요.

let pointX: Int = 0
let pointY: Int = 5
let pointZ: Int = 10

switch (pointX, pointY, pointZ) {
case (0, _, _): print("pointX is 0")
case (_, 5, _): print("pointY is 5")
case (_, _, 10): print("pointZ is 10")
case (_, _, _): print("All Case")
}

 

지금까지 사용했던 와일드 카드, 식별자, 튜플 패턴들을 활용해서 사용했죠?

 

튜플 패턴은 pointX, pointY, pointZ로 새롭게 만들어서 사용하는 것을 알 수 있죠.

그리고 케이스문을 검사할 때, 와일드 카드 패턴을 활용해서 원하는 값이 들어왔을 경우에만 실행할 수 있게 분리해보았어요.

 

튜플패턴도 크게 어렵지 않게 알 수 있었죠?!

 

 

이렇게 오늘은 SWIFT의 패턴과 패턴 매칭에 대해 알아보았어요.

아직 끝나지 않았다는거.... 패턴은 더 남았어요.

 

다음시간에 연결해서 또 알아볼게요!

 

오늘 포스팅한 내용에서 더 궁금한 것이나 잘못된 점있으면 지적해주세요 :)

감사합니다 🙌

반응형