|
변수는 비주얼베이직 뿐만 아니라 어떤 프로그램에서든지 공통적으로 쓰이는 말이다. 변수란 무언가를 담을 수 있는 공간을 뜻한다. 실질적으로 공간이라기 보다는 공간을 가르키는 이름이라 말하면 더욱 정확할 듯 싶다. 예를 들자면 5단 서랍장이 집에 있다고 하자. 서랍장을 밖에서 봐서는 각 5개의 서랍에 무엇이 들었는지 알 수가 없다. 하지만 각각의 서랍에 견출지로 이름표를 붙여놓으면 각 서랍에 무엇이 들어있는지 누가봐도 쉽게 알 수 있을 것이다.
Dim 성적 As String
이라는 변수를 선언했다고 보자. (처음 보는 사람은 위 문장중에서 무엇이 변수명인지 알 수 없을지 모르지만 '성적'이라는 변수를 String 형으로 선언한 문장이다.) 이 변수는 이 프로그램에서 누군가의 성적(점수)을 보관하는 변수라고 누구든 쉽게 이해할 수 있을 것이다.
Dim A as String
위 선언은 A 라는 변수를 선언했는데 이렇게 봐서는 A 라는 이름만 가지고는 무엇을 하는 변수인지 알 수가 없다. 따라서 변수를 선언할 때는 되도록 변수명만 보고도 무슨 역할을 하는지 알 수 있도록 선언하는 버릇을 들이는 것이 중요하다.
변수는 크기도 다양하고 종류도 다양할 수 있다. 그래서 변수를 사용하기 위해서는 사용방법을 정확히 아는 것이 중요하다. 변수는 먼저 선언이 이루어진후 등호(=)로 값을 대입해서 사용한다.
성적 = 100
이렇게 하면 이 뜻은 '성적' 이라는 변수에 100 이라는 숫자값을 대입한 것이다. 그럼 이번에는 문자열값을 넣어보자.
이름 = "홍길동"
이것은 '이름' 이라는 변수에 '홍길동' 이라는 값을 넣은 것이다. 근데 여기서 주의깊게 볼 것은 100 처럼 그냥 넣은 것이 아니고 값에 쌍따옴표(")를 사용했다는 것이다. 그 이유는 값이 변수인지 상수인지를 구분하기 위해서이다. 쌍따옴표로 문자열을 감싼 것은 문자열 상수에 포함이 된다. 하지만 쌍따옴표로 감싸지 않았다면 '홍길동'은 변수가 된다. 즉, '홍길동' 이라는 것 자체가 어떤 값을 가지고 있다는 뜻이 된다.
홍길동 = 100
이름 = 홍길동
처럼 하게 되면 '홍길동'이라는 변수는 100 이라는 값을 가지고 있고 '이름'이라는 변수는 '홍길동' 변수가 가지고 있는 100 이라는 값을 가지게 된다. 하지만,
홍길동 = 100
이름 = "홍길동"
처럼 하게 되면 '홍길동'이라는 변수는 100 이라는 값을 가지고 있고 '이름'이라는 변수는 '홍길동'이라는 문자열을 값으로 가지게 된다.
그럼 100은 왜 쌍따옴표로 감싸지 않았을까? 라는 의문을 가질 수 있게 된다. 그 이유는 숫자는 변수명이 될 수 없기 때문에 쌍따옴표로 감싸지 않은 것이다. 다시 말하자면 상수와 문자열을 구분하기 위해서 이다. 100 은 그냥 숫자 100 이 되지만 "100" 은 문자열 100 이 된다. 숫자 100 은 산술적인 계산이 가능하지만 문자열 100 은 산술적인 계산을 할 수 없다. 숫자와 문자를 구분하기 위해서 쌍따옴표를 사용하는 것이고 숫자를 변수명으로 쓰게 되면 엄청난 혼란이 초래되기 때문에 변수로 사용할 수 없는것이다.
그럼 여기서 간단하게 변수명을 짓는데 필요한 규칙을 알아보자. 변수명을 선언하기 위해서는 영문자, 숫자, 기호가 사용된다. 하지만 다음 몇가지 규칙을 따라야 한다.
1. 숫자로 시작해서는 안된다. 영문자 또는 2바이트 문자(한글)로 시작한다)
2. 255자를 넘어서는 안된다.
3. 점(.)이나 형 선언 문자(%&!#@$)등은 사용하지 않는다.
4. 영문자의 대문자와 소문자는 동일한 것으로 처리된다.( Data1 과 DATA1 은 같은 변수임. )
5. 예약어를 사용할 수 없다.
보통 위 5 가지만 지켜서 사용하면 변수를 이용하는데 큰 지장은 없을 것이다.
변수는 사용되기 전에 반드시 선언이 되야 한다. (비주얼베이직에서는 꼭 선언을 하지 않아도 되지만 선언을 하지 않으면 논리적 오류를 범하기 쉽고, Variant 로 선언되기 때문에 메모리나 속도면에서 성능이 낮아질 수 있다. 따라서 꼭 선언을 하고 사용하라는 의미에서 반드시라는 말을 사용했다.)
그리고 꼭 사용하려는 목적에 맞는 데이터 형태로 선언을 해줘야 한다.
선언의 예시를 보자
Dim 성적 as String
위에는 '성적' 이라는 변수를 문자열형으로 선언한 것인데 하나하나 뜯어보기로 하자.
Dim : 변수의 사용 범위라고 보면 되겠다.
성적 : 변수명이다
as : 변수의 형태를 지정하려는 접속어
String : 변수의 형태
이렇게 볼 수 있겠다.
즉, 변수를 선언하기 위해서
[사용범위] [변수명] as [변수의 형태]
이런식으로 선언을 한다고 보면 되겠다.
사용범위에는 다음과 같은 것이 있다.
Dim : 선언된 프로시저 내에서만 사용되며 프로시저를 한번 빠져 나가면 값이 사라진다.
Static : 선언된 프로시저 내에서만 사용되며 프로시저를 빠져나가서 다시 들어와도 값이 살아있다.
Private : 선언된 프로시저 내에서만 사용되며 프로시저를 한번 빠져 나가면 값이 사라진다.
Public : 어떤 프로시저(혹은 모듈)에서든지 호출해서 사용될 수 있다.
이렇게 4가지만 알면 변수를 이용하는데 큰 지장이 없다.
다음은 변수의 형태에 대해서 알아보도록 하겠다.
변수는 다음과 같은 종류로 나뉜다.
예를 들어 Data1 이라는 Single 형 변수를 선언하고 싶으면
Dim Data1 as Single 또는 Dim Data1!
이라고 선언하면 되겠다.(단, Variant 형은 as Variant를 생략할 수 있다.)
변수를 선언할 때는 선언한 위치에 따라 변수의 쓰임새가 틀리니 항상 선언할 때는 주의를 기울여야 한다.
하나의 예제를 보도록 하자. 직접실행창에 100,200,300,400 처럼 100씩 증가하는 프로그램을 만들려고 한다.
다음 예제를 실행해 보기 위해서 새 폼위에 커맨드버튼을 한 개 올려놓고 코딩창에 아래 코드를 작성해 보자.
Option Explicit
Private Sub Command1_Click() '커맨드버튼을 눌렀을 경우 실행되는 프로시저
Dim Data1 as Integer 'Data1 이라는 변수를 선언
Data1 = Data1 + 100 'Data1 이라는 변수 값에 100을 더해서 다시 Data1 변수에 넣는다. (즉, Data1을 계속 100씩 증가시킨다는 뜻)
Debug.Print Data1 '직접 실행창에 Data1 값을 찍어본다.
End Sub '프로시저의 종료
이렇게 되어있을 때 이 프로그램은 직접실행창에 값을 어떻게 찍을까?
계속 버튼을 누르면 직접 실행창에는 계속 해서 100 이라는 값이 찍힐 것이다.
왜그럴까? 커맨드버튼을 누르면 명령은 Dim ... 줄부터 시작이 된다. 그럼 프로세스는 Data1 이라는 Integer(정수형) 변수를 선언하게 된다.
새로 선언을 했으니 Data1 에는 기본적으로 0 이라는 값이 들어가게 된다. 그럼 그 다음줄에서 Data1 = 0 + 100 이라는 공식이 성립된다.
따라서 Data1 = 100 이 된다. 다음 Debug.Print 해서 Data1 값을 찍으니 직접실행창에는 100 이라는 값이 찍힐 것이다. 그리고 End Sub로 프로시저를 마치면서 Data1 은 메모리에서 해제가 된다. 다음 커맨드 버튼을 한번 더 누르면 프로세스는 다시 Data1을 선언할 것이고 위 작업을 다시 반복하니 값은 계속해서 100 밖에 나올 수 없는 것이다. 그럼 이 프로그램을 바로 잡기 위해서 어떻게 해야하나. 두가지 방법이 있다.
Option Explicit
Private Sub Command1_Click() '커맨드버튼을 눌렀을 경우 실행되는 프로시저
Static Data1 as Integer 'Data1 이라는 변수를 선언하는데 Static 으로 선언.
Data1 = Data1 + 100 'Data1 이라는 변수 값에 100을 더해서 다시 Data1 변수에 넣는다. (즉, Data1을 계속 100씩 증가시킨다는 뜻)
Debug.Print Data1 '직접 실행창에 Data1 값을 찍어본다.
End Sub '프로시저의 종료
위 예제를 보면 Data1을 Static 으로 선언한 것을 볼 수 있다. 저 변수는 다른 프로시저에서는 사용할 수 없지만 End Sub를 통해 프로시저를 마쳐도 메모리에서 해제가 되지 않는다. 따라서 값을 기억하기 때문에 100에 100을 더하고 그 값에 또 100을 더해서 100씩 증가를 시킬 수 있다.
Option Explicit
Dim Data1 as Integer 'Data1 이라는 변수를 일반부에 선언
Private Sub Command1_Click() '커맨드버튼을 눌렀을 경우 실행되는 프로시저
Data1 = Data1 + 100 'Data1 이라는 변수 값에 100을 더해서 다시 Data1 변수에 넣는다. (즉, Data1을 계속 100씩 증가시킨다는 뜻)
Debug.Print Data1 '직접 실행창에 Data1 값을 찍어본다.
End Sub '프로시저의 종료
위의 경우는 Data1을 프로시저 밖에서 선언한 경우이다. 이것은 이 모듈(프로시저를 모아놓은 단위)이 시작될 때 메모리에 작성이 되기 때문에 모듈을 빠져나가지 않으면 메모리에서 해제되지 않는다. 따라서 Command1 버튼을 계속 해서 누르면 Data1은 계속해서 100씩 늘어나게 된다. 하지만 Static 으로 선언한 것과는 달리 어떤 프로시저에서도 변수를 사용가능하기 때문에 다른 프로시저에서 값을 바꿔 버릴 수 있다.
추가로 한가지 덧붙일 게 있다면 Option Explicit 라는 선언인데 이것은 선언되지 않은 변수가 모듈내에서 사용되는 것을 방지하기 위해 사용된다.
만약 위의 예제에서 Option Explcit 가 없고 Dim 선언문도 없어도 Command1 버튼을 눌렀을 경우 오류가 발생하지 않는다. 하지만 Option Explicit를 선언하고 Dim 문이 없이 Command1 버튼을 누른다면 오류를 유발시킨다. 즉, Data1이 선언되지 않고서는 사용할 수 없음을 사용자에게 알려준다. 이 옵션은 매번 모듈을 만들 때 마다 써줘도 되지만 간편하게 메뉴 도구 -> 옵션에서 '변수 선언 요구' 이라는 옵션에 체크표시를 함으로써 자동으로 나오게 할 수 있다.
도구 -> 옵션 메뉴를 선택한 화면
휴... 말이 많았나 보다.
이렇게 해서 변수의 선언과 사용방법에 대해서 마치도록 하겠다.
< 틀린말이나 오타가 있으면 덧글달아주시고 욕은 하지 말아주세요. 킁~>
< 무단으로 복사해가면 나빠요~ >
|
첫댓글 잘 배웠읍니다 감사합니다 계속부탁드립니다
감사합니다. 즐거운 강의
ㄳ
정말 좋은 강의군요... 제가 궁금하던것들을 어찌 이렇게 콕콕찝어서 설명해 주시는지.. 감사합니다^^
감사