본문 바로가기

Web Development/ASP

[ASP] 기본 문법 에 대하여

지난 시간에 우리는 아주 간단한 ASP 페이지를 하나 작성해 보았습니다.
그리고 Now, Hour 같은 함수와 IF ~ THEN 과 같은 조건 구문에 대해서 알아보았는데요.
오늘은 본격적으로 ASP 에서 사용되는 기본 문법에 대해서 살펴보고자 합니다.

오늘 우리가 살펴보고자 하는 내용들은 다음 6가지 내용 정도가 되겠습니다.
본 내용에 들어가기에 앞서 가벼운 마음으로 한번 읽어보시면 좋을 것 같습니다.

선언 및 생성
1. Dim - 변수를 선언. (예: Dim strName)
2. Set - 개체를 생성. (예: Set rs = Server.CreateObject("ADODB.RecordSet"))
논리 구문
3. IF ~ THEN - 만약 ~ 라면. (조건이 적은 경우)
4. SELECT CASE - 만약 ~ 라면. (조건이 많은 경우)
5. FOR ~ NEXT - 순환하면서 실행. (반복 횟수를 정확하게 알고 있을 때)
6. DO WHILE - 순환하면서 실행. (반복 횟수를 정확하게 알 수 없을 때)

좋습니다. 그럼 이제부터 이 내용들을 천천히 한번 살펴보도록 할까요?

1. Dim
- Dim 은 '차원'을 의미하는 'Dimension' 의 약자로서, 변수를 선언할 때 사용합니다.
만약 Dim a 라고 한다면, 'a 는 이제부터 변수다' 라는 것을 프로그램에게 알려주는 것이지요.
(변수란 쉽게 말해 '변하는 수' 입니다. 그 안에 들어있는 값은 상황에 따라 변하게 되지요.)
그러면 이제부터 a = 5 + 3 과 같은 식으로 사용할 수 있게 되는 것입니다.

여러개의 변수를 선언할 때에는
Dim a
Dim b
Dim c


처럼 하나하나 선언해 주면 됩니다. 그런데 만약 선언할 변수가 많은 경우에는
Dim a, b, c 처럼 쉼표를 기준으로 여러개의 변수를 동시에 선언할 수도 있습니다.

하지만 이런식으로 Dim a, b, c... 와 같이 의미없는 변수를 선언하는 것은 좋지 않습니다.
당장은 편해서 좋을 것 같지만, 시간이 흐른 뒤 자신이 작성한 소스를 보게 되었을 때
'이것이 무엇을 의미하는 변수였더라?' 하면서 헷갈릴 수 있기 때문입니다.
(만약에 혼자가 아닌 그룹 단위의 작업을 하게 된다면 이것은 더더욱 심각한 문제가 됩니다.
의미 없는 변수는 프로그램을 분석하는 데 상당한 장애 요인이 될 수 있기 때문입니다.)

그러므로 변수의 이름은 '규칙' 에 따라서 의미가 통하는 명확한 이름으로 주는 것이 좋습니다.

제가 사용하고, 또한 추천해 드리고 싶은 방법은 다음과 같습니다.
예를 들어서 '이름' 이 들어가는 변수라면, Dim strName 과 같이 사용하는 것입니다.
name 은 이름을 의미하는 단어이고, 앞에 붙는 'str' 이라는 것은 '문자열' 을 의미하는 'string' 의 약자입니다.
즉, strName 이라고 한다면 '이름을 의미하는 문자열' 이 되지요.

만약 번호를 의미하는 변수라면? 그때에는 '정수' 를 의미하는 'integer' 와 번호를 의미하는 'number' 를 합쳐서,
intNumber 와 같은 방식으로 사용하면 되겠지요.
(정말 기발한 방법이라굽쇼? 이것은 사실 '헝가리안 표기법' 이라는 표기법으로..
상당히 유명하고 잘 쓰이는 방법입니다. ^^ 근데 왜 니가 개발한 척 하나구요? -_-a)

하지만.. 이것은 권장 사항일 뿐이고, 변수 선언에 강제적인 규칙은 없습니다.
때문에 사람들마다 각각 자신만의 방법대로 변수를 선언하지요.
만약 여러분들께서 어느 회사(또는 동아리 등의 프로그래머들이 모인 집단)에 속해 계시다면,
아마도 그 집단에서는 나름대로의 변수 선언 규칙이 존재하고 있을 것입니다.
그 방식을 따르고 자기 것으로 익히는 것이 가장 좋다고 말씀 드릴 수 있겠네요.

변수 선언에 대한 또 한가지 이야기를 하겠습니다.
대부분의 다른 프로그램(C 나 C++, JAVA 등)에서는 선언하지 않은 변수를 사용하거나,
정확하게 사용되지 않은 변수를 사용하면 오류가 발생합니다.
하지만 ASP 는 조금 특별하게도,
기본적으로 변수 선언을 하지 않고 변수를 사용해도 오류를 발생시키지 않습니다.
(물론 오류가 발생하게끔 옵션을 수정할 수도 있습니다만..)

하지만 좋은 프로그래밍 습관을 위해서, 변수는 꼭 선언한 다음에 사용하시기 바랍니다.
잘 알고 계시는 '세살 버릇 여든 간다' 는 속담은.. 프로그래밍 세계에서도 적용됩니다.
조금 귀찮더라도 처음 배울 때 좋은 습관으로 배워 놓으면 두고두고 유용하다는 말이지요. ^^

2. Set
- Set 은 '개체의 인스턴스' 를 생성할 때 사용하는 명령어입니다.
개체(Object) 라... 개체란 과연 무엇일까요?
어렵게 생각하실 것 없습니다. 그냥 여러분들께서 알고 계신 개체의 뜻 그대로입니다.
우리 주변에서 쉽게 접할 수 있는 컴퓨터, 의자, 책상, 핸드폰 등이 모두 개체라는 말이지요.
이 중에서 '핸드폰' 의 예를 들어보겠습니다. 다음 두 문장을 주목해 주십시오.

1. 핸드폰은 다른 사람과 통화를 하기 위한 도구입니다.
2. 내 핸드폰으로는 사진도 찍을 수 있고, 화음도 끝내줍니다. (거짓말입니다. -_-a)

1번에서 말하는 핸드폰과 2번에서 말하는 핸드폰의 의미는 조금 다른데요.
1번에서 말하는 핸드폰이 일반적으로 통칭해서 쓰이는 의미의 핸드폰(보통명사)이라면,
2번에서 말하는 핸드폰은 누구의 것인지 알 수 있는 구체적인 의미의 핸드폰(고유명사)입니다.

우리는 1번에서 말하는 통합된 의미의 핸드폰을 '개체(Object)' 라고 하며,
2번에서 말하는 - 실제로 사용가능한 - 핸드폰을 '개체의 인스턴스(Instance)' 라고 합니다.

즉 개체(Object)는 추상적인 의미이며, 직접 사용할 수는 없는 존재고요.
그에 반해 인스턴스(Instance)는 구체적이며 직접 사용할 수 있는 존재라는 뜻이 되겠습니다.

조금 어렵나요? 사실 개체의 정의를 초보자에게 설명하기는 조금 까다롭습니다.
하지만 개체는 상당히 중요한 개념입니다. 반드시 이해를 해야 하는 개념이지요.

개체에 대한 이야기를 핸드폰의 예를 들어 조금 더 해보겠습니다.
핸드폰이 무엇인지 잘 모르는 어떤 사람이 있다고 가정하고요.
그 사람이 여러분들께 '핸드폰이 뭐지요?' 라고 물어본다면 어떻게 대답하시겠습니까?

'음.. 그러니까 핸드폰이란 전화를 걸 때 쓰는 건데요.
크기는 손바닥보다 조금 작고, 무게는 가볍고요.

아~ 전화를 할때에는 버튼을 눌러야 해요..'
사람들마다 차이는 있겠지만, 대충 이런 대답을 하게 되지 않을까요?

핸드폰을 설명하기 위해서는 핸드폰의 특징에 대해서 이야기를 해야 할 것입니다.
위에서 언급한 대로 색깔, 크기, 무게, 버튼의 갯수, 액정의 유무.. 등을 말이지요.
이런 사항들은 핸드폰이라면 기본적으로 당연히 가지고 있는 항목이라고 할 수 있겠습니다.

