본문 바로가기
#4 VBA/#4.2 코딩문법

데이터형(Integer, Long, Double 등) 구분

by 이세계의엑셀 2025. 8. 5.
반응형

엑셀 VBA에서 효율적인 코딩을 하려면 변수 선언 시 적절한 데이터형을 선택하여 메모리를 절약하고 실행 속도를 최적화해야 한다. 본 글은 Integer, Long, Double 등의 기본 데이터형을 비롯해 Currency, Date, String, Variant 등 주요 자료형의 특성과 선택 기준을 정리한다.

1. VBA 기본 데이터형 총정리

데이터형 저장 크기 표현 범위 또는 형태 주요 용도
Byte 1 Byte 0 ~ 255 바이너리 데이터, ASCII 문자
Boolean 2 Byte True (-1), False (0) 조건 판별 논리값
Integer 2 Byte -32,768 ~ 32,767 작은 정수 카운터
Long 4 Byte -2,147,483,648 ~ 2,147,483,647 대용량 행/열 인덱스
Single 4 Byte ±3.4E–38 ~ ±3.4E38 (7자리) 단정도 부동소수
Double 8 Byte ±1.8E–308 ~ ±1.8E308 (15자리) 고정밀 수치 계산
Currency 8 Byte ±922,337,203,685,477.5807 (소수 4자리) 재무 계산 (정확도 중시)
Date 8 Byte 100년 1월 1일 ~ 9999년 12월 31일 날짜·시간 처리
String (고정) 선언 길이 0 ~ 65,535 Char 텍스트, 고정 길이
String (가변) 10 Byte + 문자열 길이*2 2 GB 까지 일반 문자열
Object 4 Byte (포인터) 객체 참조 Range, Workbook 등
Variant 16 Byte + 데이터 모든 형 수용 유연하지만 비효율
Decimal (사용자 정의) 16 Byte ±7.9E–28 ~ ±7.9E28 (29자리) 초정밀 소수
Tip 1 – 메모리 절약: Variant는 모든 데이터형을 포함할 수 있지만 16 바이트를 항상 점유하므로, 반복 루프나 대규모 배열에는 피하는 것이 좋다.

2. Integer vs Long – 행 처리 성능 비교

엑셀 시트에는 약 1,048,576행이 존재한다. 따라서 반복 문에서 Dim i As Integer로 선언하면 32,767행을 초과할 때 오버플로우 오류가 발생한다. Dim i As Long을 추천한다.

' 잘못된 선언
Dim i As Integer
For i = 1 To Rows.Count    ' 32,768행에서 오버플로우 오류
Next i
' 권장 선언
Dim i As Long
For i = 1 To Rows.Count    ' 안정적으로 끝까지 반복
Next i
Tip 2 – 속도 체크: 테스트 기준으로 1 백만행을 루프할 때 LongVariant보다 약 25 ~ 35 % 빠르다.

3. Single vs Double – 부동소수점 정밀도

  • Single: 7자리 정밀도. 재무 자료형으로 부적합.
  • Double: 약 15자리 정밀도. 통계, 공학, 과학 계산에 사용.

예를 들어 π(파이)를 단정도로 계산하면 3.141593으로 잘리지만, 배정도는 3.14159265358979로 보존한다.

3-1. 부동소수점 오차 피하기

통화 데이터는 반드시 CurrencyDecimal을 사용하여 10진 정밀도를 보장한다.

' Currency 사용 예
Dim total As Currency
total = 123456.78
total = total * 0.1    ' 정확히 12,345.6780 반환

4. String 관리 기술

4-1. 고정 길이 String

Dim code As String * 5
code = "AB"
' 나머지 3자리는 공백으로 채워짐 → "AB   "

4-2. 가변 String 및 조인 속도

가변 문자열을 반복해서 결합하면 메모리 재할당이 빈번해진다. 문자열 빌더 기법을 사용하라.

Dim sb As Object: Set sb = CreateObject("System.Text.StringBuilder")
Dim i As Long
For i = 1 To 100000
    sb.Append "Line " & i & vbCrLf
Next i
MsgBox sb.ToString

