프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

82. 문자열 쪼개기 StrSplit


이번 강에서는 전체 문자열을 쪼개서 배열로 만들어주는 StrSplit 함수를 배워보겠습니다.

StrSplit

StrSplit 함수는 전체 문자열을 하나의 단일 문자를 기준으로 분할하여, 각 분할된 부분을 요소로 하는 배열을 반환하는 역할을 합니다.

전체 문자열을 콤마를 기준으로 쪼개서 각 배열 칸에 배치된 모습 사진 1. StrSplit 함수의 동작
StrSplit(String [, Delimiters, OmitChars, MaxParts])
StrSplit 함수의 원형
  • String: 전체 문자열(가공할 문자열)입니다.
  • Delimiters: 쪼갤 기준이 될 '구분자'입니다. 여러 문자를 지정 가능합니다.
  • OmitChars: 배열 요소의 양 끝에서 제외할 문자입니다. 여러 문자를 지정 가능합니다.
  • MaxParts: 최대로 분할할 개수입니다.

어렵지 않습니다. 기본적으로 String에 전달된 문자열을, Delimiters에 적은 문자를 기준으로 분할하여 반환한다고 생각하시면 됩니다. 단, Delimiters를 생략하면 한 글자씩 쪼개서 배열로 만들어줍니다. 그리고 단일 문자가 아닌 여러 문자열이 담긴 배열을 전달하여 각 문자열을 모두 구분자로 쓸 수 있습니다. 예를 들어서 [1, 2]를 Delimiters로 전달하면 1에서도, 2에서도 분할됩니다.

OmitChars는 배열 요소의 양 끝에서 제거할 문자며, 예를 들어서 분할된 문자열의 끝에서 개행을 제거하고 싶다면 `n을 적어주시면 됩니다. 참고로, Delimiters가 `n을 기준으로 분할할 땐 `r을 OmitChars에 적어주세요. 이유는 후술하겠지만 강좌와 조금 동떨어진 내용이기 때문에 Tip 상자에 적겠습니다.

MaxParts는 분할된 요소의 개수 최대치를 정해줍니다. 즉 2를 적으면 반환 배열은 최대 두 개의 요소를 가지게 됩니다. 분할되지 않고 남은 문자열은 배열의 마지막 요소에 한번에 들어가게 됩니다.

Tip: 개행을 구분자로 쓸 때 `r을 OmitChars로 전달해야 하는 이유?

여러분이 쓰고 계시는 Windows 운영체제는 줄바꿈을 `r`n으로 표현합니다. `rCR(Carriage Return), `nLF(Line feed)라고 부릅니다. 두 문자를 써야 비로소 줄바꿈 하나를 표현할 수 있는 것입니다.

이는 자판의 원조인 '타자기'부터 내려오는 역사 때문인데, 그 시절엔 새 줄을 시작하려면 '입력 위치를 종이의 맨 처음으로 가져오는 동작'과 '입력 위치를 다음 줄로 내려주는 동작'을 했기 때문입니다. 횡으로 처음 위치로 옮기고, 종으로 다음 줄로 내리는 것이죠.

이것이 유산으로 남아 Windows에서는 CR+LF를 하나의 줄바꿈으로 이용하게 되어서, 각종 텍스트 파일을 CR+LF를 줄 끝으로 하여 저장하게 됩니다. 그러나 대부분의 상황에선 LF(`n)만 써도 정상적으로 보이기 때문에 MsgBox등에 출력해줄 땐 `n만 넣어서 개행을 해준 것입니다.

문제는 StrSplit 및 관련 함수는 String 매개변수에 오는 문자열이 보통은 그때 그때 다르다는 점입니다. 입력으로 주어진 문자열의 줄 끝이 `n일지, `r`n일지는 상황에 따라 다릅니다. 프로그래밍에서 문자열을 줄 단위로 다룰 때 `r을 고려하지 않으면 원하는 대로 동작하지 않을 수 있습니다. `r은 기본적으로 눈에 보이지 않는 문자이기 때문에 이것이 남아있을 경우 디버깅에 꽤 많은 수고를 들이게될 수도 있고요.

이것이 StrSplit의 OmitChars 매개변수로 `r을 전달해주는 이유입니다! 문자열을 `n으로 분할할 때 `r을 선제적으로 제거해주지 않으면, 남아있는 이 문자 때문에 향후 문자열 가공이 제대로 되지 않는 등의 문제가 생길 수 있습니다.

실습

1. 어절 단위로 분할하여 출력하기

주어진 문자열을 어절 단위로 분할하여(=공백을 기준으로 분할하여) 배열에 담은 후, 각각 MsgBox로 출력해봅시다.

1context := "국가는 평생 교육을 진흥하여야 한다!"
2splitedText := StrSplit(context, " ")
3Loop splitedText.Length
4    MsgBox(splitedText[A_Index])
예제 1. context 변수를 공백으로 쪼개서 각각 출력

하나씩 살펴보면 어렵지 않을 것입니다. 오늘 배운 부분은 2번 줄에 있는데요, 분리할 문자열은 context 변수로, 구분자는 띄어쓰기로 해주었네요. 그 밑은 그냥 배열을 순회하며 하나씩 출력하는 것 뿐입니다.

2. 줄바꿈 단위로 분할하여 출력하기

1context := "모든 국민은 평생에 걸쳐 학습하고`n능력과 적성에 따라 교육받을 권리를 가진다"
2splitedText := StrSplit(context, "`n", "`r")
3Loop splitedText.Length
4    MsgBox(splitedText[A_Index])
예제 2. context 변수를 개행으로 쪼개서 각각 출력

예제 1과 거의 똑같은 구조입니다. 차이점이 있다면 개행을 구분자로 삼았다는 것과, 본문에서 강조했다싶이 개행을 구분자로 삼았기 때문에 `r을 OmitChars로 전달해 주었다는 것이죠.

이 예제의 context는 개행으로 `n만 사용했지만, 실제 상황에서는 `r`n로 줄 구분이 되어있는 경우가 더 많습니다. 따라서 위와 같이 항상! Delimiters가 `n면 OmitChars는 `r로 적어주는 습관을 들여야합니다.

질문하러 가기