티스토리 뷰

Swift

Swift ) split에 대한 고찰

Zedd0202 2017. 9. 27. 23:13
반응형

녕하세요 :) Zedd입니다.

오늘은 split에 대한 고찰..?을 써볼려고해요 :)

제목은 뭔가 거창해보이지만, 그냥 split을 궁금해하는 사람들(나..)을 위해 글을 씁니다 XD

사실 split은 우리 <String 쪼개기>글에서 배웠답니다.


시작할게요!!


split에 대한 고찰



<String 쪼개기>글을 읽고오셨다면, split이 어떤 메소드인지 알 수 있을거에요.

꼭 읽고오세요!

근데 뭘 고찰하냐;; 이건 이따가 말씀드릴게요!


먼저 split에는 크게 4가지의 경우의 수를 가집니다. 


1. split(separator: Character)


바로 위 글에서 만나보았던 그런 형태죠?


var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ").map(String.init)

//Print ["Hello,", "world.", "Zedd!!", "Haha"]

(split은 꼭 map과 함께 써줘서 요소들을 String으로 만들어줘야지만 정상적으로? 출력이 된답니다.)


자.. 위 split은 separator로 " "(스페이스 하나)를 받고 그것을 기준으로 쪼개준 것 같네요.

이해가셨나요? 

이것이 가장 기본적인 split이라고 할 수 있습니다. 

두번째 경우의 수로 넘어갈게요. 


2. split(separator: Character , maxSplits: Int)


자, 이번엔 separator가 나오긴 나왔는데, maxSplits라는 Int형 파라미터 하나를 받네요.

이건 뭘해주는 걸까요?

maxSplits? 최대 쪼개기..?

maxSplits의 정의를 한 번 볼까요? 


maxSplit : 콜렉션을 분할하는 최대 횟수. 또는 반환 할 시퀀스 수(count)보다 적은 수. maxSplits은 0보다 크거나 같아야합니다. 기본값은 Int.max입니다. 


그러니까! 

간단히 생각하면 쪼개는 횟수라고 생각하시면 됩니다. 

예제를 볼까요?  


var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ", maxSplits: 1).map(String.init)

//Print ["Hello,", "world. Zedd!!   Haha"] -> count = 2


자.. 출력은 이렇습니다. 

주석의 count는 제가 이해를 돕기위해 넣었어요. :)

" "(공백)을 기준으로 쪼개줄건데, maxSplits이 1이니 한번만 쪼개줘!!가 되는거죠.

그러니까 처음만나는 Hello, 뒤에있는 공백을 만나고 한번 쪼갠 뒤, 이제 안쪼개는 겁니다. 

maxSplits에 0을 넣으면 안쪼개겠죠? 



var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ", maxSplits: 0).map(String.init)

//Print ["Hello, world. Zedd!!   Haha"] -> count = 1


이렇게요.

자, 세번째 경우의 수로 넘어갈게요!


3. split(separator: Character, omittingEmptySubsequences: Bool)


오..조금 길어졌네요. 

역시나 separator를 받고, 이번엔 omittingEmptySubsequences이라는 Bool형을 파라미터로 받습니다. 

처음에 이걸보고, 엥...했던 기억이 있네요 :)

omittingEmptySubsequences. 직독직해 ㄱ

omitting/Empty/Subsequences가 될 것 같은데..



그렇다면, omittingEmptySubsequences은 생략하다/빈/시퀀스 가 되겠네요!!11


네.....Zedd식 해석을 보았구요.....진짜 Apple식 해석을 볼까요?



omittingEmptySubsequences : false의 경우 separator의 인스턴스마다 결과에 빈(empty) 서브 시퀀스를 돌려줍니다. true의 경우, 비어있지 않은(non-empty)서브 시퀀스만 반환됩니다. 기본값은 true입니다. 



네 역시 직독직해가 짱이었습니다. 

이걸 구구절절 설명하기보다는 예제를 보시면 한번에 이해가 가실겁니다. 


1. omittingEmptySubsequences = false

var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ", omittingEmptySubsequences: false).map(String.init)

//Print ["Hello,", "world.", "Zedd!!", "", "", "Haha"]


false일때는 빈 시퀀스가 역시 포함되어서 반환되네요. 여기서 헷갈리면 안되는 것이. 빈 시퀀스입니다. 

"(공백 하나)"는 빈 시퀀스가 아닌 것을 주의하세요.

결과에서도 볼 수 있듯이 " "가 아니라 ""이 반환된 것을 볼 수 있습니다. 

여기서 split이 어떻게 되는지 말씀드리자면,


split은 처음 Hello,를 만나고 공백하나를 만나게 됩니다. 

