C Visual Basic Programming - 배열

Cugain 2007.02.21 11:36 조회 수 : 160 추천:84

sitelink1  
sitelink2  
extra_vars5  
extra_vars6  
http://myhome.hanafos.com/~log0/visual_basic.htm

비베강좌(8)<--배열






비베 한달이면 한국불패만큼 한다. -8 . 배열 -

배열은 테이블(table)라는 데이터 구조를 다루는데 사용되는 것입니다.

테이블이 무엇인지 모르는 분도 계실 것입니다.

사실 저도 정확한 테이블의 정의는 알지 못합니다.

단지 어떤것이 테이블인지 관념적으로 머리에 잡혀 있을 뿐이죠. 예를 들어 보는 것으로 테이블의 개념을 설명 드리겠습니다.

31,28,31,30,31,30,31,31,30,31,30,31

이것은 하나의 테이블입니다. 어떤 자료의 테이블일까요?

내 아시는 분으 벌써 아시는 군요. 바로 어떤 달의 날수를 테이블로 작성한 것입니다.

두번째 자료가 28인것은 2월달의 날 수가 28일인 것을 의미하는 것입니다.

이런식으로 어떤 자료를 순서대로 나열 한것이 테이블입니다.

몇월에는 몇일이나 있는지 리턴하는 함수가 필요하다고 생각해 봅시다.

앞강좌에서 배운 if문을 사용해도 만들 수 있습니다.

IF MONTH = 1 THEN DAYS=31
ELSEIF MONTH=2 THEN DAYS=28
ELSEIF MONTH=3 THEN DAYS=31
ELSEIF MONTH=4 THEN DAYS=30
ELSEIF MONTH=5 THEN DAYS=31
ELSEIF MONTH=6 THEN DAYS=30
ELSEIF MONTH=7 THEN DAYS=31
ELSEIF MONTH=8 THEN DAYS=31
ELSEIF MONTH=9 THEN DAYS=30
ELSEIF MONTH=10 THEN DAYS=31
ELSEIF MONTH=11 THEN DAYS=30
ELSEIF MONTH=12 THEN DAYS=31
ENDIF

정말 무식한 방법이라는 생각이 들지 않습니까?

아무튼 이런 식으로도 만들수 있습니다. 하지만 테이블을 사용하면 더욱 쉽게 만들 수 있습니다.

테이블을 만들때 사용되는 것이 배열입니다.

배열을 정의 하는 방법은 변수를 정의 하는 방법과 동일 합니다.

단지 배열의 크기를 첨자의 형태로 나타내 주어야 한다는 점이 다를뿐입니다.

DIM DaysPerMonth(1 to 12) as Integer

이런 식으로 배열을 정의 하면 DaysPerMonth(1)~DaysPerMonth(12)까지 12개의 방이 만들어 집니다.

그리고 이방에 테이블을 집어 넣으면 됩니다.

DaysPerMonth(1)=31
DaysPerMonth(2)=28
DaysPerMonth(3)=31
     .
     .
     .
DaysPerMonth(12)=31

이런식으로 말입니다.

그런데 해놓고 보니 위에 if문으로 작업하는 거랑 별로 차이가 없게 느껴집니다.

'이럴때 사용하라고 만들어 놓은 뭔가가 분명 있을 것도 같은데..음..'

내.. 있습니다. array라는 놈이 있습니다. 이놈을 이용해서는

Dim DaysPerMonth As Variant
DaysPerMonth=Array(31,28,31,30,31,30,31,31,30,31,30,31)

이렇게 하시면 테이블이 완성됩니다.

만약 위 소스코드밑에 B=DaysPerMonth(2)라고 했다면 B의 값은 28이 되는 것입니다.

그럼 이런식으로 테이블이 완성된다면 몇월에 몇일이 있나를 알아내는 소스코드는

Days=DayPerMonth( Month )
날수=달별날수배열( 달수 )

이면 충분하게 되는 것이죠.. 정말 너무 간단해 졌군요.

배열을 사용하면 이렇게 같은일을하는 코드를 훨씬 간단하게 작성할 수 있습니다.

뿐만 아니라 훨씬 이해하기도 쉬워집니다.

자료 테이블에는 월별날수를 나타내는 것 처럼 일차원 배열의 형태가 있는가하면 좀더 복잡한 이차원 형태도 있습니다.

이차원 테이블의 예를 들어 보겠습니다. 무엇을 의미하는지 한번 알아 맞혀 보십시오.

2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,2,0,0,0,0,2,0,0,0,0
0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0
0,0,2,0,0,0,0,0,0,0,0,0,3,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0