이것을 바로 개체의 속성(Property) 이라고 합니다.
이 속성이라는 친구는 '개체의 특정한 면들을 설명하는' 용도로 사용됩니다.
즉, '개체 내에서 사용되는 전용 변수' 정도로 이해하시면 되겠습니다.
또한 속성은 사용될 때에 이름과 값, 한 쌍으로 표현이 됩니다. (잠시 후에 알아보겠습니다.)

개체에 관하여 생각해 보아야 할 내용이 하나 더 있습니다.
우리는 핸드폰으로 어떤 일들을 할 수 있을까요?
네.. 누군가에게 '전화를 걸' 수도 있고, '전화를 받을' 수도 있습니다. (문자도 있군요.)

이처럼 '어떤 개체가 수행할 수 있는 작업' 을 메소드(Method) 라고 합니다.
속성과 마찬가지로.. 핸드폰이라면 기본적으로 실행할 수 있어야 하는 기능이지요.
이 메소드라는 것은 '개체 내에서 사용되는 전용 함수' 라고 말씀드릴 수 있겠습니다.
함수이므로 어떤 함수냐에 따라 인자가 필요할 수도 있습니다.

예를 들어 '전화 걸기' 라는 메소드가 있고, '전화 받기' 라는 메소드가 있다고 가정하겠습니다.
(전화를 걸고 받는 것은 '작업을 수행' 하는 것이므로 속성이 아니라 메소드가 됩니다.)
전화를 받을 때에는 폴더를 열거나, 통화 버튼만 누르면 되므로 인자가 특별히 필요없습니다만,
'전화 걸기' 메소드를 실행하려 할때에는 걸어야 할 '전화 번호' 가 필요하게 됩니다.
이처럼 메소드에서는 인자가 필요할 수도 있고, 필요 없을 수도 있습니다.

자.. 개체에 대한 이야기는 여기서 일단 마무리를 짓겠습니다.
사실 많이 부족하지만, 앞으로 계속 만나게 될테니 그때마다 조금씩 설명을 하도록 하겠습니다.

마지막으로 ASP 에서의 개체 사용 방법을 맛보기로 만나보도록 하겠습니다.
다음 예문은 실제 ASP 에서 작동하는 소스는 아닙니다. 이해를 돕기 위한 예일 뿐입니다.
(숫자는 라인을 표시한 것입니다. 실제로 이렇게 숫자를 표시하지는 않습니다.)

Handphone 개체의 사용 방법
1. Dim myPhone
2. Set myPhone = Server.CreateObject("Telephone.Handphone")
3. myPhone.color = "white"
4. myPhone.number = "011-9971-88XX"
5. myPhone.call("02-584-88XX")
6. myPhone.hangup()
7. Set myPhone = Nothing

1번째 줄에서는 먼저 앞으로 사용될 myPhone 이라는 변수를 선언해 놓았습니다.
그리고 2번째 줄에서는 Server.CreateObject 라는 특별한 메소드를 사용하여
'Handphone 개체의 인스턴스'를 만들어서 myPhone 이라는 변수에 저장하였습니다.
(그러므로 이제 myPhone 이라는 녀석을 Handphone 으로 사용할 수 있게 된 것입니다.)

개체(Object)는 추상적인 의미라는 말씀을 윗 부분에서 드렸습니다.
그렇기 때문에, Handphone 개체를 우리 프로그램에서 직접 가져다 사용할 수는 없고
'인스턴스(Instance)' 를 만들어서 그것을 변수에 저장하여 사용하는 것입니다.
이처럼 '개체의 인스턴스' 를 만들어서 변수에 저장할 때에 사용하는 구문이 바로 Set 구문이 되겠습니다.

3번과 4번 줄은 속성(Property)값을 할당하는 구문이 되겠습니다.
속성은 사용될 때에 이름과 값, 한 쌍으로 표현이 된다는 말씀을 위에서 드렸었는데,
그 내용이 바로 이 부분의 내용이 되는 것입니다.
보시는 것처럼 myPhone 의 color 속성에는 "white" 라는 값을 넣었으며,
myPhone 의 number 속성에는 "011-9971-88XX" 라는 값을 넣은 것입니다.
(이 구문을 통해 제 핸드폰의 색깔은 하얀 색, 그리고 번호는 "011-9971-88XX" 가 됩니다.)

그리고 5, 6번 줄은 메소드(Method) 를 실행하는 구문이 됩니다.
5번 줄은 call 이라는 메소드를 사용하여 전화를 거는 작업을 수행합니다.
전화를 걸때에는 '전화번호' 가 있어야 하므로, 인자로 "02-584-88XX" 번을 입력했으며,
이 구문을 통해 제 핸드폰은 02-584-88XX 번으로 전화를 걸기 시작합니다.
6번 줄은 전화를 끊는(hangup) 구문이 되겠습니다.
끊을 때에는 특별한 인자가 필요하지 않으므로 인자를 넘겨주지 않았습니다.

그리고 모든 작업을 완료한 다음에는 더이상 핸드폰이 필요하지 않으므로,
7번의 Set myPhone = Nothing 이라는 구문을 사용하여
개체의 인스턴스인 'myPhone' 을 메모리에서 해제합니다.
'myPhone' 을 더 이상 쓰지 않는다고 알려주는 것이지요.

이쯤되면 초보자 여러분들의 원망이 들리는 듯 합니다.
'뭐가 이렇게 어려워! 이게 무슨 초보용이야!' 라고 말이지요. -_-a
하지만.. 잘 이해가 가지 않는다고 해서 벌써부터 좌절하실 것은 없습니다.
'개체' 의 개념은 사실 어렵습니다. '개체' 만을 설명하기 위한 책이 따로 있을 정도니까요.
하지만 앞으로 ASP 를 계속 공부해 나가시다 보면 싫어도 별 수 없이 개체를 자주 만나게 되고,
그러다보면 미운정 고운정이 들면서, 슬슬 이해가 가기 시작할 겁니다. ^^

3. IF ~ THEN
- IF ~ THEN 구문은 지난 강좌에서 설명드렸던 구문입니다. 반가우시죠? ^^
오늘은 단지 참과 거짓만이 아닌, 조금 더 많은 경우를 생각해 보려고 합니다.
한가지 예를 들어볼까요? intNumber 라는 변수에 어떤 숫자가 들어있다고 가정하고요.
이중에서 1,2,3 에 대한 경우의 처리가 달라야 한다면 어떻게 할까요?
네. 아마도 다음과 같이 하면 될 것 같습니다.

IF intNumber = 1 THEN
    Response.Write "intNumber 에 들어있는 수는 1입니다!"
ELSEIF intNumber = 2 THEN
    Response.Write "intNumber 에 들어있는 수는 2입니다!"
ELSEIF intNumber = 3 THEN
    Response.Write "intNumber 에 들어있는 수는 3입니다!"
ELSE
    Response.Write "intNumber 에 들어있는 수는 1,2,3 이 아닌 다른 숫자입니다!"
END IF

갑자기 Response.Write 라는 녀석이 나와서 깜짝 놀라셨을 것 같은데요.
이것은 현재 화면에 문자열을 보여주라는(출력하라는) 함수가 되겠습니다.
(지금은 우선 이 정도로만 알아두시고, 다음 기회에 조금 더 자세히 알아보도록 하겠습니다.)

위의 조건절이 이해가 가시나요?
intNumber 에 들어있는 숫자가 1이라면 가장 위의 조건을 만족하게 되고, 화면에는 두번째 라인에 있는 "intNumber 에 들어있는 수는 1입니다!" 라는 문자열이 출력되게 됩니다.
만약 2라면? 그렇다면 세번째 라인에 있는 조건을 만족하게 되고 화면에는 "intNumber 에 들어있는 수는 2입니다!" 라는 문자열이 출력되게 됩니다.
마찬가지로 3이면 다섯번째 라인에 있는 조건을 만족하게 되고 "intNumber 에 들어있는 수는 3입니다!" 라는 문자열이 화면에 출력되게 됩니다.
그런데.. 1, 2, 3 이 아닌 그 외의 수라면 어떨까요?
그때에는 어느 경우에도 해당되지 않으므로 7번째 라인에 있는 ELSE 조건에 걸리게 되고,
화면에는 "intNumber 에 들어있는 수는 1,2,3 이 아닌 다른 숫자입니다!" 가 보여집니다.

이처럼 몇가지의 조건이 있을 때, 각각의 조건에 따라 다른 과정을 거치게 하고 싶을 때 사용하는 구문이 바로 IF ~ THEN 구문이 되겠습니다.

