안녕하세요.
윗행 내용을 아래행에 그대로 복사하는 방법에 대해 여쭙습니다. 간단한 질문이라 바로 이해가능하지만
아래 그림으로 보시면, 무슨 질문인지 1초 안에 더 빨리 이해할 수 있습니다.

질문은 위와 같이 매우 간단합니다.
그러나 저는 이 문제로 무려 3개월 동안 고민중에 있습니다.
왜냐하면 0.000001초 라도 더 빠른 방법을 찾고 있습니다. 방법을 알려주시면 감사하겠습니다.
위 예제는 첨부파일로 올렸구요. 파일안에 버튼이 3개가 있는데 윗행을 아랫행에 그대로 복사해주는 방법 3개입니다. 네. 이미 제가 사용하고 있는 방법입니다. 그런데 더 빠르게 하는 방법을 찾고자 여기에 질문드립니다.
- 첫째방법 : 원본_범위.Copy 대상_범위
말그대로 윗행을 copy 하여 붙여녛기를 실행합니다. 가장 느립니다. 이 방법은 아예 안쓰고 있습니다.
- 둘째방법 : 대상_범위 = 원본_범위.Value
윗행의 Range 값을 그대로 아래행에 입력하여 결국 동일내용이 셀에 들어가게 하는 방법입니다. 이 방법은 Copy 를 사용하지 않았습니다. 좀 빠르긴 한데 이보다 더 빠른 방법을 찾고 있습니다.
- 셋째방법 : Range("A3:K3") = Arr
배열에 넣고 한방에 뿌려주는 방법입니다. 더더 빠른 방법을 찾다가 배열도 생각했는데요. 제 생각에 가장 빠를 거 같다고 생각하는데, 정말 가장 빠른 방법인지도 의문이고, 이 보다 더 빠른 방법을 찾고 있습니다. 또는 제가 소스상에서 배열에 넣는 이 방식이 빠르지도 않은거 같고, 더욱 빠르게 배열에 넣는 방식이 있는 거 같기도 하구요. For 문 안돌리고 Range 내용을 배열에 자동으로 할당시키는 방법이라도요. 그러면 배열방법중 더 빨라질 수도 잇을거 같구요.
이상과 같이 제 방식은 위 3개이구요. 여기 엑셀고수선생님께서 속도를 빠르게 할려면 [ 셀.Value 접근을 최대한 줄이고, 메모리상에서 계산이 이루어지도록 해야한다 ] 고 하시더라구요. 저는 이 말씀이 무엇인지 처음에 이해를 못하다가, 최근에야 저 말씀이 얼마나 중요한 건지 경험하게 되었습니다. 그래서 메모리상에서 계산을 할려면 어떻게 해야할까? 에 대해서도 고민중입니다. 제발 어쨌든 최대한 빠르게 하는 방법을 요청드리오니 해결책을 제시하여 주시면 감사드리겠습니다.
제 질문의 요약 :
위 3가지 방법보다 더욱 빠르게, 0.00001초라도 더 빠르게 [ 윗행을 아랫행에 입력 ] 해주는 방법을 찾고 있습니다. 올려드린 예제에는 셀이 10개 뿐이라 아무 차이가 없이 다 빠르게 보이지만, 하나의 행이 100만개 셀이 있고 이걸 아래행에 붙여넣기 한다면, 1행 복사에 1시간이 걸릴 수도 있잖아요. 그러니 이는 매우 중요한 이슈라고 봅니다.
답변하시는 분께서 산만해질까봐 아래에 질문을 각각 나눔(재빨리 답변가능) :
질문 1 : 빠르게하는 소스코딩, 빠르게 구현하는 아이디어, 방향 등은 무엇이 있을까요? 0.00001초 라도 빨라지면 너무 기쁠것 같습니다.
답변:
질문 2 : 엑셀내부에 [ 윗행을 아랫행에 그대로 복사해주는 기능을 컴파일하여 ] Library인가 Object 인가에 아예 끼어넣기를 할 수도 있나요? 이게 가능한가요?
답변 :
- 이 질문을 하는 이유 : 어디에선가 이러면 더 빨라질 수도 있다는 글을 본거 같아서요. VBA 소스코딩은 인터프리터 방식이라 이걸 읽고 실행하는데까지 시간이 걸린다는 말을 여기 엑셀고수님들 글에서 본거 같아서요. 동일한 동작을 셀수식으로 구현한 것과, VBA소스로 구현한 방식중, 무엇이 더 빠르냐? 질문한 적이 있는데, 다들 [ 단연코 셀수식이 수십배 더 빠르다 ] 라고 대답해주시더라구요. 아~ 그때 알게 되었습니다. 이왕이면 셀수식이 있다면 그걸 쓰는게 맞지 복잡하게 VBA로 따로 소스코딩을 하는 것은 바보같은 짓이라는 것을 알게 되었습니다. 아~ 그래서 소스코딩만 생각할 것이 아니라 엑셀의 내부기능(?) 적인 대안을 찾는 것도 방법일 수 있겠다는 생각을 하게 되었습니다.
질문 3 : 기타 어떻게 해야 좀더 빠르게 0.00001초라도 빠르게 하는 방법에 대해서, 생각나는 거 아무거라도 적어주시면 감사하겠습니다.
답변 :
이상입니다. 감사합니다.
안녕하세요~
먼저 결론부터 말씀드리면,
"윗행을 아래행에 그대로 입력”라는 단일 동작만 놓고 보면,
지금 쓰고 계신 2번 방식이 이미 이론적으로 거의 최적으로
그 이상 "0.00001초"를 줄일 수 있는 여지는
거의 전부 VBA와 Excel를 왕복하는 셀 접근 횟수, 화면 갱신, 계산, 이벤트 쪽에서 나온다고 볼 수 있고,
"배열에 For로 직접 담는 방식"은
오히려 셀 접근 때문에 느린 쪽에 가깝습니다.
아래에서 왜 그런지,
그리고 실전에서 실제로 더 빨라지게 만드는 포인트만 정리해 보도록 하겠습니다.
물론 개발자 별로
다양한 접근방식이 있을 수 있고,
실무에서 여러 작업 환경과 변수에 따라
실제 퍼포먼스는 다를 수 있습니다.
1. 위에서 제시하신 3가지 버전을 살펴보면,
(1) 첫번째 버전인
값 + 서식 + 조건부서식 + 유효성검사 + 코멘트 등 온갖 것들을 전부 처리해야 하고
클립보드까지 끼어들어서 당연히 가장 느린 게 정상이고.
더군다나 "값만" 복사할 때는 성능 관점에서 쓸 이유가 거의 없습니다.
(2) 두번째 버전인
이 코드의 핵심은
"한 번에 Range 단위로 읽고, 한 번에 Range 단위로 쓰는 것"인데,
내부적으로는 Variant(1 To 1, 1 To N) 같은 2차원 배열로 전달됩니다.
VBA 입장에서 보면,
엑셀에서 읽기 1번 호출해서 2차원 Variant 배열로 수신해서
엑셀에서 쓰기 1번 호출하여 같은 배열을 다른 Range에 뿌려줍니다.
즉,
COM 호출이 딱 2번이라서 이 이상
"알고리즘적으로 줄일 수 있는 여지가 거의 없다"고 할 수 있습니다.
물론
Value 대신 Value2를 쓰면,
통화/날짜 형 변환 같은 부가 처리가 빠져서 아주 약간 더 빠른 경우가 많습니다.
(3) 세번째 버전인
For 루프로 직접 배열에 담는 방식인
Dim i As Long Dim Arr(10) As Variant For i = 0 To 10 Arr(i) = Cells(2, i + 1).Value Next i Range("A3:K3").Value = Arr병목은 이 부분입니다.
Cells(2, i + 1).Value는
매번 엑셀에 왕복 호출입니다.
여기서는
11번 호출하지만 실무에서는 수천~수만 번 될 수도 있을 겁니다.
반면 위의 두번째 방식은,
딱 2번 호출하는데 반면에
이러한 배열 방식은
"배열이라서 빠른 게 아니라, 셀을 여러 번 호출해서 오히려 더 느려지는" 코딩으로
"배열"이 빠른 게 아니고, "범위를 통째로 배열로 한 번에 가져오는 것"이 빠른 것입니다.
2. 실질적으로 가장 빠른 기본 패턴을 제시하자면,
Sub FastCopyRow() '// 윗행을 아랫행에 최단 경로로 복사 Dim ws As Worksheet Dim src As Range, dst As Range Dim v As Variant Set ws = ThisWorkbook.Worksheets("Sheet1") Set src = ws.Range("A2:K2") Set dst = ws.Range("A3:K3") v = src.Value2 '// 시트 접근 1번 dst.Value2 = v '// 시트 접근 1번 End Sub사실상 dst.Value2 = src.Value2를 코드로 풀어쓴 것이라,
성능은 2번 방법과 동일 수준입니다.
다만 이 형태로 만들어 두면,
v를 재사용해서 여러 행에 찍을 때
또는 나중에 메모리에서 값을 살짝 가공하고 찍을 때
더 유연해집니다.
3. "정말 엄청 많이" 복사할 때,
최적의 패턴은
질문에서
"행에 셀이 100만 개 있다면"이라고 하셨는데,
실제로는 열 개수는 16,384개(XFD열)라서, "한 행에 100만 셀"은 불가능하지만,
100만 행까지 세로 복사는 가능하니, 그 관점에서 보겠습니다.
즉,
동일 행을 아래로 수만, 수십만 번 복사한다면
이때는 엑셀 자체 기능인 AutoFill이 가장 빠릅니다.
Sub FastFillDown() Dim ws As Worksheet Dim src As Range, dst As Range Set ws = ThisWorkbook.Worksheets("Sheet1") Set src = ws.Range("A2:K2") '// 기준 행 Set dst = ws.Range("A2:K100000") '// A2:K2를 10만 행까지 복사 src.AutoFill Destination:=dst End SubAutoFill은 완전히 엑셀 내부 엔진에서 벡터화된 상태로 돌아가서
VBA루프와 비교가 안 될 정도로 빠릅니다.
값,수식,서식까지 통째로 처리하므로,
순수 값만 필요하면
이런 식으로 한 번 더 처리할 수 있습니다.
4. "엑셀 수식이 VBA보다 수십배 빠르다"는 이야기를 들으셨는데,
그 이유가
바로 수식 계산이 C/C++로 컴파일된 엔진에서 벡터 연산으로 돌아가기 때문입니다.
먼저 아래행 전체에
수식으로 "위 행 참조"를 넣고
계산이 끝나면 한 번에 값으로 덮어쓰기를 합니다.
Sub FastCopy() Dim ws As Worksheet Dim rng As Range Set ws = ThisWorkbook.Sheets("Sheet1") Set rng = ws.Range("A3:K100000") '// A3:K3 ~ A100000:K100000 '// 1. 위 행을 참조하는 수식 넣기 rng.FormulaR1C1 = "=R[-1]C" '// (계산 모드가 수동이면 rng.Calculate 또는 Application.Calculate 필요) '// 2. 계산 후 값으로 고정 (한 번에) rng.Value2 = rng.Value2 End Sub
FormulaR1C1 역시 한 번의 Range 단위 호출이라, COM 호출 최소화하는데,
계산은 엑셀 엔진이 벡터로 처리하므로 VBA로 루프 돌리는 것과는 차원이 다르므로
"위행=아래행"을 수만/수십만 번 해야 할 때는 이 패턴이 정말 강력합니다.
엑셀 내부에서
즉, 범위 전체 98,000개의 셀에 이 수식을 자동으로 채웁니다.
이 작업은 VBA가 셀마다 루프를 돌리는 것이 아니라,
엑셀 엔진이 자체적으로 “벡터 처리”를 합니다.
그래서 속도는 범위 크기와 거의 무관합니다.
5. 추가적으로
복사 자체는 빠른데, 화면 깜빡임 / 수식 재계산 / 이벤트 실행이 시간을 다 잡아먹는 경우가 많으므로
실제 긴 매크로에서 체감 속도는
이렇게 튜닝하면 압도적으로 큽니다.
6. "컴파일된 라이브러리 끼워 넣기"에 대한 현실적인 답을 드리면,
C/C++로 COM Add-in, XLL 같은 걸 만드는 건 가능하지만,
결국 엑셀 시트에 값을 쓰고 읽는 순간 Excel Object Model을 거쳐야 합니다.
즉,
Range.Value를 부르는 순간 생기는 비용은 비슷하다고 볼 수 있습니다.
물론 "계산 로직이 무거운 경우"라면
VBA에서 루프 돌리는 것보다 C/C++로 계산 후 결과만 엑셀에 넣는 게 수십~수백 배 빠를 수 있지만,
지금처럼
"순수한 값 복사"라면
엑셀 자체의 Range 복사보다 더 빠르게 만드는 건 거의 불가능에 가깝습니다.
수식이 VBA보다 수십 배 빠르다는 말도,
"대규모 계산을 셀 수식/Power Query/Power Pivot 엔진으로 맡길 때" 이야기지,
값을 셀에서 셀로 한 번 옮기는 수준에서는 이미 거의 한계 속도라고 보시면 됩니다.
Option Explicit Sub FastFillDown() '// A2:K2 기준으로, 현재 시트의 마지막 행까지 AutoFill 후 값만 남기는 버전 Dim ws As Worksheet Dim src As Range, dst As Range Dim lastRow As Long Dim savedCalc As XlCalculation Dim savedScreen As Boolean Dim savedEvents As Boolean Set ws = ThisWorkbook.Worksheets("Sheet1") '// 기준 행 Set src = ws.Range("A2:K2") '// 마지막 행 찾기 (A열 기준) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row '// A2 아래로 채울 행이 하나도 없으면(= lastRow가 2 이하이면) 종료 If lastRow <= src.Row Then Exit Sub '// 채울 전체 범위: A2:K2 ~ A(lastRow):K(lastRow) Set dst = src.Resize(lastRow - src.Row + 1) '// ----- 튜닝 옵션 저장 ----- savedCalc = Application.Calculation savedScreen = Application.ScreenUpdating savedEvents = Application.EnableEvents Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False '// --------------------------- '// 1) AutoFill로 아래까지 수식/서식/값 복제 src.AutoFill Destination:=dst '// 2) 수식/연결 끊고 값만 남기기 dst.Value2 = dst.Value2 CleanExit: '// ----- 원상복구 ----- Application.Calculation = savedCalc Application.ScreenUpdating = savedScreen Application.EnableEvents = savedEvents '// --------------------- End Sub
선생님 안녕하세요.
오호~ 해박하신 선생님의 설명을 따라 오늘도 엑셀지식의 향연을 즐기는 기분입니다. 멋진 선생님의 가르침에 뇌가 배불러지는 느낌을 받고 있습니다. 감사감사합니다.
정말 이 문제는 제가 오랫동안 고민했었던 내용인데요. 제가 다루는 엑셀에 데이터가 너무 방대하다보니 늘 고민중의 하나가 저 많은 데이터들을 어떻게 하면 한방에 가져올 수 있을까? 이런 고민쯤은 엑셀유저라면 누구나 해보셨을 것입니다. 작업을 할려면 작업대에 물건을 올려놓아야 하죠. 이처럼 데이타를 계산할려면 작업시트로 불러와야 한다든가, 작업구역에 해당하는 셀로 가져와야 한다던가가 해결해야할 크나큰 문제가 아닐 수 없을 것입니다. 이때 데이타를 어떻게 불러오냐 그 방식이 중요해지는데요. 어차피 엑셀은 데이터로 시작해서 데이터로 끝나는 기계잖아요.
1번 : Copy 방식
이 방법은 제가 인터넷으로 엑셀공부를 시작할 첫무렵에 쓰기 시작했는데 지금은 저도 거의 안씁니다. 복잡한 계산이 필요한 곳에서는 이게 속도가 느리다는 것을 자연스럽게 알게 되었는데요. 이 방식이 클립보드방식이라고 말씀해 주셨는데 그러고보니 마우스로 복사하는 방식, 즉 손으로 Ctrl+C 누르는 동작을 구현한게 VBA.Copy였다는 의미이군요.
2번 : Range 로 입력방식
현재 이 방식을 쓰고 있긴 합니다. 속도도 빠르고 안정스럽고 만족스러운데 자꾸 더 좋은 방식이 있지 않을까 하다가...
3번 : 배열
남이 만들어놓은 좋은 코딩들을 보면, 배열을 자주 쓰는거 같은데 이 방식이 속도가 더 빠르다고 알려져 있어서 나도 한번 해볼까 생각중이었습니다. 그런데 역시나 셀값을 배열에 넣어줄때, 한방에 넣지 못하고 For문을 돌리니 이러면 분명 느려질 것 같다고 의심하던 차입니다. Cell.Value 를 건드리는 횟수가 빈번하면 이는 매크로에 부하를 주는 요인이라고 여기 게시판을 통해서 배웠습니다.
이상과 같이 제가 썼던 것들을 이 3가지로 요약할 수 있어서 예제파일을 만들어 질문을 드렸습니다. 이 방식들은 각각 제가 Timer 함수로 시간측정도 해봤는데요. 1번은 확실히 2번, 3번보다 느리다는 것을 알게 되었는데 2번과 3번중 뭐가 더 나을까는 아직 답을 못구했었습니다.
오늘 또 한가지 알게된 것은, Value 보다 Value2가 더 적당하다고 말씀해주셨는데, Value2는 변수인가? 순간 무슨 말씀인가 했네요. 아~ 이제보니 Cell.Value 와 Cell.Value2 이렇게 따로 구분되어 있군요. 이것도 처음 알았습니다. 모든 소스들이 value 만을 사용하던데 여태 value2를 사용한 소스를 본적이 없었습니다. 셀의 속성값을 참조할 때에 Value, Formula, FormulaR1C1, Text 등 여러가지가 있다는 사실을 알았습니다.
특히 AutoFill 부분의 소스에서 보여주신...
이 부분은 정말 처음 보는 것인데요. 엑셀에서 OFFSET을 공부할 때 비슷한 개념으로 보이는데 이렇게 셀속성으로도 구현이 가능하군요. 신기합니다.
데이터가 많아질수록 더 좋은 방법을 지속적으로 강구하다가 결국 배열이 가장 빠를 수있을 것 같다는 결론에 이르게 되었는데, 선생님말씀은 Range 단위 입력이 이미 2차원 배열에 해당하므로 여기에서 더 나은 배열 방법을 찾는다는 것은 무의미하다라는 거네요. Range입력이 배열을 이용하고 있다는 것도 오늘 또 새롭게 알게되었습니다.
엑셀이 점점 더 낯익고 가까운 사이가 되가는 것을 느낍니다. 엑셀은 수학을 공부하는 것처럼, 처음에는 어렵다가 그 이치를 하나하나 깨우치면서 더욱더 큰 매력으로 다가오며 급기야 거기에 푹 빠져 헤어나오지 못하는 것처럼 저도 지금 엑셀의 매력에 푹 빠져 버릴 것 같습니다. 엑셀과 나. 이제 서로를 낯익은 존재로 인식하며, 서로를 알아야 더 잘 소통할 수 있는 세상의 이치를 엑셀공부하면서도 느끼게 됩니다.
[ COM 호출 ] 이 부분은 선생님 말씀을 이해할려면 제가 더 공부를 해야할 것 같습니다. 도무지 무슨 말씀이신지 감도 못잡겠는요. 인터넷으로 찾아보니 마이크로 소프트에서 만든 규약쯤 되는 것 같은데 프로그램을 돌리는 일종의 통신 약속 같은 건가 봅니다. 엑셀은 운영체제와 Com 으로 대화하며 돌아가는 프로그램? 아직은 이렇게 이해해야 할 것 같습니다. 쉽게말해 서로 자주 호출하지 말고 한번 호출에 모든 일을 한꺼번에 해치우면 더 빨라질 수 있다고 이해하겠습니다.
6. "컴파일된 라이브러리 끼워 넣기"
이 부분에 대한 귀한 설명을 해주시니 너무 기쁩니다. 어디에서도 함부로 구하지 못할 답변을 전문가님께서 빨리 해결해주시니 너무 감사드립니다. 현재 값만을 복사하는 것이 목적이라면 이 이상의 속도개선은 의미가 없고, 앞으로 더 복잡한 계산수행 발생시 이 부분은 재검토해봐야할 듯 하네요. 일단 엑셀에 컴파일된 기능을 넣는 것은 일단은 가능하다. 이 사실을 안것만도 큰 소득입니다. 프로그래밍 언어로 구현해야 하니 과정이 순탄하지만은 않겠네요.
이 스킬로 결국 셀갑을 고정시키는 효과를 내는거군요. 단순하지만 너무 멋지고 한편 감동스럽기도 합니다. 내가 너이고, 네가 곧 나이니라. 코딩 2줄로 일심동체, 이심전심, 물아일체의 경지를 표현하신 것 같습니다.
선생님의 지식나눔에 너무 감사드립니다. 평안하시고 늘 건승하세요. 좋은 주말 되세요.
음.. 그래도 배열로 처리하는 방법이 가장 빠르지 않을까요?
Sub Macro1()
Dim vDB As Variant
Application.ScreenUpdating = False
vDB = Range("A2:K2").Value
Range("A3:K3").Value = vDB
End Sub
아마도 가장 빠른 방법은
Range("A3:K3").Value = Range("A2:K2").Value
다음으로
배열 > 컬렉션 > 딕셔너리' 순서
배열도 무서운데 컬렉션은 또 뭐고 딕셔네리는 또 무엇입니까? 지식의 바다는 겉잡을 수 없다는 것을 또 여실히 느낍니다. 소용돌이를 벗어나니 이제 회오리바람이 기다리고 있는 대양을 항해하면 이런 기분이 들 것 같습니다.
안녕하세요.
저는 배열을 아직 자유자재로 사용하지 못하다가 이번에 배열이 매우 중요하다는 것을 느끼게 되었습니다. 그래서 기초개념을 잘 모르는 상태입니다. 배열에 값을 할당해줄 때 For 문을 돌리는 것만 보아서 저렇게 Range 를 한방에 넣을 수 있다는 생각을 못했었습니다.
배열을 사용해 속도를 개선할려고 하는데, 셀을 하나하나 돌면서 배열화시키면 이게 또 시간잡아먹는 것인데 왜 이렇게 만들어놓았을까 의심하던 차였습니다. 역시 배열을 한방에 넣을 수 있는 방법이 있었군요.
vDB = Range("A2:K2").Value선생님께서 올려주신 소스가 그걸 잘 보여준다고 생각합니다. 그렇다면 Range 뿐만 아니라 Arr = Sheet 처럼 시트를 통으로 배열에 넣을 수도 있을 것 같네요. 분명 그렇게 만들어놓았을테니까요. 엑셀은 너무 똑똑해서 이게 가능하다면 저것도 분명 가능하게 해놓았을 것이다. 어차피 확장이니까. 이런 예상은 거의 맞더라구요.
올려주신 답변에 감사드립니다. 좋은 주말 되세요.
점심식사 후에,
댓글 다시 보면서
이 부분 다음에,
질문에 올려주신 첨부파일의
배열 코딩에 대한 올바른 사용법을
누락했네요.
위 댓글,
라온보리님이 제시하신 코딩으로 사용하셔야 합니다.
Dim Arr As Variant Arr = Range("A2:K2").Value2 '// 한 번에 배열로! Range("A3:K3").Value2 = Arr '// 결과적으로 내부적으로 같은 메커니즘인 두번째 버전과 동일이렇게 처리함으로써
결과적으로 두번째 코딩과 동일한 코딩으로 환원이 됩니다.
실제 벤치마크 결과를 보면,
실무적으로,
단순계산이라면
Range = Range로 충분하지만,
진짜 메모리에서 배열을 활용하는
이유는,
'// 값을 메모리에서 가공할 때의 진짜 배열 활용 Dim Arr As Variant Dim i As Long, j As Long Arr = Range("A2:K10000").Value2 '// 1회 읽기 → 2차원 Variant 배열 '// 메모리에서 처리 (셀 접근 없음!) For i = 1 To UBound(Arr, 1) '// 행 루프 For j = 1 To UBound(Arr, 2) '// 열 루프 If Arr(i, j) < 0 Then Arr(i, j) = 0 '// 예: 음수값은 0으로 치환 End If Next j Next i Range("A2:K10000").Value2 = Arr '// 1회 쓰기 → 결과 뿌리기 '// 총 2회 셀 접근으로 10만 셀 처리!이렇게
셀에 접근하지 않고,
메모리에서 추가적인 작업을 하고,
한번에 뿌려주기 위해서입니다.
Arr = Range("A2:K2").Value2 '// 한 번에 배열로! Range("A3:K3").Value2 = Arr안녕하세요. 제가 배열에 대해 지금 한참 공부중인데 Range를 바로 통으로 배열에 넣을 수가 있군요. 저는 배열은 For 문을 돌려 셀을 하나하나 할당해준다는 강박관념을 가지고 있었던 것 같습니다. 선생님없이 혼자 독학으로 할려니 기본기가 부족하다는 것이 이런 기본스킬 구사단계에서 여실히 보여지니 창피스럽기도 하네요. 결국 이게 2번째와 구현상 동일한 방식으로 작동되는거군요.
메모리에서 배열을 활용하는 이유는,셀에 접근하지 않고, 메모리에서 추가적인 작업 이후, 한번에 셀에 뿌려주기 위해서라는 말씀을 꼭 기억하겠습니다. 이게 속도, 안전성, 가벼움에 얼마나 지대한 영향을 끼치는 지 절실히 느끼고 있습니다. 값들을 셀에 뿌려서 그 값을 받아 또 셀에 뿌려주고.. 이런 과정의 반복은 시간낭비, 자원낭비이다. 메모리에서 계산해서 한방에 뿌져줘야 한다. 너무나 중요한 개념이라는 것을 절실히 느끼고 있습니다. 위에서 자세한 답변을 해주셨는데 바쁘신 중에도 한번 더 부연해주셔서 더더욱 감사드립니다. 좋은 주말 되세요.