BOID

[swift] 스위프트에서 사용하는 패턴(와일드카드 패턴, 식별자 패턴, 바인딩 패턴, 튜플 패턴) - HoonIOS 본문

swift 시작기

[swift] 스위프트에서 사용하는 패턴(와일드카드 패턴, 식별자 패턴, 바인딩 패턴, 튜플 패턴) - HoonIOS

HoonIOS 2021. 3. 26. 12:50
728x90

안녕하세요 HoonIOS입니다. :)

 

이번에는 패턴에 대해 포스팅 하려고 하는데요, 

 

스위프트 내에서는 다양한 패턴이 있습니다. 

패턴을 사용하는 이유는 이를 잘 활용하면 스위프트의 코드 양을 줄이는 효과를 나타낼수도 있고 스위프트의 문법을 좀더 효율적으로 활용할수 있습니다.

 

패턴이란?

  • 이러이러한것을 표현하고 싶다면, '이러이러한 패턴을 통해 표현하면됩니다.' 라고 이해를 하면 됩니다.
  • 대부분의 패턴은 switch, guard, if, for등의 키워드와 아주 친하고 2개 이상의 키워드가 합을 이루어 동작을 합니다.
  • 위 키워드중에서 switch구문에서 가장 강력하게 발생합니다.( 후에 예제를 통해 설명을 할테니 그냥 그렇구나 하고 넘어가셔도 됩니다.)

패턴의 종류는?

  • 값을 해체(추출)하거나 무시하는 패턴
    - 와일드카드 패턴, 식별자 패턴, 바인딩 패턴, 튜플 패턴
    (이번시간에 포스팅할 종류들 입니다.)
  • 패턴 매칭을 위한 패턴
    - 열거형 케이스 패턴, 옵셔널 패턴, 표현 패턴, 타입캐스팅 패턴

우선 값을 해체 하거나 무시하는 패턴 앞에서부터 하나씩 설명하겠습니다.

 

와일드카드 패턴이란?

- 값을 해체하거나 무시하는 패턴중 하나입니다.

- 매개변수에서 많이 사용했던 와일드카드 식별( _ )을 사용한다는것은 이 자리에 올것이 무엇이든 상관하지 말라는 뜻입니다.

- 와일드카드 식별자가 위치한 곳의 값은 무시해라라는 뜻이겠죠?

- 이 패턴은 for구문이나, switch구문에 많이 사용됩니다.

 

- switch 구문을 이용한 예제를 살펴보겠습니다.

let string: String = "ABC"

switch string {
case _: 
	print(string)
}

let optionalString: String? = "ABC"

switch optionalString {
case "ABC"?:
	print(optionalString) //optional("ABC")가 출력
case _?: //ABC빼고 나머지 값들
	print("이값은 ABC가 아님니다.")
case nil: // 값이 아예 없을때
	print("nil이니깐 값이 없습니다.")
}

let hoon = ("HOON",28,"male")

switch hoon {
case("HOON", _, _):
	print("It's HOON") //출력
case(_, _, _):
	print("아무나")
}

- 위 switch를 이용한 와일드카드문을 사용한 예시를봐도 해당하는 값이 같고 나머지가 와일드 카드 식별자로 되어있으면, 해당하는 값은 무시하고 와일드카드가 없는 실존값들만 비교해서 값을 출력합니다.

 

- 이제는 for문을 이용한 예제를 한번 살펴보겠습니다.

for _ in 0..<3 {
	print("hello")
}
/* 출력값
hello
hello
hello
*/

- for문은 와일드 카드 식별자를 사용하면 해당 변수를 쓰지않고 범위 지정자를 통해 지정해준 범위만큼 for문이 돈다고 생각하면 됩니다.

 

식별자 패턴이란?

- 값을 해체하거나 무시하는 패턴중의 하나입니다.

- 변수 또는 상수의 이름에 알맞는 값을 어떤 값과 매치시키는 패턴을 말합니다.

- 식별자 패턴의 사용의 예시를 한번 알아보겠습니다.

let sikbaul: Int = 15

