배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   최적화
제목:   프로그래밍 최적화 방법
     
 

New Page 2
  STEP> 따라하기

프로그래밍을 하다 보면 남의 코드를 참조하는 일이 잦습니다. 그리고 코드마다 만든 사람의 성격이 묻어나는 듯 합니다. 마치 글을 쓰는 일과 코딩을 하는 일은 별반 다르지 않습니다.  물론 창조하는 경우에 말입니다.

코드를 들여다 보면 뭐가 뭔지 알 수 없을 정도로 가독성(可讀性)이 떨어지는 경우도 있고 간단히 해야 할 일을 어렵게 처리하는 걸을 봅니다. 물론 제가 만든 것도 남들이 보기엔 바보스러운 면도 있을 지도 모릅니다.

오늘은 마치 십계명처럼 최적화된 프로그래밍에 대한 조언을 알려드리고자 합니다. 비록 제가 작성한 것은 아니지만 금석문자로 기억할 만 합니다.

그런데 이 조언이 Visual Basic을 염주에 두고 작성된 것이라 이중에는 VBA에는 해당되지 않는 내용도 있습니다. 한번 찾아 보시죠!

[팁/VB] 프로그래밍 최적화 방법

<1> Option Explict 변수선언요구를 설정해 두고 코딩을 하라.
(도구-옵션에서 설정 가능함)

<2> 변수의 Variant 사용을 제한하라.
(Long -> Integer -> Byte 순으로 사용 32BIT CPU)

<3> VB 에서 자체적으로 제공하는 함수들을 최대한 활용하라.
;예를 들어, 24-Feb-1973 이란 형태의 날짜형식을 1973-02-24 일로 바꾼다고 할 때, 일반적으로 Select Case 문과 문자열함수 등을 이용하여 코딩을 할 수도 있지만, VB 에서 제공하는 Format() 함수를 이용하면 단 한 줄로 처리가 가능하다. Msgbox Format("24-Feb-1973","yyyy-MM-dd")

<4> 사용하는 컨트롤들을 하나씩 만들어 사용하지 말고 배열로 생성시켜 활용하라.(메모리와 디스크하드절약)

<5> 변수명은 최대한 짧게, 헝가리안 표기법을 준수하라.

<6> 한글변수명은 피하고, 한글은 데이타로만 사용.

<7> Code 상에서 아래와 같이 Property연산은 하지 말 것.
For i= 1 To 10
Text1.Text = Text1.Text + 1
Next i

<8> IF 문 보다는 Select Case 문이 더 효율적이며, 최종적으로는 Choose 문을 사용하라.

<9> 상수를 많이 사용할 것. (상수는 컴파일 될 때 한번만 처리됨)

<10> 프로시저 인수전달 중 값에 의한 전달(ByVal) 이 참조에 의한 전달(ByRef) 보다 빠르게 처리된다.
예를 들어서 임의의 어떤 프로퍼티가 노출하는 클래스 멤버 변수의 자료형이 크기가 1,024 인 배열인 경우에는 어떻게 프로퍼티를 구현하는 것이 보다 효율적인 것일까? 지금까지 해왔던 것과 같은 방식으로 프로퍼티를 작성한다면 그 배열 자체를 통채로 주고 받는 방법밖에는 대안이 없다. 아니면 원하는 인덱스에 존재하는 문자열 자료를 리턴받는 메소드를 새로 작성해야 한다.

이 두 방법 중에서 첫 번째 방법은 그야말로 무식한 방법이라고 말할 수 있다. 크기가 1,024 인 배열의 모든 인덱스에 각각 한글 10 글자로 이루어진 문자열 데이터가 존재한다고 생각해 보면 단순 계산으로도 배열 전체의 크기는 모두 1024 X 10 X 2 = 20,480 Byte 가 된다. 단지 몇 글자로 이루어진 문자열 하나를 설정하거나 얻기 위해서 매번 20,480 Byte 의 데이터를 통채로 이동시키는 것은 말 그대로 무식한 짓이다.

사실 VBScript 의 클래스에서도 ByVal 키워드와 더불어 ByRef 키워드가 지원되기는 한다. 익히 알고 있는 것처럼 인자를 선언할 때 ByRef 키워드를 함께 사용하면 런타임시에 데이타의 전체값이 복사되는 것이 아니라 단지 데이터의 참조가 전달되므로 불필요한 오버로드를 줄일 수 있다.

그러나 이것 또한 근본적인 해결책은 아닌 셈이다. 왜냐하면 당장 VBScript 의 클래스에서야 ByRef 키워드를 사용하는 것으로 문제를 해결한다고 하지만, 이와 같은 문제는 Microsoft Visual Basic 6.0 을 사용하여 작성한 클래스, 즉 COM / COM+ 컴포넌트에서도 동일하게 발생하기 때문이다.

특히나 서버간 원격 호출이 발생하거나 COM+ 응용 프로그램 설정과 IIS 에서의 WAM (Web Application Manager) 등의 설정이 복잡하게 얽혀 들어서 컴포넌트의 인스턴스가 서로게이트 (Surrogate) 인 DLLHOST.EXE 의 프로세스 안에서 생성되는 상황에서는 아무리 DLL 형식의 컴포넌트라 할지라도 결국 Out-Of-Process 컴포넌트와 같이 프로세스간 마샬링이 일어나고, 아이러니하게도 ByRef 키워드보다는 ByVal 키워드가 더 권장되는 상황이 발생하게 된다.
추가부연설명출처 http://www.egocube.pe.kr/asp_0008.asp

<11> Nothing 을 이용하여 불필요한 메모리를 해제하라.
(Set Form = Nothing)

<12> 경제적 컨트롤을 주로 사용하라.
(Label > Textbox , Image > Picture)

<13> Erase 문을 사용하여 동적배열을 비워라.
(Erase DArray)

<14> 폼,컨트롤 AutoRedraw 를 True 로 하면 폼/컨트롤 이미지를 메모리에 저장해 둔다.

<15> 배포판 작업 전 소스화면을 모두 닫고, 재부팅 한 후 컴파일 하라.

<16> 불필요한 코드는 제거하라.
주석 ' 은 실행에 아무런 영향을 주지 않으니 많이 사용해도 무방하다.

* 출처 http://YAHOO.sy.to