이번 글에선 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 안에 넣어서 처리해야겠습니다.