- 당황하셨죠? 뭐야 이거 변수 선언하는거 아니야...? 라고 생각하셨을수 있습니다.

- sikbaul이란 상수를 선언하는 동시에 값을 할당하려고 할때 sikbaul의 타입인 Int와 할당하려는 15의 타입이 매치 된다면 sikbaul 변수는 15의 값 식별자가 되므로 식별자 패턴이 성립됩니다.

- 경우에 따라서 식별자 패턴은 값 바인딩 패턴의 일종이라고 할수 있습니다.

- 너무나 당연하게 쓰인 패턴인데 저는 이게 식별자 패턴이라고 생각을 못했네요 ㅎㅎㅎㅎ

값 바인딩 패턴이란?

- 변수 또는 상수의 이름에 매치된 값을 바인디이라고 합니다.

- 앞에서 설명한 식별자 패턴은 매칭되는 값을 새로운 이름의 변수 또는 상수에 바인딩을 합니다.

- 값 바인딩은 튜플의 요소를 해체하여 그에 대응하는 식별자 패턴에 각각의 요소 값을 바인딩 하는것입니다.

 

- switch 구문을 예로들어 설명해 보겠습니다.

switch hoon {
//각각의 상수 값에hoon의 요소를 바인딩 합니다.
case let (name,age,gender):
	print("\(name) \(age) \(gender)")
}

switch hoon {
case (let name, let age, let gender):
	print("\(name) \(age) \(gender)")
}

switch hoon {
//값 바인딩 패턴과 와일드카드 패턴을 결합해서 사용이 가능하다.
case (let name, _, let gender):
	print("\(name) \(gender)")
}

- hoon에 값들을 각 요소에 바인딩하여 출력하는 값이다. 3번째 switch문을 보면은 와일드카드 패턴과 같이 쓰인것을 확인할수 있습니다.

 

튜플 패턴이란?

- 소괄호 ( ) 내에 쉼표로 분리하는 리스트입니다.

- 예를들어 보겠습니다.

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

- 이 예제의 튜플에대해 해석해보면 (x,y): (Int, Int) 이 튜플 패턴은 요소가 모두 Int타입인 튜플하고만 매치가 된다는 의미입니다.

- 만약 튜플 패턴을 for구문이나 변수, 상수 선언에 사용하면 다른 패턴들과 함께 사용할수 있습니다.

 

- 또다른 예제의 코드를 보고 살펴 보겠습니다.

let (test): Int = 2
print(test) // 2

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

let name: String = "Lee"
let age: Int = 28
let gender: String? = "Male"

//와일드카드 패턴과 동시사용
switch(name,age,gender) {
case("Lee", _, _):
	print("It's Lee")
case(_, _, "Male"):
	print("it's man but i'dont know")
default:
	print("who?")
}

- 튜플에다가 선언및 값을 넣어주고 출력을 하기도 하고 각 변수에 값을 넣어 ( , ) 튜플 형태로 case문을 통해 와일드카드 패턴을 이용해 비교할수 있습니다.

 

 - 배열에 튜플패턴을 이용한 예제를 살펴보겠습니다.

let points:[(Int, Int)] = [(0,0),(1,0),(1,1),(2,0),(2,1)]

for(x,_) in points {
	print(x)
}
/* 출력값
0
1
1
2
2
*/

- 이렇게 배열에 튜플패턴으로 값을 넣어 for문과 와일드카드 패턴을 통해 값을 추출할수 있는것을 확인 할수 있습니다.

 

이번 포스팅에는 값을 해체(추출)하거나 무시하는 패턴에 있는 패턴에 대해 포스팅 해봤는데요, 그동안 코딩하면서 제가 모르는 사이에 패턴을 쓰고있다는게 느껴져 새롭기도 하고 앞으로 코드의 양을 줄이기위해 한번 다뤄보도록 노력해야 될꺼같아요 ㅎㅎ 

 

다음에는 패턴 매칭을 위한 패턴인 열거형 케이스 패턴, 옵셔널 패턴, 표현 패턴, 타입캐스팅 패턴 에 대해 살펴 보겠습니다;

반응형
Comments