4. SELECT CASE
- 'SELECT CASE' 문 역시 IF ~ THEN 구문과 마찬가지로 '조건 구문' 이 되겠습니다.
하지만 SELECT CASE 는 '조건이 많을 때' 주로 사용합니다. 예를 들어 볼까요?
위에서는 intNumber 라는 변수에 1,2,3 의 숫자가 들어가는 경우에만 다른 처리를 했습니다.
그런데 이번엔 3까지가 아닌 10까지 다른 처리를 하고 싶어 졌습니다. 그러면 어떻게 할까요?

물론 IF ~ THEN 으로도 가능합니다.
하지만 이렇게 조건이 많은 경우에는 보통 SELECT CASE 문을 사용합니다.
다음의 내용처럼 말이지요.

SELECT CASE intNumber
CASE 1
    Response.Write "intNumber 에 들어있는 수는 1입니다!"
CASE 2
    Response.Write "intNumber 에 들어있는 수는 2입니다!"
CASE 3
    Response.Write "intNumber 에 들어있는 수는 3입니다!"
CASE 4
    Response.Write "intNumber 에 들어있는 수는 4입니다!"
CASE 5
    Response.Write "intNumber 에 들어있는 수는 5입니다!"
CASE 6
    Response.Write "intNumber 에 들어있는 수는 6입니다!"
CASE 7,8,9
    Response.Write "intNumber 에 들어있는 수는 7,8,9 중 하나입니다!"
CASE 10
    Response.Write "intNumber 에 들어있는 수는 10입니다!"
CASE ELSE
    Response.Write "intNumber 에 들어있는 수는 1부터 10 사이의 정수가 아닙니다."
END SELECT

SELECT CASE 문의 사용법은 위와 같습니다.
SELECT CASE 다음에 조건을 검사할 변수를 위치시키고,
CASE 1, CASE 2, CASE 3... 와 같은 방법으로 조건을 확인하는 것입니다.
보시다시피 IF 문보다 훨씬 간결하고 사용이 편리합니다. (별로 어렵지 않지요?)
중간에 나오는 CASE 7,8,9 처럼 콤마(,) 를 사용하여 조건을 중복할 수도 있습니다.

IF ~ THEN 과 SELECT CASE 는 자주 사용되는 구문이므로, 잘 알아두시면 좋습니다.
(써놓고 나니까 무슨 전문 입시 학원의 강사같은 발언이군요. ^^)

5. FOR ~ NEXT
- FOR ~ NEXT 구문은 동일한 형식의 작업을 반복하려 할 때 주로 사용하는 구문입니다.
예를 들어 1부터 100까지의 숫자를 화면에 보여지게 하라는 명령이 떨어졌을 때,
'좋아, 뭐.. 그정도라면' 이라고 생각하며 빠른 타자로 1부터 100까지 입력할 수 있겠습니다.
그런데 만약 1부터 10000까지의 숫자를 화면에 보여지게 하라는 명령이 떨어졌다면...
이제부터는 더이상 농담이 아닌 상황이 발생하는 것입니다.
(계산해보니 1초에 숫자 하나씩 입력한다고 해도 얼추 3시간 정도 걸리는 군요.)

이럴 때 유용하게 사용되는 것이 바로 FOR ~ NEXT 구문입니다.

만약에 1부터 10000까지의 숫자를 화면에 출력하라는 명령이 떨어졌을 때,
FOR ~ NEXT 구문을 이용하면 다음과 같이 쓸 수 있습니다.

DIM intLoop
FOR intLoop = 1 TO 10000 STEP 1
    Response.write intLoop & "<BR>"
NEXT

이렇게 작성한 후 ASP 페이지를 실행시키면 - 직접 테스트 해보는 것도 재미있습니다 -
1부터 10000까지의 (1씩 증가하는) 숫자들의 나열을 보실 수가 있습니다.
숫자의 뒤에 <BR> 태그를 추가한 것은 '다음 줄로 바꾸기' 위해서입니다.
만약 <BR> 태그가 없다면 한줄로 주욱~ 나열된 - 보기가 꽤 어려운 - 형태가 출력됩니다.

FOR ~ NEXT 구문의 형식은 다음과 같습니다.

FOR 시작 TOSTEP 증가
    반복되어 실행될 구문
NEXT

일반적으로 많이 쓰이는 방식은..
시작 부분에 작은 수, 끝 부분에 큰 수를 넣은 다음 1씩 증가하면서 실행하는 방식입니다.
(여기서 STEP 부분은 생략할 수 있고, 생략하게 되면 기본적으로 1씩 증가하게 됩니다.)

그렇게 되면 이 조건(끝 부분)이 만족될 때까지 실행 구문이 반복적으로 실행되는 것이지요.
이처럼 FOR ~ NEXT 구문은 반복 실행해야 하는 횟수를 알고 있을 때 사용하면 편리합니다.

5. DO WHILE
- DO WHILE 문도 FOR ~ NEXT 문과 마찬가지로 동일한 형식의 반복 작업시에 사용합니다.
하지만 FOR ~ NEXT 문이 반복 실행 횟수를 정확하게 알고 있을 때 주로 사용한다면,
DO WHILE 문은 실행 횟수를 정확하게 모르고 있을 때, 또는 순환할 때마다 조건을 검사해서 계속 순환할 지 여부를 체크해야 할 때 사용하는 것이 유리합니다.

위에서 FOR ~ NEXT 문에서 사용한 예제를 DO WHILE 로 변경해 볼까요?
(참고로 아래의 내용은 FOR ~ NEXT 예제의 결과와 완전히 일치합니다.)

DIM intLoop
intLoop = 1
DO WHILE intLoop <= 10000
    Response.write intLoop & "<BR>"
    intLoop = intLoop + 1
LOOP

FOR ~ NEXT 문보다는 약간 복잡해 보이나요? 간단하게 설명을 드리도록 하겠습니다.
두번째 줄에서, 우선 DO WHILE 문을 시작하기 전에 intLoop 변수에 초기값 1을 대입합니다.
세번째 줄이 가장 중요한 부분이 되겠는데요.
DO WHILE intLoop <= 10000 이라는 부분의 의미는
'intLoop 변수에 담긴 숫자가 10000보다 같거나 작은 동안에는 계속 실행해라'
는 뜻이 됩니다. (이 내용은 순환할 때마다 매번 검사합니다.)

그리고 5번째 줄에 intLoop = intLoop + 1 이라는 구문이 있는데,
이 부분은 프로그램을 처음 공부하시는 분들께서 가장 혼동하기 쉬운 부분 중에 하나입니다.

이것은 'intLoop 와 intLoop + 1 이 같다' 는 'equal' 의 의미가 아닙니다. (말이 안되죠?)
이 구문의 의미를 해석하면, '왼쪽에 있는 intLoop 라는 변수에다가, 오른쪽에 있는 intLoop 변수의 현재 값에 1을 더한 결과 값을 대입해라' 라는 뜻이 됩니다.
('=' 은 '오른쪽에서 계산된 값'을 '왼쪽의 변수에 대입' 하라는 의미를 가지고 있습니다.
이때 사용되는 '=' 를 '대입 연산자' 라고 부릅니다. 상식으로 알아두시면 좋겠지요?)

두번째 줄에 나온 intLoop = 1 도 마찬가지입니다.
왼쪽에 있는 intLoop 라는 변수에 오른쪽에 있는 숫자 1을 대입하라는 뜻이지요.
그리하여 6번째 줄에 있는 LOOP 를 만나게 되면 다시 3번째 줄로 돌아간 다음,
조건을 다시 검사하고, 조건과 일치하면 구문을 반복하게 되는 것입니다.

순환문을 사용하실 때, 여러분들께서 주의하셔야 할 점이 있습니다.

만약 위의 DO WHILE 문에서.. 5번째 줄을 깜빡 잊고 입력하지 않았다면 어떻게 될까요?
intLoop 변수는 증가하지 않으므로 항상 1이 될 것이고..
때문에 DO WHILE intLoop <= 10000 구문은 항상 참이 되어서 계속 실행될 것입니다.
즉, 이 순환문은 절대로 종료되지 않는 것이지요.

