본문 바로가기

IT for my Life

Autohotkey: SafeArray vs 일반 Array

이번 글에선 SafeArray 일반 Array 차이점에 대해 썰을 풀어볼게요. Array "여러 대상을 담아두는 그릇"이라고 할 수 있죠. 예를 들어 내가 가진 과일을 코딩으로 보여주고 싶다면 이렇게   있어요.

myFruits:=[“Apple”, “Banana”, “Citrus”]

 

이렇게 선언한 Array에는 insert push 명령이 모두 먹힌답니다. insert 특정 위치에 새로운 아이템을 삽입하는 명령어, push 새로운 아이템을 array 끝에 삽입하는 거예요.

myFruits.insert(1, “Pear”)

 

이러면 myFruits [“Apple”, “Banana”, “Pear”, “Citrus”] 되죠. (Array 시작은 1번이 아닌 0번입니다.) 여기서 SafeArray 특별한 녀석이 끼어듭니다. ComObjArray라고도 하죠. 비어있는 다차원 Array를 지정할  이런 식으로 많이 하는데,

emptyArray:=[3, 1]

SafeArray 내부에 VT_VARIANT라는 갚을 지정해줍니다 값은 Excel 기준으로 12고요.

emptyArray:=ComObjArray(VT_VARIANT:=12, 3, 1)

Array를 이렇게 선언하면 SafeArray가 됩니다. 사실 수동으로 SafeArray 지정할 일은 거의 없어요. ComObj Excel 시트를 연결하고 원하는 범위의 값을 Array 긁어오면 자동으로 SafeArray 잡히거든요. 예를 들어 이런 거죠.

safeArray:=myExcel.Sheets(1).Range(“A3” “:” “A” lastRowDownloaded).value2

 

이렇게 ComObj 끼고 선언한 SafeArray insert와 push 명령어가 안 먹혀요. 호텔을 예로 들면 일반적인 Array 숙박 손님을 바꿀 수도 있고 호텔 방이 모자라면 증축할 수도 있지만, SafeArray로 지어진 호텔은 숙박 손님 변경만 되지 증축은  된다는 소리죠. 그래도 손님 변경이나마 되니까 다행이에요. 왜냐하면 SafeArray 가져온 텍스트를 StrSplit, StrReplace, RegExReplace, RegExMatch 등의 명령어로 마음껏 꾸며줄 수 있거든요. 특히나 현재 Excel 자체적으로 Regex 지원하지 않으므로 SafeArray로 가져오면 RegEx를 쓸 수 있어서 엄청나게 강력하답니다.

 

결국 당장은 호텔의 증축이 아닌 호텔 옆에 새로운 호텔을 올리는 방법으로 해결했어요. SafeArray로 처리할  있는 부분은 SafeArray,  되는 부분은 ComObj 직접 처리하는 거죠. 문제는 속도죠, 뭐... 데이터가 SafeArray 안에 들어 있을  KTX 급으로 빠릿빠릿하다가 ComObj 나오는 순간 비둘기호 속도로 떨어져 버려요. 당분간은 이렇게 사용하다가 해결책이 나오면 전체 코드를 다시 SafeArray 안에 넣어서 처리해야겠습니다.