변수와 상수

 
자료형 변수와 상수
 
프로그램을 작성하다보면 종종 어떤 값을 임의의 저장공간에 저장해야 할 때가 있다.
변수란 이러한 임의의 저장공간을 뜻하며 저장되는 값을 상수라고 말한다.
 예를 들어 Name = "홍길동", Number = 2 처럼 쓸 수가 있는데 풀어보자면 Name이란 변수에 "홍길동"이란 상수를, Number란 변수에 2 이라는 상수를 저장한다는 뜻이다.
 
그러면 비주얼 베이직이 어떻게 변수를 선언하며 상수를 저장하는지 그리고 이는 내부적으로 어떻게 컴파일되는지 알아보자.
  예제)
  Option Explicit
  Private sub Command1_Click()
  Dim Name as String
  Dim Number as Integer
  Dim Temp
  Name = "홍길동"
  Number = 2
  Temp = "문자열인데.."
  Temp = 5
  End sub
코드윈도우상의 소스코드이다. (코드윈도우는 직접 코딩을 하는 에디터창을 말하며 이는 컨트롤을 더블클릭하거나 (보기-코드 메뉴를 통해 확인할 수 있다) Command1_Click은 이벤트 프로시저로서 커맨드 버튼을 클릭했을 때 발생하는 이벤트이다. 만약 Label (라벨) 컨트롤을 클릭한다면 Label_Click 이 발생하게 될 것이며 _ 앞의 문자는 해당 컨트롤의 이름이다. 이것은 컨트롤의 Name 속성값과 동일하다.
Dim - 변수 선언 명령어
as [자료형] - 자료형 형태 선언 명령어
 
사용자가 이처럼 변수의 선언과 상수값을 정해주면 베이직은 컴파일 과정에서 주메모리에 변수의 형에 알맞는 메모리를 할당해 주며 값을 넣게 된다.
그럼 언제 값을 넣어주게 될까?
실제로 그 값을 저장하는 순간은 프로그램을 실행시키면서 커맨드 버튼을 클릭했을 때 발행한다. 이러한 상황은 어떤 컨트롤 어떤 이벤트에서 변수를 사용하느냐에 따라 틀리다. 위 코드를 '실행파일 만들기' 메뉴를 이용해 실행파일을 만들어 실행시키는 것을 프로그램의 RunTime 구동이라고 말한다.
그런데 변수선언시 만약 as [자료형]을 생략한다면 어떻게 될까?
'가변형 ' 자료형이라는 것이 있다.
이것은 사용자에게 편의를 제공하는 방법의 하나로서 가변형 자료형으로 선언된 변수에 할당된 상수가 어떤 자료형태에 따라 그 순간 변수의 자료형을 결정하는 유동적인 자료선언의 형식이다.
위의 Temp가 그 사용 예이다.
첫번째엔 문자열 상수를 받아들이는 문자열 변수로서 그 기능을 했지만, 바로 다음 줄에선 5라는 정수형 데이터를 받아들이는 정수형 변수로 사용되었다. 물론 위 Temp 의 코드들은 예를 보여주기 위한 것으로써 실제 저렇게 바로 바꾸어 사용할 경우는 없을 것이다.
Option Explicit 란 소스의 일반선언부에서 사용되는데 이는 모듈수준에서 사용되는 모든 변수는 반드시 선언 후 사용하라는 명령문이다. 모듈수준이란 전역변수와 같이 폼 전체에 적용되는 범위라고 생각하면 된다.
만약 폼에서 사용되는 전역변수를 일반선언부에서 선언하지 안은 채 소스 어디선가 선언한다면 컴파일 오류가 발생하게 된다.
반대로 Option Explicit를 쓰지 않는다면 프로시저 아무 곳에서나 전역변수를 특별한 선언없이 사용할 수 있다.
예를 들어보자.
Private sub Command1_Click()
Name = "홍길동"
End sub
일반선언부에 Option Explicit라는 명령문을 사용하지 않으면 위 코드는 에러없이 정상적인 작동을 한다. 하지만 Option Explicit 를 쓰면 '선언되지 않는 ... ' 이런 메세지가 뜨게 될 것이다.
Option Explicit 문을 쓰지 않고 폼 코드 어디선가 선언되지 않는 변수를 사용한다면 이것은 암시적인 전역변수로써 비베는 인식을 하게 되는데... 물론 이것이 편할 때도 있다.
그러나 좋은 습관이라곤 생각하지 않는다. 좋은 코드는 가독성, 즉 남이 읽어도 쉽게 이해할 수 있어야 한다고 생각하기 때문이다. 귀찮더라도 명시적인 변수의 사용을 습관화했으면 한다.
그리고 가변형 변수의 사용 역시 본인은 자제하라고 하고 싶다. 적당한 상수값을 넣어주면 알아서 데이타형을 결정하는 편리함은 있지만, 확실한 이해를 하고 있는 상태가 아니라면 비주얼 베이직에게 그런것까지 맡길 필요는 없다고 본다.
끝으로 자료형의 몇가지 형식에 대해서 언급을 하겠다.
정수(Integer, Long), 실수(Single, Double), 문자열(String), 논리형(Boolean)이 있다.
조금 더 자세히 설명해 보자
Dim 변수명 [As 데이터형]
변수명은 반드시 다음과 같은 규칙을 따라주어야 한다.
1. 반드시 영문자로 시작한다.(한글판 VB 5이상에서는 한글로 시작할 수도 있다)
2. 변수명의 길이는 255자를 초과할 수 없다.
3. C, C++ 등과는 달리 VB에서는 대소문자를 구별하지 않는다. 즉, "abc"나 "ABC"나 같은 변수이다.
 
변수의 데이터형
VB에서 변수로 정의할 수 있는 데이터타입에는 대략 다음의 10가지 정도로 구분된다.
(Variant, Integer, Long(Long Integer), Single, Double, Currency, Byte, String, Boolean, Object)
 
* Variant : VB의 기본 데이터 타입
  Dim X
  Dim Y
  Dim Z
  이 경우, 변수 X, Y, Z는 모두 VB의 기본 데이터타입인 Variant 타입으로 선언된다.  즉 위의 문장은 다음과 같이 할 수도 있다.
  Dim X as Variant
  Dim Y as Variant
  Dim Z as Variant
 
  Variant라는 것은 어떤 종류의 데이터도 저장할 수 있는 데이터타입이다.  다시 말해 변수 X, Y, Z에 정수나, 실수, 문자열 등 어떤 종류라도 들어갈 수 있다는 말이다.
 
* Integer, Long, Single, Double : 숫자 데이터 형식
  이들은 모두 숫자 데이터 형식이다.  Integer 는 정수형(-32768 ~ 32767), Long도 정수형이지만 Integer보다 2배 많은 기억장소를 차지한다(-2,147,483,648 ~ 2,147,483,647).  만약 각 변수형에 범위를 초과하는 값을 집어 넣으려고 하면 에러가 발생한다.  Single은 단 정도라고 해서 유효숫자가 단정도 형태인 32비트 실수형태를 말하며, Double의 경우는 배정도로 유효숫자의 단위가 Single에 대해서 2배인 64비트 실수를 사용한다.
 
Dim j as Integer
Dim k as Long
Dim l as Single, m as Double
    j  = 100
    k = 123456789
    l  = 10.234
   m = 2.9321238
 
* Currency : 고정소수점 데이터 형식
  이 타입은 위의 Single이나 Double등의 부동소수점 실수에 비해서, 고정소수점 형태를 취하는 실수로, 소수점 이상 15자리와 소수점 이하 4자리까지 저장할 수 있다.  빠르고 정확하므로 금액 등을 저장하는데 적합하다.
 
Dim c as Currency
   c = 100.99
 
* Byte : 이진 형식
  이 타입은 바이너리, 즉 이진수형태의 자료를 선언할 때 사용된다.  기본적으로 배열형의 자료로 선언되며, Byte(n)의 타입이면 n바이트의 자료를 읽을 수 있다.
Dim h(20) as Byte
     h() = LoadFromFile("test.txt")
 
* String : 문자열 형식
  이 타입은 문자열을 저장하는 타입으로, VB에서는 문자열은 항상 큰따옴표(" ")나, 작은따옴표(' ')로 둘러싸야 한다.
 만약 문자열의 크기를 지정하고 싶다면 String * n의 형태로 지정할 수 있다.
 
Dim h as String             'Size와 상관없음
Dim j as String
* 5         'Size 5인 문자열 변수선언
Dim k as String * 3        'Size 3인 문자열 변수 선언
 
* Boolean(논리형)
  VB 4.0에서부터 추가된 타입으로, True와 False 이렇게 두가지의 값만을 다룰 수 있다.  이 타입은 논리연산의 결과 등을 다룰 때 특히 유용하다.
 
Dim YesOrNo as Boolean
     YesOrNo = False
 
* 사용자 정의 타입
  VB에서는 Type예약어를 써서 필요한 구조체 변수를 정의할 수 있다.  사용자에 의해서 정의된 구조체 변수는 <속성만 있는 개체>와 같이 움직인다.  사용자는 이 구조체의 모든 변수들에 접근할 수 있다.
 
Type Computer
       CPU as String
       RAM as Integer
       HDD as Single
End Type
Dim Mycom as Computer
Private Sub Form_load()
       Mycom.CPU = "펜티엄"
       Mycom.RAM = 64
       Mycom.HDD = 10.1
End Sub