이것을 '무한 루프' 라고 합니다. '무한하게 계속되는 순환문' 이라는 뜻이지요.
무한 루프에 빠지게 되면 컴퓨터를 강제 종료해야 하는 등, 심각한 사태가 발생할 수 있습니다.
(권장하고 싶지는 않지만, 궁금하신 분들께서는 위의 DO WHILE 문에서 5번째 줄을 생략하고 실행해 보시기 바랍니다. 아마 컴퓨터 CPU 사용률이 급격히 증가하여 컴퓨터가 느려지고, 심지어 심한 경우에는 먹통이 되어버리는 경우를 목격하실 수도 있습니다.)

자, 오늘은 ASP 에서 사용되는 기본 문법 몇가지에 대해서 살펴보았습니다.
우선, 변수를 선언하는 Dim 명령어에 대해서 알아보았고요.
그 다음 개체의 인스턴스를 생성할 때 사용하는 Set 명령어를 알아보았습니다.
그리고 Set 명령어와 연관된 개체와 인스턴스, 속성, 메소드에 대한 이야기를 하게 되었지요.

조건을 검사하는 구문인 IF ~ THENSELECT CASE 문에 대해서도 살펴보았습니다.
조건이 적은 경우 IF ~ THEN, 조건이 많은 경우 SELECT CASE 를 사용한다고 했었지요.

그리고 순환문에 대해서도 알아보았는데요.
순환 횟수를 이미 알고 있는 경우 FOR ~ NEXT 구문을, 모르는 경우는 DO WHILE 구문을 사용한다는 것도 배워보았습니다. (반드시 그런 것은 아닙니다. 일반적으로 그렇다는 말이지요.)

짧은 강좌에서 많은 내용을 다루다보니 조금 헷갈리실지도 모르겠습니다만
인내심을 가지고 천천히 읽어보시면 이해가 되리라고 생각합니다. (그러기를 바랍니다. ^^)

오늘 역시 기본 문법에 해당하는 내용으로..
ASP 에서 사용되는 '데이터들의 타입(Data Type)' 에 대해서 알아보려고 합니다. 그리고, 그 지식을 기반으로 하여 하나의 타입을 다른 타입으로 변환하는 함수들에 대해서 살펴 보고자 합니다.

'데이터 타입' 이라는 용어를 딱딱하게 생각하실 필요는 없습니다.
우리가 변수에 어떤 값을 넣을 때, 그것이 어떤 형식의 값인지를 알아보려는 것 뿐이니까요.
ASP 상에서 어떤 변수에 숫자, 문자, 날짜 처럼 각각 다른 타입의 값을 넣으려 할 때
어떻게 해야 하는지, 그리고 그것들의 차이는 무엇이 있는지를 알아보려 하는 것입니다.

자, 그럼 오늘의 강좌를 시작하도록 하겠습니다.
오늘 생각해보고자 하는 '데이터 타입' 의 종류를 정리하면 다음과 같습니다.

데이터 타입
1. 숫자 서브 타입 정수나 분수, 또는 부동 소수점 등 다섯 개의 타입이 있다.
2. 문자열 서브 타입 텍스트 정보를 보관한다.
3. 날짜 서브 타입 날짜와 시간을 보관하는 데 쓰이는, 미리 정해진 타입이다.
4. 부울린 서브 타입 참, 거짓을 의미하는 TRUE 또는 FALSE 값 중 하나를 가진다.
5. 그 외의 서브 타입 Empty, Null 등을 알아본다.

자, 그럼 위의 내용들을 하나하나 자세하게 살펴보도록 하겠습니다.

1. 숫자 서브 타입

변수에 숫자가 들어가면 그것이 바로 '숫자 서브 타입' 이 됩니다.
하지만 숫자의 크기에 따라서 다음 여섯 가지 정도의 타입으로 다시 나눌 수가 있습니다.

1-1. 정수(Integer) - 숫자 타입 중에서 가장 일반적으로 쓰이는 타입입니다.
    -32,768 부터 32,767 사이의 정수가 바로 이 Integer 타입에 해당하게 됩니다.
    (참고로 32,767은 2의 15승에서 1을 뺀 숫자가 되겠습니다.)

1-2. 바이트(Byte) - 바이트라는 말.. 많이 들어보셨지요?
    0부터 255까지의 정수(2의 8승 - 1)가 Byte 타입에 해당합니다.
    이 타입은 기본적인 숫자의 연산에 사용되는 타입입니다.

1-3. 긴 정수(Long) - 이름부터 벌써 '긴' 타입입니다.
    이것은 Integer 타입과 유사하지만 훨씬 더 큰 수를 지원하는 타입입니다.
    -2,147,483,648 부터 2,147,483,647 사이의 정수(2의 31승 - 1)가
    이 Long 타입에 해당합니다.

1-4. 싱글(Single) - 싱글이라는 말 때문에 작은 숫자를 연상하실지도 모르겠습니다.
    하지만 싱글은 예상과는 달리 -3.402823E38 부터 -1.401298E-45 까지의 음수,
    그리고 1.401298E-45 부터 3.402823E38 까지의 양수 단정도 부동소수점
    (單精度 浮動小數點)을 지원하는 타입입니다.

1-5. 더블(Double) - 더블이라.. 아무래도 싱글보다는 곱빼기로 큰 타입 같지 않습니까?
    맞습니다. 하지만 두배가 아닌 훨씬 더 엄청난 범위를 지원하는 데이터 타입이 되겠습니다.
    음수에 대해서는 -1.79769313486232E308 부터 -4.94065645841247E-324 까지,
    양수에 대해서는 4.94065645841247E-324 부터 1.79769313486232E308 까지의
    배정도 부동소수점(倍精度 浮動小數點) 을 지원합니다.

1-6. 통화(Currency) - Currency 타입은 '화폐 단위' 를 의미하는 데이터 타입입니다.
    이 타입은 소숫점 네자리까지의 숫자를 지원하는데요. 지원하는 범위는
    -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 까지 입니다.

2. 문자열 서브 타입

