배열(Array)의 정의 및 사용 방법
1. 배열
배열은 같은 성질의 여러 데이터를 처리하기 위해 사용된다.
변수는 한 개의 데이터밖에 담지를 못한다.
하지만 배열은 여러개의 데이터를 담을 수 있다.
예를 들어보자.
Dim Data1 as String
Data1 = "홍길동"
Data1 이라는 변수는 '홍길동'이라는 값을 가지고 있다. 여기에 추가로 "이만수"와 "송영희"라는 데이터를 더 넣어서 이용하고 싶다. 아마 배열이라는게 없다면 이렇게 사용해야할 듯 싶다.
Dim Data1 as String
Dim Data2 as String
Dim Data3 as String
Data1 = "홍길동"
Data2 = "이만수"
Data3 = "송영희"
이렇게 선언과 데이터를 한 개 한 개 나열을 할 수밖에 없어진다. 물론 다른데 값을 넣는다거나 출력을 하기위해서도 다 각각 적어줘야 한다.
Debug.Print Data1
Debug.Print Data2
Debug.Print Data3
만약 이런 사람이름이 100개 라고 상상해 보자. 100개의 선언과 100개의 데이터를 이렇게 코딩창에 쭈욱~ 나열할 것인가? 아니다. 바로 배열이 있기에 나열을 하지 않아도 가능한 것이다.
Dim Data(100) as String
이렇게 한줄의 선언으로 String 형태의 배열 100칸짜리 변수를 만들 수 있다. 그리고 사용은 아래와 같이 한다.
Data(1) = "홍길동"
Data(2) = "이만수"
Data(3) = "송영희"
비주얼 베이직에서는 Data(100) 이라고 배열형태로 선언을 하면 메모리상에 실질적으로 101개의 공간이 생긴다. Data(0) ~ Data(100) 까지 101개의 공간이 생기는데 0~99까지 할당하는 C 언어와 1~100까지 할당하는 베이직 2개의 성질을 합해 놨다고 보면 된다. 이는 잘못된 것이 아니고 1개의 여유공간이 더 생겼으니 사용을 안하던지 다른 용도로 여분을 사용하면 된다. 만약 이게 맘에 안든다면 선언시 Dim Data(1 To 100) as String 이라고 명시해서 선언을 하거나 모듈의 제일 처음 일반부에 Option Base 1 이라고 선언을 해 놓으면 그 모듈에서는 배열 0 이 생성되지 않는다.
이제는 배열에 값을 넣는 것에 대해서 알아보자.
바로 위 예제에서 3명의 이름을 각각 1,2,3 인덱스에 넣어줬지만 이것도 많다면 골치가 아픈 일이다.
그래서 넣을 때 일률적으로 넣을 수 있는 함수가 있는데 그것이 바로 Array 와 Split 함수이다.
Dim Data as Variant
Data = Array("홍길동","이만수","송영희")
이때 주의할점은 Array 값은 Variant 이기 때문에 변수를 배열로 선언하면 안돼고 Variant 로 선언해야 한다는 것이다. 위 처럼 하게 되면 Data 라는 변수는 자동으로 0,1,2 의 3개 인덱스를 가지는 배열 변수처럼 바뀌게 된다. 즉,
Data(0) = "홍길동"
Data(1) = "이만수"
Data(2) = "송영희"
이거와 같은 말이라는 것이다. 여기서도 마찬가지 Option Base 1 이 선언되어있으면 Data의 인덱스는 1,2,3 이 될 것이다. 즉,
Data(1) = "홍길동"
Data(2) = "이만수"
Data(3) = "송영희"
이렇게 된다는 말이다. (Array 함수 참조)
Dim Data as Variant
Data = Split("홍길동,이만수,송영희",",")
이렇게 하면 Array 와 똑같은 결과 값을 얻을 수 있다. (Split 함수 참조)
2. 다차원 배열
위에서 언급한 배열은 단순히 일차원 배열에 대해서 나열한 것이다.
하지만 가끔 다차원 배열이 필요할 때도 있다. 예를 들어 각 학생의 취미를 가지는 배열을 만든다고 생각해 보자.
"홍길동 - 독서"
"이만수 - 낚시"
"송영희 - 쇼핑"
이런 배열을 만들고자 할 때 위 한사람의 정보를 한 변수에 몽땅 넣으면
Data(0) = "홍길동 - 독서"
이게 사람이름인지 취미인지 어디서부터 어디까지가 사람이름인지 구분하기가 쉽지는 않다. 구분하기 위해서 뭔가를 해줘야하고 사람이름이나 취미 이름의 길이가 틀리기 때문에 나눠줄래도 여간 복잡한게 아니다. 그래서 다차원 배열이 필요한 것이다.
Dim Data(1 To 100,1 To 2) as String
이렇게 배열을 선언하게 되면
Data(1,1) = "홍길동"
Data(1,2) = "독서"
Data(2,1) = "이만수"
Data(2,2) = "낚시"
Data(3,1) = "송영희"
Data(3,2) = "쇼핑"
이런식으로 이름과 취미를 각각 넣어서 사용할 수 있다. 배열 괄호 안쪽 인덱스중 앞쪽 번호는 배열 번호를 구분하고, 뒤쪽 인덱스는 1은 사람이름, 2는 취미를 구분하는 다차원 배열을 만들 수 있다. 다시 한번 말하면 1번 배열은 홍길동에 관한 배열인데 1번에는 홍길동이라는 이름을, 2번에는 취미인 독서를 넣은 것이다. 이런식으로 하면 이제 어떤 정보든지 변수에 다 담을 준비가 되는 것이다.
다차원 배열은 위에서 말한 것과 같이 꼭 2차원 배열만 되는 것은 아니다.
<배열이름>(인덱스1,인덱스2,인덱스3,......)
예를 들어,
Dim Data(100,5,2,3) as String
이런식으로 자신이 응용에 필요한 만큼 만들어서 쓸 수 있다. 또한 인덱스는 0 또는 1부터 꼭 시작해야 되는 것은 아니다.
Dim Data(-3 To 4, 2 To 8) as String
이라고 선언하면 Data(-3, 2)부터 Data(2, 8)까지 이용할 수 있다.
이런식으로 배열을 적절히 선언해서 데이터 담을 수 있는 변수를 최대한 잘 활용하면 프로그램도 간결해지고 멋있어 질 수 있다.
3. 배열의 재정의
가끔 배열을 정의할라고 보면 몇 개를 정의해야 할지 모를 때가 있다.
무슨 말이냐면 일단 학생 정보를 담을 배열이 필요한데 학생이 몇 명이 될지 모를 수 있다.
예를 들어, 양호실에서 학교 학생들에게 주사를 놓는데 주사맞은 학생의 명단을 작성해야 하는데 얼마큼을 만들어야 할지 모를 때가 있다.
그럴 때는 일단 명단에 사용할 변수를 선언을 먼저 한다음 학생수를 파악해서 선언했던 변수를 재정의 하는 방법이 있다.
Dim Data() as String
...
ReDim Data(Clong(Text1.Text))
...
위의 경우는 Data라는 문자열형 변수를 프로그램이 시작된 후 내가 원하는 만큼만 배열을 생성하고 싶은데 Dim 문에는 Text1.Text 처럼 객체의 어떤 속성이나 변수가 들어갈 수가 없다. 그래서 일단 빈 인덱스, 즉 Data() 라고 선언을 한후 프로그램 중간에서 ReDim 이라는 명령으로 Data라는 배열을 Text1.Text에 적힌 숫자만큼만 만들 수 있다. 이렇게 되면 메모리도 효율적으로 관리할 수 있다.
Option Explicit
Option Base 1
Private Sub Command1_Click()
Dim data() As String
ReDim data(CLng(Text1.Text))
Debug.Print UBound(data)
End Sub
이렇게 하면 직접 실행창에 Text1 박스에 적은 숫자와 같은 숫자가 생성이 된다. 즉, 적은 만큼 배열이 생겼다는 뜻이다.
(물론 숫자가 아닌 문자를 넣으면 오류가 발생한다. 괜히 시험하지 마시길... ㅡ,.ㅡㅋ )
여기까지 해서 배열의 생성 방법 및 사용방법을 적당히 배웠다.
이걸 응용해서 실제 프로젝트를 작성할 때 적절히 잘 사용했으면 하는 저자의 바램이다.
< 틀린말이나 오타가 있으면 덧글달아주시고 욕은 하지 말아주세요. 킁~>
< 무단으로 복사해가면 나빠요~ >
첫댓글 감사합니다. 즐거운 강의
배열에서 이해가 안되는 부분이 있었는데 여기보고나서 확실히 알고 갑니다. 고맙습니다.
Dim Data as Variant Data = Split("홍길동,이만수,송영희",",") 직접실행창에 출력은 안되나요?
덕분에 Redim에 대하여 다시 한번 공부했네요. 감사.
감사