지금까지 알아본 배열 변수는 저장된 리스트의 값을 찾기 위해서는 첨자를 사용하였다. 예를 들어 $array[3]은 배열 변수 @array에 저장된 4번째 값을 나타낸다. 그러나 배열 변수는 한 가지 문제가 있다. 배열의 특정 요소에 어떤 값이 저장되어 있는지 프로그램을 작성하는 사람이 모두 기억하기가 어렵다는 것이다.

 예를 들어 다음의 예를 보자. @student라는 학생 정보를 담고 있는 배열이 있다고 하자.

 

$student[0]= 길동;                  # 이름

$student[1]= 123456;                 # 학번

$student[2]= 서울시;                  # 주소

$student[3]= 345-6789; # 전화

 

위와 같이 0번부터 순서대로 이름, 학번, 주소, 전화를 대입시켰다. 이정도로 간단하다면 별로 문제가 되지 않을 것이다. 그러나 배열 내용이 많을 수록 어떤 번호에 어떤 항목이 들어가는지 기억하기가 어려울 것이다.

배열 변수가 이런 문제점을 가지고 있는 것은 배열의 값을 참조하기 위해 숫자로 된 첨자를 사용하기 때문이다. Perl에서는 이러한 문제를 극복하기 위해 또 다른 종류의 배열을 지원한다. 이것이 조합 배열(Associative array)이다. 조합 배열은 숫자뿐만 아니라 임의의 스칼라 값도 첨자로 사용한다.

일반 배열 변수와 조합 배열 변수를 구분하기 위해서 일반 배열에서 사용하는 @ 문자 대신에 % 문자를 사용하다. 그 뒤에 변수명은 일반 변수명의 규칙과 동일하다.

 

 

%students=(name, 홍길동, id, 123456, address, 서울시, phone, 345-6789);

$name=$students{name};                         # 홍길동

$id=$students{id};                                    # 123456

$address=$students{address};               # 서울시

$phone=$students{phone};                      # 345-6789

 

앞에서 %students라는 조합 배열에 값을 대입할 때는 배열 첨자와 값을 번갈아 가면서 쓰면 된다. 즉 첨자가 name 인 배열의 값은 홍길동이 되고 id인 배열의 값은 123456이 되는 것이다.  Perl5에서는 조합 배열에 대입할 때 아래와 같이 좀더 보기 쉽게 => 를 사용해서 대입할 수 있다.

 

%students=(name=>홍길동, id=>123456, address=>서울시, phone=>345-6789);

 

다음과 같이 배열 내용을 추가할 수 있다.

$students{mobile}=234-5678;

 

그렇다면 배열 요소를 삭제할 수 있을까? 물론 있다. 삭제는 delete라는 함수를 사용한다.

delete($student{mobile});

 

위와 같이 실행하면 배열 %students에서 mobile을 첨자로 하는 요소를 삭제하게 된다.

 

배열의 대입에 관하여 알아보자. 앞에서 @array2=@array와 같은 예를 보았다. 이런 경우는 같은 배열이 만들어지게 된다. 그러나 다음의 예를 살펴보자.

 

@students=(name, 홍길동, id, 123456, address, 서울시);

%students=@students;

 

앞의 문장은 어떻게 처리될까? 결과는 @students의 내용이 %students 조합 배열에 그대로 저장된다. 다른점이라면 첨자와 값의 순서로 조합 배열의 형태로 저장된다는 점이다. $students[0]name $students[1]홍길동, $students[2]id와 같았지만 대입을 하고 나면 $students{name}홍길동, $students{id}123456과 같이 저장되는 것이다. 잘 이해가 되지 않는다면 예제를 작성해서 실행해 보기 바란다. 값을 이것 저것 바꿔서 실행해 보면 이해가 될 것이다.

 

참고로 @students %students는 완전히 다른 배열 변수이다. 이름이 같아도 일반 배열과 조합 배열이기 때문에 다르게 인식된다.

 

다음의 경우는 일반 배열에서와 같이 같은 조합 배열이기 때문에 %students의 내용이 그대로 %students2에 대입된다.

 

%students2 = %students;

 

배열을 삭제할 때는 delete 함수를 사용한다.

 

 

배열에서 모든 요소를 출력하고 싶을 때 일반 배열은 0부터 순서대로 첨자가 부여되기 때문에 배열의 크기를 측정한 다음에 0부터 순서대로 값을 출력하면 되지만 조합 배열에서는 첨자의 값이 임의의 숫자 또는 문자로 이루어지기 때문에 어떤 첨자를 가지고 있는지 알 수가 없다.  이럴 때는 keys라는 함수를 이용한다. keys(%array)라고 하면 첨자의 목록을 배열로 리턴한다.

다음의 예는 조합 배열의 모든 값을 출력하는 예제이다.

 

foreach $key (sort keys(%students))

{

             print $key : $students{$key}\n;

}

 

앞의 예제는 %students의 모든 내용을 첨자와 함께 값을 출력하는 것이다.

조합 배열의 저장 순서는 항상 임의적이다. 저장되는 순서대로 출력된다는 보장이 없다. 그렇기 때문에 앞에서 배웠던 sort 함수를 사용해서 정렬을 해준 것이다.

Posted by OJJ