문자열 서브 타입은 말 그대로 '문자열' 을 보관합니다.
문자열 서브 타입을 정의하기 위해서는 문자열의 앞뒤에 큰 따옴표(")를 붙여주면 됩니다.
자, 그럼 여기서 깜짝 퀴즈를 하나 드리겠습니다. 다음의 예를 BoA주세요.

Dim strFirst, strSecond, strPlus
strFirst = "139"
strSecond = "52"
strPlus = strFirst + strSecond

이 과정을 모두 거친 후에 strPlus 라는 변수에는 어떤 값이 들어 있을까요?

"191" 이라고 답변하신 분들은 함정에 보기 좋게 넘어간 분들이십니다.
strPlus 변수에 들어있는 값.. 정답은 "13952" 가 됩니다.

두 변수에 들어 있는 값이 비록 숫자라고 하더라도, 큰 따옴표 안에 있기 때문에
이것은 '숫자 서브 타입' 이 아닌 '문자열 서브 타입' 이 되는 것입니다.
그러므로 "139" 라는 문자열과 "52" 라는 문자열이 합쳐져서
"13952" 라는 새로운 문자열이 만들어지게 되는 것이지요. 이해가 되시지요?
조만간 우리는 이 '문자열' 을 자유자재로 다루는 함수들에 대해서 만나게 될 것입니다.

3. 날짜 서브 타입

'날짜 정보' 를 저장하는 날짜 서브 타입을 사용하려면, 정해진 규칙을 사용해야만 합니다.
표현하고자 하는 날짜의 앞뒤에 '#' 기호로 둘러 싸는 것이 바로 그 규칙이 되겠습니다.
예를 들어 1975년 1월 19일을 날짜 서브 타입으로 나타내면 다음과 같습니다.

#01/19/1975#


만약 여기서 '#' 기호를 빼고 사용하면 어떻게 될까요?
이 경우 ASP 에서는 '날짜 서브 타입' 이 아닌 '숫자 서브 타입' 으로 인식하게 됩니다.
그러므로 우선 1 에서 19를 나누고, 그 결과 값에 다시 1975를 나눈..
2.66489007328448E-05 라는 전혀 엉뚱한 값으로 인식하게 되는 것이지요.
그렇다면.. 만약 큰 따옴표를 사용하여 "01/19/1975" 라고 한다면 어떨까요?
네. 예상하신 대로 "01/19/1975" 라는 문자열 값이 그대로 저장되게 될 것입니다.

어떻습니까? 이제 감을 좀 잡으시겠습니까?
그나저나.. 1975년 1월 19일이 무슨 날이냐고요?
음, 눈치가 빠른 분들께서는 바로 감 잡으셨을텐데... (저의 생일 되겠습니다. 하핫~.)

4. 부울린(Boolean) 서브 타입

부울린 서브 타입이라는 말은 우리 말로 하면 '참, 거짓 서브 타입' 정도로 말할 수 있겠습니다.
즉 이 타입에서는 참(TRUE) 아니면 거짓(FALSE) 값만을 가질 수 있는 것이지요.
참고로 이 값을 ASP 상에서 정수형으로 변환할 수도 있는데요.
이 경우 TRUE 는 -1 의 값을, FALSE 는 0 의 값을 가지게 됩니다. (상식으로 알아두세요.)
이 부울린 서브 타입은 지난 강좌에서 보신 대로 조건문(IF ~ THEN) 에서 주로 사용됩니다.

5. 그 외의 서브 타입

그 외의 특별한 타입으로는 Empty 와 NULL, Object, Error 등이 있는데요.
우리는 이중에서 EmptyNULL 에 대해서만 알아보도록 하겠습니다.
('왜 그것들만?' 이라고 생각하셨지요? 나머지 타입들은 잘 사용되지 않기 때문입니다.)

5.1 Empty - Empty 라는 단어의 사전적인 의미는 '비어있다' 는 뜻입니다.
    마찬가지로 Empty 변수는 '값을 전혀 가지고 있지 않다' 는 뜻으로 사용됩니다.
    (주의해야 할 점은 Empty = 0 이 아니라는 것입니다. 0은 분명히 유효한 값입니다.)

5.2 NULL - 이것은 데이터베이스와 연결하여 사용되는 특별한 데이터 타입입니다.
    (혹시 데이터베이스가 무엇인지 모르신다 하더라도 신경쓰지 마시고 그냥 읽어주세요.)
    아무 것도 아니고, 데이터 타입도 아니고, 데이터를 가지고 있지도 않은 것...
    이것이 바로 NULL 의 의미가 되겠습니다.
    이 NULL 에 대해서는 나중에 Database 강좌에서 자세히 다루도록 하겠습니다.

    헷갈리지 말아야 하는 것은.. 아무 것도 아니라고 하는 말을 오해하여
    0 또는 빈 문자열, 빈 공간, 길이가 0인 문자열 등과 혼동해서는 안된다는 것입니다.
    이것들은 분명히 '어떤 값' 입니다. NULL 은 '아무 것도 아니라는' 것에 유의하셔야 합니다.


자, 여기까지!! ASP 에서 사용되는 여러가지 데이터 타입에 대해서 살펴보았습니다.
어떻습니까? ASP 에서 (엄밀하게 말하자면 VBScript에서) 사용되는 데이터 타입들이
상당히 다양하고, 또 매우 정교하게 구성되어 있다는 생각이 들지 않나요?

재미있는 사실을 한가지 말씀드리자면..
다른 대부분의 프로그램 언어에서는 변수를 선언할 때 '이 변수에는 숫자가 들어가' 또는 '이 변수에는 문자열이 들어가' 라고 데이터 타입을 작성자가 미리 정확하게 입력해 주어야만 합니다.
(만약 '숫자 서브 타입' 으로 설정한 변수에 문자열을 입력하면 오류가 발생하게 됩니다.)
하지만 ASP 에서는 그럴 필요가 없습니다. 자기가 알아서 다~ 변환시켜 주거든요.

즉, a 라는 변수가 있다고 가정하고 이 변수에 5 라는 값(숫자 서브 타입)을 입력했다가,
다시 그 a 변수에 "에이" 라는 값(문자열 서브 타입)을 입력할 수 있다는 말이 되겠습니다.

이것은 비록 몇 가지의 단점이 있을 수 있고, 성능의 저하를 유발할 가능성이 있지만,
우리와 같은 초보들에게는 상당히 반가운 소식이라고 할 수 있겠습니다.
변수에 어떤 타입의 값을 넣어도 ASP 에서 알아서 처리해 준다는 뜻이니까요.

자, 이제 여러분은 ASP 에서 사용되는 '데이터 타입' 에 대해서 살펴보았습니다.
비록 ASP 에서 자체적으로 타입을 결정해 준다고는 하지만,
그렇다고 해서 어떤 타입들이 있는지 조차 모르고 프로그래밍을 하면 곤란하지 않을까요?

그렇습니다...  일단 여기까지 OK!!!

그렇다면, 이번에는 앞에서 배운 내용을 토대로..
하나의 타입을 다른 타입으로 변환하는 함수들에 대해서 살펴 보고자 합니다.

타입의 변환이라.. 그 의미를 말씀드리자면 다음과 같습니다.
지난 시간에 우리는 ASP 에서 어떤 변수에 값을 입력할 때,
그 값의 형식이 자동적으로 결정되어진다는 사실을 알게 되었습니다.

이것은 우리가 변수의 타입을 신경쓰지 않아도 되므로 편리하다는 장점이 있습니다.
하지만.. 애초에 기대했던 타입으로 들어가지 않을 수도 있다는 우려 또한 존재할 수 있는데요.
그럴 때를 대비해서 ASP 에서는 다른 타입으로 변환시켜주는 많은 함수들을 제공합니다.
오늘은 그렇게 '타입을 변환시켜 주는 함수들' 에 대해서 알아보고자 합니다.

그러면 오늘 공부해 볼 함수들을 표로 한번 정리해 보도록 하겠습니다.
(파란 글자 처리가 된 것은 특히 자주 사용되는 함수들입니다. 주의깊게 보아 주세요.)

변환 함수
1. 숫자 서브 타입 관련 CInt, CLng, CByte, CSng, CDbl, CCur, Fix, Int, Abs
2. 문자열 서브 타입 관련 CStr, Asc, AscB, AscW, Chr, ChrB, ChrW
3. 날짜 서브 타입 관련 CDate, DateValue, TimeValue, DateSerial, TimeSerial
4. 부울린 서브 타입 CBool
5. 기타 변환 함수 Hex, Oct, Sgn

나열하다보니 꽤 많군요. 그럼 이제부터 하나씩 알아보도록 할까요?

1. 숫자 서브 타입 관련
1-1. CInt, CLng

CInt 와 CLng 함수는 숫자형으로 변환하는 함수 중에 가장 많이 쓰이는 함수입니다.
CInt는 정수형(Integer), CLng 는 긴 정수형(Long)의 값으로 변환시켜 주는 함수지요.

예를 들자면 다음과 같습니다.

DIM intFirst, intSecond, intPlus
intFirst = "200"
intSecond = "400"
intPlus = intFirst + intSecond

이 경우 intPlus 의 값은 600 이 아닌 "200400" 이 된다는 말씀을 지난 강좌에서 드렸지요?
(200 과 400 의 앞뒤에 큰 따옴표가 있기 때문에 문자열 서브 타입이 되기 때문입니다.)
이것을 CInt 함수를 써서 변환시키면 어떻게 될까요?

intFirst = CInt ("200")
intSecond = CInt ("400")
intPlus = intFirst + intSecond

이제 intPlus 에는 우리가 원하던대로 600 이라는 값이 들어가게 됩니다.
이처럼 CInt 는 인자로 들어온 값을 '숫자 서브 타입' 으로 변경해주는 함수입니다.

그런데 만약 intSecond = CInt ("50000") 와 같이 사용하면 어떻게 될까요?
네.. 이 경우에는 '오버플로' 라는 오류를 만나게 됩니다.
정수형(Integer)의 한계치인 32,767 을 넘어갔기 때문이지요.
이때에는 CLng 를 사용하여 intSecond = CLng ("50000") 과 같이 사용하시면 되겠습니다.

그리고 CInt 와 CLng 는 정수형 타입이므로 소수점을 포함한 숫자가 인자로 들어온다면
'반올림한 정수' 를 돌려준다는 사실을 추가적으로 기억해 주시기 바랍니다.
(한가지 재미있는 규칙은.. 정확하게 절반인 경우에는 가장 가까운 짝수를 반환합니다.
즉 CInt (0.5) 인 경우에는 0을, CInt (1.5) 인 경우에는 1을 반환한다는 것이지요.)

또한, 주의하실 점을 한가지 알려드리자면..
CInt 나 CLng 에 '숫자로 변환할 수 없는 값' 을 넣는다면 오류가 발생한다는 것입니다.
(예를 들어 CInt ("abc") 나 CInt ("오십삼") 처럼은 사용하실 수 없다는 뜻이지요.)

1-2. CByte, CSng, CDbl, CCur

그렇다면 이제 CByte와 CSng, CDbl, CCur 등의 함수의 용도도 대충 짐작이 가시겠지요?
CByte 는 CInt 와 마찬가지로 정수 값을 반환해 줍니다. (반올림 규칙도 일치합니다.)
하지만 변환된 값이 0 ~ 255 사이의 값이 아니라면 오류가 발생합니다.

CSng 와 CDbl 도 각각 Single, Double 형의 값을 반환해 주는데요.
예를 들어서 다음 두 변수에 같은 값을 인자로 주었다고 가정해 보겠습니다.

intFirst = CSng ("12345.54321")
intSecond = CDbl ("12345.54321")

이때 intFirst 값은 12345.54, intSecond 값은 12345.54321 으로 나타나게 됩니다.
(결과 자체보다는.. CSng 보다 CDbl 이 정밀하다는 사실을 기억해두시기 바랍니다.)

CCur 역시 CSng, CDbl 과 마찬가지이지만 '통화' 용도로 사용된다는 설명을 드렸었지요?
CCur 은 특이하게도 소수점 5자리에서 반올림을 하게 됩니다.
즉, CCur ("12345.54321") 이라고 한다면 12345.5432 라는 값이 반환되는 것이지요.

1-3. Fix, Int, Abs

Fix 와 Int 는 모두 '잘라내기를 통해 숫자의 정수 부분을 반환' 하는 함수입니다.
즉 Fix (9.8) 이나 Int (9.8) 모두 똑같이 9 라는 값을 반환한다는 뜻이지요.
그렇다면 이 두 함수의 차이는 무엇일까요? 그것은 바로 음수의 처리에 있습니다.
쉽게 말씀드리자면 Fix (-9.8) 은 -9를, Int (-9.8) 은 -10을 반환한다는 의미인 것입니다.
(즉, Fix 는 소수점 이하 숫자를 없애버리는 것이고, Int 는 '내림' 을 하는 것이지요.)

Abs 는 수학에서 많이 쓰이는 함수인데요.. 절대값을 반환합니다.
즉 Abs (-3.5) 나 Abs (3.5) 모두 3.5 라는 값을 반환하게 되지요.

2. 문자열 서브 타입 관련
2-1. CStr

CStr 은 말 그대로 '문자열' 로 바꾸어주는 함수가 되겠습니다.
예를 들어서 intFirst 라는 변수를 선언한 다음, intFirst = 503 이라고 한다면
intFirst 변수에는 자동적으로 503 이라는 '숫자 서브 타입의 값' 이 들어가게 될 것입니다.
이때, strFirst = CStr(intFirst) 라는 구문을 실행하게 되면
strFirst 에는 "503" 이라는 '문자열 서브타입의 값' 이 들어가게 되는 것이지요.

2-2. Asc, AscB, AscW

Asc 함수는 문자열 첫 글자의 'ANSI 문자 코드' 를 반환합니다.

여기서 잠깐!!

ANSI ('안시'라고 읽지요) 문자 코드? 이게 무슨 말일까요?
ANSI 란 'American National Standards Institute' 의 약자이며,
미국 내에서 기술표준 개발을 육성하기 위해 설립된 '미국 표준 협회' 를 의미합니다.

얘네들이 컴퓨터에 관한 표준을 제정한 것이 몇가지가 있는데,
그중에 우리가 알아두면 좋은 것이 '아스키(ASCII)' 라는 녀석입니다..
ASCII 는 'American Standard Code for Information Interchange' 의 약자로서
'컴퓨터나 인터넷상에서 텍스트 파일을 위한 가장 일반적인 형식' 을 의미합니다.

아스키 파일에서는 우리가 키보드에서 입력하는 영문자, 숫자, 특수 문자들이
7 비트의 2 진수(0 또는 1로 이루어진 숫자 조합 7개를 뜻합니다) 로 표현되며,
모두 128 개의 문자가 정의되어 있습니다.

무슨 말인지 도무지 모르시겠다고요? 음.. 사실은 저도 써놓기만 했지 잘은 모릅니다. ^^
행여 잘 모르시겠다고 해서 스트레스 받지 마시고요. 누군가가 'ANSI' 가 어쩌고 'ASCII' 가 저쩌고 그러면 '아, 나 그거 쫌 알아~' 라고 살짝 웃으면서 답해주시면 되겠습니다.

우리가 키보드에서 입력하는 모든 문자들에는 각각 고유한 값이 있는데요.
그걸 정한 애들이 ANSI 이고, 그렇게 정의된 값들이 ASCII 값이다~
우선은 그정도만 알고 계셔도 크게 불편한 점은 없을 것 같습니다. ^^

에를 들어볼까요? Asc ("A") 의 값은 65, Asc ("B") 는 66, Asc ("C") 는 67...
이런식으로 진행하여 Asc ("Y") 는 89, Asc ("Z") 는 90 이라는 값이 됩니다.
(참고 삼아 말씀드리면, Asc 는 대문자와 소문자의 값이 서로 다릅니다.
즉 Asc ("A") 는 65 지만, Asc ("a") 는 97 입니다. 혼동하시면 아니되옵니다.)

그 뒤에 나오는 AscB 와 AscW 함수는 우리가 사용할 일이 거의 없는 함수입니다만
쓰임새에 대해서만 간략하게 말씀드리자면... AscB 는 바이트에 대해 쓰이고,
AscW는 UNICODE를 이용하는 32-비트 플랫폼에서 이용된다고 하네요.

2-3. Chr, ChrB, ChrW

Chr 함수는 Asc 의 반대 함수로, 코드 값을 입력하면 그에 해당하는 문자를 반환합니다.
즉, Chr (65) 라고 하면 "A" 라는 값을 반환한다는 의미가 되지요.

마찬가지로 ChrB 와 ChrW 함수도 각각 AscB 와 AscW 함수의 반대 함수가 되겠습니다.

참고로.. 큰 따옴표(")를 의미하는 Chr (34) 번이나, 글의 내용을 입력하는 TEXTAREA 에서
개행을 의미하는 Chr (13), Chr (10) 같은 함수들은 꽤 빈번하게 쓰이는 편이니까요.
이것들은 상식으로 알아두시면 나중에 유용하게 사용할 때가 있을 것입니다.

3. 날짜 서브 타입 관련
3-1. CDate

CDate 함수는 인자로 들어온 값을 '날짜형' 으로 바꾸어 주는 함수입니다.
하지만 인자에 '날짜로 변환할 수 없는 형식의 값' 이 들어오면 오류를 발생시킵니다.
예를 들면 다음과 같습니다.

CDate ("2003년 7월 16일 19:00")

이 함수의 결과는 '2003-07-11 오후 7:00:00' 이 됩니다.
하지만 다음처럼 컴퓨터가 알아볼 수 없는 형식의 문자열을 넣으면 오류를 발생시킵니다.

CDate ("이천삼년 칠월 십육일 일곱시")

'그렇다면 컴퓨터가 알아먹는 날짜 형식이 어떤건데?' 라고 질문이 나올 법 한데요.
이럴 때를 대비해서 ASP 는 ISDATE 라는 함수를 제공합니다.
이 함수는 '날짜형' 으로 변환이 가능한지 아닌지를 알려줍니다.
즉 ISDATE ("2003년 7월 16일 19:00") 은 변환이 가능하므로 True 값을 반환하게 되고요.
ISDATE ("이천삼년 칠월 십육일 일곱시") 는 변환이 불가능하므로 False 값을 반환합니다.

3-1. DateValue, TimeValue, DateSerial, TimeSerial

날짜 서브 타입 관련 함수 중에서 조금 더 세분화 된 함수들이 있는데요.
날짜에 관련된 함수로는 DateValue, DateSerial 이 있고,
시간에 관련된 함수로는 TimeValue, TimeSerial 이 있습니다.

DateValue 와 DateSerial 함수는 결과값으로 모두 '년-월-일' 을 반환하는데요.

DateValue ("2003년 7월 16일 19:00:32")
DateSerial (2003,7,16)

이렇듯 DateValue인자가 하나이고, DateSerial인자가 세개라는 차이가 있습니다.
(두 함수 모두 날짜를 반환하는 함수이므로.. 결과는 "2003-07-16" 으로 동일합니다.)

또한, 시간과 관련된 TimeValue 와 TimeSerial 함수는 '시-분-초' 를 반환합니다.

TimeValue ("2003년 7월 16일 19:00:32")
TimeSerial (19,0,32)

DateValue, DateSerial 함수와 사용법은 같다고 보셔도 무방하겠습니다.
위의 예제에서 보듯이 TimeValue인자가 하나, TimeSerial인자가 세개입니다.
(결과는 두 함수 모두 "오후 7:00:32" 로 같다는 것은... 이미 짐작하고 계셨다고요?)

4. 부울린 서브 타입 관련
4-1. CBool

CBool 함수는 참, 거짓을 판별하여 True 와 False 값중 하나를 반환합니다.
CBool 함수의 인자로는 '숫자' 나 '유효한 식' 이 들어갈 수가 있는데요.
숫자가 인자로 들어가는 경우 0일때는 False, 나머지 숫자인 경우에는 True 를 반환합니다.
예를 들면 다음과 같이 되는 것이지요.

CBool(0) -> False 를 반환합니다.
CBool(1) -> True 를 반환합니다. (0이 아닌 다른 모든 수)

식이 들어가는 경우의 예를 들어보면 다음과 같은데요.

CBool ("a" = "a") -> True 를 반환합니다.
CBool ("a" = "b") -> False 를 반환합니다.

하지만 CBool ("exhibition") 과 같이 '숫자' 도 '식' 도 아닌..
단순한 문자열을 넣는 경우에는 오류를 발생시키므로 주의하셔야 하겠습니다.

5. 기타 변환 함수
5-1. Hex, Oct, Sgn

자주 쓰이지는 않지만 알아두면 좋을 변환 함수로는 Hex, Oct, Sgn 등이 있습니다.

우선 Hex 함수는.. 인자로 들어온 값 (10진수) 의 '16진수로 변환된 값' 을 반환합니다.
즉, Hex (10) 라고 한다면 "A" 를 반환하게 되겠지요.
Oct 함수는 인자로 들어온 값 (10진수) 의 '8진수로 변환된 값' 을 반환합니다.
Oct (10) 이라고 하면 Hex 와는 달리 '12' 를 반환하게 됩니다.

(참고로.. Hex 는 hexadecimal, Oct 는 octal 의 약자로 각각 16진법, 8진법을 의미합니다.
8진법과 16진법에 대한 설명은 중학교 수학 교과서를 참고하시기 바랍니다. -_-a)

Sgn 함수는 수의 부호를 나타내는 정수를 반환하는데요.
양수라면 1을, 음수라면 -1을, 그리고 0이라면 0을 반환합니다.

Sgn (52.3) -> 1 을 반환합니다.
Sgn (-2.5) -> -1 을 반환합니다.
Sgn (0) -> 0 을 반환합니다.


자, 오늘의 강좌는 여기까지입니다.
오늘 다룬 내용이 꽤 많아서 다소 혼란스러우실지도 모르겠네요.
위에서 말씀드렸지만, 가장 위에서 표로 정리해둔 내용들 중에 파란 색 글씨로 표시된 함수들은
자주 사용하는 함수들이므로 신경써서 보아 두시는 것이 좋을 것 같습니다.

하지만.. 사실 이런 변환 함수들은 암기 과목 공부하듯이 미리 다 외워서 사용하는 것 보다는
프로그래밍 도중 만날때마다 그때그때 도움말을 찾아가면서 사용법을 익히는 것이
더 유리할 것 같다는 것이 개인적인 생각이기는 합니다. ^^
(그렇다고 해서 오늘 강좌의 내용을 얼렁뚱땅 넘어가라는 말씀은 절대~ 아닙니다.)

더운 날씨에 고생 많이 하셨습니다.
다음 강좌에서는 '문자열 관련 함수들' 에 대해서 살펴보려고 합니다.
그러면 다음 강좌까지 안녕히 계세요. ^^


이 경우 intLength 에는 13이라는 정수형 값이 들어가게 되는 것이지요.
만약 strTest 라는 변수에 아무런 값도 들어있지 않거나, 빈 문자열이라면?
LEN 함수는 이러한 경우에 0 을 반환합니다. 해당 문자열의 길이가 없기 때문이지요.

3. LEFT, RIGHT, MID

LEFT (RIGHT) 함수는 문자열의 왼쪽 (오른쪽) 에서 지정한 길이 만큼의 문자열을 반환하고,
MID 함수는 문자열의 지정한 위치에서, 지정한 길이 만큼의 문자열을 반환합니다.
이 함수들에 대한 설명은 예를 들어 설명드리는 것이 가장 좋을 것 같네요.

Dim strTest, strLeft, strRight, strMid

strTest = "Welcome to Dukyoung.net"
strLeft = LEFT (strTest, 7)
strRight = RIGHT (strTest, 12)
strMid = MID (strTest, 4, 7)

자, 위와 같은 문장을 ASP 에서 실행하면, 각각의 변수에는 어떤 값들이 들어가게 될까요?
우선 strLeft 에는 strTest 의 왼쪽에서 7글자.. "Welcome" 이 들어가게 됩니다.
그리고 strRight 에는 strTest 의 오른쪽에서 12글자.. "Dukyoung.net" 이 들어가지요.
마지막으로 strMid 에는 strTest 의 (왼쪽에서) 4번째 글자인 c 부터의 7글자..
즉, "come to" 라는 문자열이 들어가게 됩니다. (공백도 하나의 문자로 인정합니다.)

사용법이 상당히 간단하지요? 잘 기억해 두시기를 바랍니다.

4. INSTR, INSTRREV

INSTRINSTRREV 함수는 '특정 문자열의 위치' 를 알아내는 함수입니다.
예를 들어서 "내가 그린 기린 그린 그림은 잘 그린 기린 그린 그림이다." 이라는 문장에서
'그린' 이라는 문자가 어디있는지 찾아내려면 다음과 같이 사용하시면 됩니다.

Dim strTest, intTest

strTest = "내가 그린 기린 그린 그림은 잘 그린 기린 그린 그림이다."
intTest = INSTR (strTest, "그린")

이 문장을 실행하고 난 다음 intTest 변수에 들어갈 값은 4가 됩니다.
즉, "그린" 이라는 문자는 strTest 문자열의 4번째 위치에 있다는 뜻이 되는 것이지요.
(만약 "그린" 이라는 문자열이 없다면 intTest 에는 0 이라는 값이 들어가게 됩니다.)
그런데.. INSTR 함수에서는 또 다른 옵션을 줄 수가 있는데요.
그것은 바로 '시작 위치' 를 지정할 수가 있다는 것입니다.
위의 예를 조금 변형하여 다음과 같이 수정을 해보겠습니다.

intTest = INSTR (5, strTest, "그린")

이 함수의 의미는 과연 무엇일까요?
이것은 "그린" 이라는 문자를 찾긴 찾는데.. 5번째 문자 이후부터 찾겠다는 뜻이 됩니다.
즉, 가장 앞에 있는 5 라는 인자는 '시작 위치' 를 나타내는 것이지요.
따라서 이 함수를 실행시킨 후 intTest 의 값은 4가 아닌 10이 됩니다. (두번째 '그린'의 위치)
(사실.. 이 함수에는 가장 마지막 인자로 이진(Binary), 텍스트(Text) 비교에 관련된 인자가
하나 더 있습니다만, 그다지 사용되지 않으므로 설명을 생략하도록 하겠습니다.)

INSTRREV 함수는 INSTR 함수와 사용법이 같은데.. 시작하는 위치가 반대입니다.
즉 INSTR 함수가 문자열의 처음부터 찾는 것에 반해, INSTRREV 함수는 문자열의 끝에서부터 역순으로(거꾸로) 찾는 것이지요.

intTest = INSTRREV (strTest, "그린")

이렇게 하면 intTest 값에는 25라는 숫자가 들어가게 됩니다.
끝에서부터 찾았을 때 가장 먼저 나온 문자열의 위치를 반환하는 것이지요.
이 함수는 '파일의 확장자' 를 알아낼 때에 특히 유용하고, 자주 쓰이는 함수입니다.
(그 내용에 관해서는 나중에 이야기할 기회가 있을 것 같네요. ^^)

INSTRREV 함수 역시 시작 위치를 설정할 수 있는데요..
INSTR 함수와는 다르게 세번째 인자로서 설정합니다. (혼동하지 마시기 바랍니다.)
시작 위치를 설정하면 그 위치부터 역순으로(거꾸로) 검색하게 되는 것이지요.

intTest = INSTRREV (strTest, "그린", 24)

이렇게 사용한 경우 intTest 값에는 19라는 값이 들어가게 됩니다.

5. LTRIM, RTRIM, TRIM

TRIM 이라는 함수는 단어 뜻 그대로 '잘라내는' 함수입니다.
아무거나 잘라내는 것은 아니고, 문자열의 앞뒤에 있는 '공백' 을 잘라내는 함수가 되겠습니다.
마찬가지로 LTRIM좌측의 공백을, RTRIM우측의 공백을 잘라내는 함수입니다.
이 함수들의 예를 들어보면 다음과 같습니다.

Dim strTest, strAll, strLeft, strRight

strTest = "    My Baby Grand    "
strAll = TRIM (strTest)
strLeft = LTRIM (strTest)
strRight = RTRIM (strTest)

strTest 라는 문자열의 앞,뒤로 3칸의 공백 문자가 들어가 있습니다.
그렇다면 TRIM 함수를 실행한 strAll 이라는 변수에는 어떤 값이 들어가게 될까요?
strAll 변수에는 양 옆의 공백이 사라진 "My Baby Grand" 이라는 문자열이 들어가게 됩니다.
마찬가지로 strLeft 에는 좌측의 공백이 사라진 "My Baby Grand???" 문자열이,
strRight 에는 우측의 공백이 사라진 "???MY Baby grand" 문자열이 들어가게 되는 것이지요.

사용자들이 어떤 페이지에서 값을 입력했을 때, 좌우에 공백을 포함하여 입력한 경우
상당히 유용하게 쓰이는 함수가 되겠습니다.

6. REPLACE

문자열 중에서 특정 내용을 다른 내용으로 바꾸려 할 때 REPLACE 함수를 사용합니다.
이 함수의 사용법은 다음과 같습니다.

Dim strBefore, strAfter

strBefore = "I like you.. Do you like me?"
strAfter = REPLACE (strBefore, "like", "love")

이것은 strBefore 이라는 변수에 담긴 "I like you.. Do you like me?" 라는 문자열 중에서
"like" 라는 문자를 찾아서 그것들만 "love" 라는 문자로 바꾸라는 의미가 되겠습니다.
이 함수를 실행하면 strAfter 이라는 변수에는 변경된 문자열인
"I love you.. Do you love me?" 값이 들어가게 되는 것입니다.
(당연한 이야기지만, 해당되는 문자열이 없을 때에는 문자열에 아무런 변화가 없게 됩니다.)

7. SPLIT

마지막으로 알아볼 함수는 SPLIT 함수입니다.
이 함수는 어떤 문자열에서 특정한 문자열 또는 기호를 기준으로 문자열을 분해한 다음,
분해된 문자열들을 배열에 저장하는 함수입니다.

여기서 잠깐!!

자.. 드디어 '배열' 이 나왔습니다.
(배열을 두려워하거나, 잘 안쓰시는 초보 분들이 의외로 많은 것 같더군요..)
지레 겁먹지 마시고, 차근차근하게 한번 이해해 보도록 하겠습니다.

배열은.. '관련있는 변수들의 모임' 이라고 생각하시면 이해가 빠를 것 같습니다.
예를 들어 주소록을 작성하려고 하는데, 사람들의 이름을 저장하기 위하여 이름마다 각각 다른 변수를 선언해서 저장하려 한다면 상당히 불편한 일이 될 것입니다.
예를 들면 다음과 같습니다.

Dim strNameOne, strNameTwo, strNameThree, strNameFour

strNameOne = "김덕영"
strNameTwo = "김태영"
strNameThree = "윤영지"
strNameFour = "장경수"

4명의 이름을 저장하기 위해서 하나하나 각각 변수를 지정하면 위처럼 사용해야 합니다.
이와 같은 경우에 배열을 사용하면 다음과 같이 표현할 수가 있겠습니다.

Dim arrName (3)

arrName (0) = "김덕영"
arrName (1) = "김태영"
arrName (2) = "윤영지"
arrName (3) = "장경수"

배열의 선언 방법은 간단합니다. 일반 변수의 오른쪽에 괄호만 붙여주면 되거든요.
우선 가장 윗 줄에서 arrName (3) 이라는 배열을 선언했습니다.
3이라는 숫자는 '이 배열이 4개의 항목을 가질 것이다' 라는 것을 알려주는 것입니다.

(자, 여기서 질문이 들어올 것 같군요. '4개의 항목인데 3이라니.. 오타지?' 라고 말이지요.
이것은 오타가 아닙니다. 우리는 숫자를 셀 때 1부터 세는 것을 당연스럽게 여기지만,
배열에서는 1이 아닌 0을 기준으로 합니다. 때문에 배열 요소의 개수는 언제나 괄호안의 숫자에 1을 더한 크기가 되는 것이지요.)

이렇게 배열이 선언되었다면, 위의 예에서 보듯이 숫자 (인덱스 번호)를 이용해
각각의 항목에 값을 저장할 수가 있습니다.

그렇다면 역으로.. 배열의 괄호 안에 들어가는 '인덱스 번호' 만 알고 있다면
아주 간단하게 그 '인덱스 번호' 에 해당하는 값을 알아낼 수가 있습니다.

배열에 대한 더 자세한 설명은 다음 기회에 보충하도록 하겠습니다.

SPLIT 의 사용 예를 들어보면 다음과 같습니다.

Dim arrName, strTest

strTest = "김덕영,김태영,윤영지,장경수"
arrName = SPLIT (strTest, ",")

strTest 라는 문자열에서는 쉼표(,) 를 기준으로 사람들의 이름을 구분하고 있습니다.
그래서 SPLIT 함수를 사용할 때 쉼표를 구분자로 사용하여 문자열을 분해했습니다.

이렇게 SPLIT 함수를 사용하고 난 후에 arrName 이라는 변수에는 배열이 저장되게 됩니다.
쉼표(,)를 기준으로 구분했을 때 가장 먼저 구분된 값은 "김덕영" 이 될테고요.
이 값은 배열의 가장 첫번째인 arrName (0) 에 저장되게 됩니다.
(배열에서 맨 처음은 1이 아닌 0이라는 사실을.. 반드시 기억하시기 바랍니다.)
마찬가지로 다음으로 구분된 값인 "김태영" 은 arrName (1) 에 저장되고,
이런 식으로 arrName (2) 에는 "윤영지", arrName (3) 에는 "장경수" 가 저장됩니다.

그렇게 저장된 값들은 '인덱스 번호' 를 이용하여 쉽게 접근할 수가 있습니다.
3번째로 구분된 값을 알고 싶다면 arrName (2) 라고 하면 되는 것이지요.
(위에서 말씀드렸지만 배열은 1이 아닌 0부터 시작하기 때문에 arrName (2) 가 됩니다.)

주의하실 점은, 범위를 초과하는 '인덱스 번호' 로 접근 하면 오류가 발생된다는 점입니다.
위의 예에서는 arrName (3) 까지만 값이 저장되었는데, 만약 arrName (4) 처럼
범위를 넘어선 '인덱스 번호' 로 접근하려 하면 오류가 발생된다는 뜻이지요.


자, 이것으로 '문자열 관련 함수' 에 관한 강좌를 마치도록 하겠습니다.
오늘의 강좌에서는 문자열을 다루는 대표적인 함수들에 대해서 알아보았습니다.
오늘 배운 함수들은 비교적 사용이 간편하고, 이해 하기가 비교적 쉬운 함수들인데요.
하지만 사용 빈도가 상당히 높아.. 앞으로 ASP 를 공부하면서 지겹도록 만나게 될 것 같습니다.

혹시나 지금 당장은 잘 이해가 가지 않는다고 하더라도,
이런 함수들이 있었다는 것 정도는 기억을 해 두시는 것이 좋겠습니다.
그래야 나중에 기능들을 필요로 할 때, 당황하지 않고 찾을 수가 있을테니까요. ^^

'Web Development > ASP' 카테고리의 다른 글

[ASP] 개체모델에 대해서  (3) 2009.06.06
[ASP] 사용자에게 정보 얻기  (0) 2009.06.06
[ASP] 기초튼튼 입문강좌  (0) 2009.06.06
[ASP] ASP로의 첫번째 도전!!  (0) 2009.06.06
[ASP] 기초 입문 강좌  (0) 2009.06.06