5. Variant 사용 가이드라인

  1. 초기 프로토타입 개발 단계에는 코드를 빨리 작성할 수 있으나, 최종 릴리스 전에는 명시적 형변환으로 교체한다.
  2. Null, Empty, Error 같은 특수 상태를 표현할 때 효과적이다.
  3. 대량 데이터에서는 성과 저하가 크므로 주의.

6. Option Explicit + 데이터형 표준화

Option Explicit 선언을 통해 모든 변수를 명시적으로 선언하면 타입 불일치를 컴파일 단계에서 잡을 수 있다.

Option Explicit
Sub CalcArea()
    Dim radius As Double
    radius = 10
    Dim area As Double
    area = WorksheetFunction.PI() * radius ^ 2
    Debug.Print area
End Sub

7. 형변환 함수 레퍼런스 표

함수 목적 예시
CInt Double → Integer CInt(3.7) '= 4
CLng Double → Long CLng(3.7) '= 4
CDbl String → Double CDbl("3.14")
CDec Double → Decimal CDec(0.1)
CStr 숫자 → String CStr(123)
CDate String → Date CDate("2025-07-27")

8. 사용자 정의 형 (Type) 및 클래스 모듈

8-1. Type 블록 선언

Type ChemicalInfo
    Name As String
    CAS  As String
    Density As Double
End Type

Dim chem As ChemicalInfo
chem.Name = "Methanol"
chem.CAS  = "67-56-1"
chem.Density = 0.7918

8-2. Class 모듈과 속성

객체지향적 설계로 속성 캡슐화를 실현한다.

' Class 모듈: clsCounter
Private pValue As Long
Public Property Get Value() As Long: Value = pValue: End Property
Public Sub Increment(): pValue = pValue + 1: End Sub

9. 메모리 벤치마크 실험 (샘플)

아래는 10만 배열 원소를 LongVariant에 저장했을 때의 소요 메모리 차이 실험이다.

데이터형 배열 크기 예상 메모리 실측 메모리*
Long 100,000 ~0.4 MB 0.41 MB
Variant 100,000 ~1.6 MB 1.58 MB

*Windows Task Manager 기준, 테스트 환경 : Office 365 32-bit

반응형

10. 배열 및 Collection 타입

Array는 기본적으로 값 형태이며, Collection은 객체 참조 형태다. 값이 큰 구조체를 Collection에 저장하면 포인터 만으로 관리해 메모리를 절감할 수 있다.

11. 실무 적용 체크리스트

  • 루프 인덱스는 Long 고정.
  • 통화 데이터는 Currency 또는 Decimal.
  • 날짜·시간은 Date 유지, 숫자로 저장하지 않는다.
  • 대형 배열에는 Erase arr로 초기화해 메모리 반환.
  • 외부 DLL 호출 시 API 함수 인수 형식에 정확히 매칭.

FAQ

Q1. 왜 Double을 기본 부동소수 형으로 추천하나요?

Single은 정밀도가 낮아 통계 모델이나 재무 산식을 반복 계산할 때 오차가 누적된다. 현대 PC 메모리 여유를 감안하면 Double 선택이 안전하다.

Q2. Integer보다 Long이 느리지 않나요?

32-bit VBA엔진 내부적으로 정수 산술을 32-bit로 변환해 처리하므로, Integer와 Long의 속도 차이는 무시할 수 있는 수준이며 오히려 오버플로우 방지가 더 중요하다.

Q3. Variant를 피하고 싶은데 폼 컨트롤의 Value는 Variant 입니다. 해결 법은?

폼 컨트롤에서 값을 읽은 즉시 목표 형식으로 변환해 저장한다. 예) Dim qty As Long: qty = CLng(txtQty.Value)

Q4. Decimal을 직접 선언할 수 있나요?

VBA에서는 Dim d As Decimal 처럼 직접 선언할 수 없다. Dim v As Variant: v = CDec(값) 로 Variant 래퍼에 포함해 사용한다.

Q5. 64-bit Office에서도 Integer 범위가 변경되나요?

아니다. VBA 언어 사양은 플랫폼에 무관하므로 Integer는 항상 2 바이트 범위를 유지한다.

반응형