음..이번 문제는 맞힌분이 별로 없으실듯 하군요. 저라고 해도 몰랐을것 같습니다.

이것은 여러분들이 다 아시는 인베이더(Invade)라는 오락게임의 화면 정보의 테이블입니다.

맨 아랫줄에 1로 표시되어 있는 것이 플레이어이며 2로 표시되어 있는 것들은 적들을 말합니다.

이런 자료를 다룰경우 실제로 이차원 배열을 이용합니다.

이차원 배열을 선언하는 방법은 일차원 배열을 선언 하는 방법과 흡사합니다.

(적의 위치만 2차원배열임 , 플레이어는일차원 배열임)

10X10의 배열을 선언한예)
Dim A(1 to 10 , 1 to 10) As Integer

입니다. 이때 (5,4)에 위치에 적이 있다면 배열로 나타내는 방법은 A(5,4)=2 라고 해주면 됩니다.

그리고 (4,5)에서 (5,5)로 이동을 한경우라면 A(5,4)=0 : A(5,5)=2 이런식으로 해주면 되기 때문에 무척 편리 하게 사용 됩니다.

다음은 적이 화면의 맨위에서 곧장 아래로 내려오는 소스 코드입니다.

Ground(1,4)=2 '적이 (1,4)의 위치에 있다.

For ypos=1 to 10

Ground(ypos,4)=0 '이전의 적의 위치를 공백으로 만든다.
Ground(ypos+1,4)=2 '현재의 적의 위치에 적을 위치 시킨다.

Next ypos

이경우 Ground(ypos,xpos)=2 이고 Ground(ypos,xpos)=3 이라면

(x,y)지점에 인베이더와 플레이어의 총알이 같이 있는 것이기 때문에 적은 죽게 됩니다.

이것을 프로그램으로 표현하면

If OldGround(ypos,xpos)=2 And Ground(ypos,xpos)=3 Then
Ground(ypos,xpos)=0
End If

여기서 OldGround(x,y)의 배열을 하나더 만들어

플레이어의 총알이 지나위치한 자리에 과거에 어떤 것이 있었는지 기록만 해주면 되는 것입니다.

그래서 현재 총알 위치에 과거에 적이 있었다면 그곳을 공백으로 처리해 주고 폭파장면과 소리를 내게 하면 되는 것이죠.

이런식의 게임을 제작할때도 이차원배열이 사용됩니다.

삼차원 배열을 정의 하는 방법은 이차원 배열과 비슷합니다. 예를 들면 이렇습니다.

Dim A(1 to 10, 1 to 10, 1 to 10) As Integer

음.. 읽고 계신분중에서 어떤 분은 삼차원 배열씩이나 사용해야 할 일이 있을까 하고 의문을 가지시는 분도 계실것입니다.

사실 삼차원 배열은 그렇게 자주 사용되지는 않습니다.

이번 경우도 간단한 예를 들어 설명드리겠습니다.

문서뷰어중 조합형의 글을 완성형으로 변환해주는 것을 많이 사용해 보셨을 것입니다.

어떻게 변환을 할까? 하고 궁금증을 한번쯤 느껴보셨을 줄 압니다.

완성형 같은 경우 이미 만들어져 있는 글자 하나 하나를 코드에 대입한 방식입니다.

이것은 일본어 같은 음절문자를 표현하는 방법을 국어를 표현하는데 따온 것으로 비과학적인 방법입니다.

그러나 이에 비해 조합형은 실제음소 단위로 조합을 해 국어를 표현합니다.

영문자 같은경우 1바이트(8비트)로 글자를 표현 하는데 비해 한글은 2바이트(16비트)로 글자를 표현 합니다.

조합형의 경우 최상위 비트는 한글임을 나타내기 위해서 항상 1로 하며 영어의 경우 0 입니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
| |___________| |______||______|
| ....... 초성 .......... 중성 ...... 종성
|
+-->최상위 비트로써 1이면 한글, 0 이면 영어

그리고 그뒤에 15비트는 5비트씩 각각 초성, 중성, 종성값을 나타냅니다.

이값들을 뽑아내어서는 3차원 테이블에 대응 시키면 테이블에서 해당하는 완성형문자를 읽어들일 수 있습니다.

Char = YansungTable( head , mid , tail )

이방식은 따로 계산과정이 없기때문에 가장 빠른 방법입니다.

이렇게 조합형 문자를 완성형으로 변환할때 삼차원 배열을 사용합니다.  

--------------------------------------------------------------------------------