separator가 공백하나였으니, 이 공백을 기준으로 한번 쪼개주게 되죠.

world.를 만나고도 역시 공백을 하나 만나므로, 쪼개주게 됩니다.  

마지막으로, 


"Zedd!!   Haha"

Zedd!!를 만나고 "처음에는" 공백하나를 만나기 때문에 쪼개줍니다. 

하지만 이 공백하나 뒤에는 공백 2개가 더 있죠

"Zedd!!   Haha"

자, 또 공백을 만났네요. 여기서 한번 쪼개주겠죠? 하지만 이 안에는 아무 글자가 없기때문에 ""가 리턴될거에요. 


"Zedd!!   Haha"

마지막 공백을 만났습니다. 또 한번 쪼개겠네요. 역시나 아무 글자가 없기때문에, ""가 리턴될 것입니다. 


정말 마지막으로 Haha를 만나고 문장이 끝났기 때문에 split은 최종적으로


["Hello,", "world.", "Zedd!!", "", "", "Haha"]


를 리턴합니다. 


이제 왜 Zedd!!와 Haha사이에 ""가 2번 나왔는지 이해가시나요? 



1. omittingEmptySubsequences = true

var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ", omittingEmptySubsequences: true).map(String.init)

//Print ["Hello,", "world.", "Zedd!!", "Haha"]


true일때는 위에서 나왔던 ""이 빠진 결과를 볼 수 있네요. 

omitting/Empty/Subsequences = true

생략할거니/  빈  / 시퀀스        = 응~!


이니까요!

마지막 경우의 수는


4. split(separator: Character, maxSplits: Int, omittingEmptySubsequences: Bool)



위에서 나온 maxSplits과 omittingEmptySubsequences이 전부 다 들어가있죠?

ㅎㅎ 


var str = "Hello, world. Zedd!!   Haha"

str.characters.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: false).map(String.init)

자.. 우리 위에서 전부 다 배웠죠? 위 코드의 결과는 어떻게될까요? 

일단 separator는 " "고..maxSplits가 3이네요. omittingEmptySubsequences이 false이니 빈 시퀀스를 받겠다는 거죠? 빈 시퀀스가 결과배열에 들어갈 수 있습니다. 

한번 같이 해볼까요?


"Hello, world. Zedd!!   Haha"


Hello, (공백 만남) --> 결과 ["Hello," , "world. Zedd!!   Haha"]

world. (공백만남) --> 결과 ["Hello,", "world.","Zedd!!   Haha"]

Zedd!! (공백만남) --> 결과 ["Hello,", "world.", "Zedd!!" ,"  Haha"]

자 이제 maxSplit이 3이었으니 이제 더이상 쪼갤 수 없습니다. 


눈여겨볼만한 점은 "  Haha"부분입니다. 왜 앞에 Haha앞에 공백 2개가 있는지 아시겠죠? 

omittingEmptySubsequences이 true였다고해도 maxSplits이 3이기 때문에

결과는 

["Hello,", "world.", "Zedd!!" ,"  Haha"]로 똑같습니다. 


자 이렇게 모든 경우의 split을 같이 봤는데, 이해가시나요? ㅎㅎ

잘 모르시겠다! 또는 지적할 점 등이 있다면, 댓글이나 PC화면 오른쪽 하단에 있는 채널서비스를 이용해주세요 :)

5분안에는 반드시 확인할게요 :)


보통? 1번 split만 쓰실거에요. 그래도 우리가 원하는 공백이 전부 빠져있는 결과가 나오는 이유는 maxSplits은 기본값이 Int.max이며, omittingEmptySubsequences도 true로 설정이 되어있으니까요!


 

ㅎㅎㅎ사실 이런것들이 궁금해서 이 글을 쓰게됐어요! split에 대한..고찰..맞죠?

components로는 할 수 없는 것들을 split으로는 할 수 있죠? 

< components와 split 차이 >글을 보시면 알 수 있답니다 :) 이것때문에 제가 좀 고생했었죠..

여러분들도 이런 여러가지 파라미터를 사용해서 원하는 배열을 리턴받으셨으면 좋겠어요 :)

모르고 쓰는 것 보다는 알고쓰면 좋자나요!!!


오늘도 도움이 되었으면 좋겠어요 XD




반응형

'Swift' 카테고리의 다른 글

Swift ) tuple  (3) 2017.10.02
Swift ) Types  (0) 2017.10.01
함수(Function) VS 메소드(Method)  (3) 2017.09.26
Swift ) Generic  (7) 2017.09.22
Swift ) Equatable  (4) 2017.09.18