대부분의 ASP 기본 제공 개체는 컬렉션을 제공합니다. 컬렉션은 문자열, 숫자, 개체, 기타 값을 저장하는 배열과 유사한 데이터 구조입니다. 배열과 달리, 컬렉션은 항목이 검색되고 저장될 때 자동으로 확장 및 축소됩니다. 컬렉션을 수정하면 항목 위치도 달라집니다. 컬렉션의 항목은 고유한 문자열 키, 컬렉션에서의 색인 위치 또는 컬렉션에 있는 모든 항목을 반복 처리하여 액세스할 수 있습니다.
고유한 문자열 키 또는 이름을 참조하여 컬렉션의 특정 항목에 액세스할 수 있습니다. 예를 들어, Contents 컬렉션은 Session 개체에 저장된 모든 변수를 보유합니다. 이 컬렉션은 또한 Server.CreateObject를 호출하여 인스턴스화된 모든 개체를 보유합니다. Session 개체에 다음 사용자 정보를 저장하였다고 가정합니다.
<%
Session.Contents("FirstName") = "철수"
Session.Contents("LastName") = "김"
Session.Contents("Age") = 29
%>
컬렉션에 저장할 때 항목과 관련된 문자열 키를 사용하여 항목에 액세스할 수 있습니다. 예를 들어, 다음 식은 "철수" 문자열을 반환합니다.
<%= Session.Contents("FirstName") %>
또한 항목과 관련된 색인이나 번호를 사용해서 항목에 액세스할 수도 있습니다. 예를 들어, 다음 식은 Session 개체의 둘째 위치에 저장된 정보를 찾아서 "김"을 반환합니다.
<%= Session.Contents(2) %>
ASP 컬렉션은 1부터 시작하여 번호가 매겨집니다. 컬렉션에 항목을 추가하거나 제거하면 항목과 관련된 색인이 변경될 수 있습니다. 항목의 색인은 항상 같은 상태로 있지 않습니다 다음 항목에서 설명하는 대로, 컬렉션을 반복 처리하거나 읽기 전용 컬렉션에서 한 항목을 액세스할 때는 주로 색인을 통한 액세스를 사용합니다.
단축 표시를 사용하여 이름으로 항목을 액세스할 수도 있습니다. ASP는 개체와 관련된 컬렉션을 특정 순서로 검색합니다. 특정 이름의 항목이 개체 컬렉션에 한 번만 나타나는 경우, 성능에 영향을 미치더라도 해당 컬렉션 이름을 삭제할 수 있습니다.
<%= Session("FirstName") %>
Application 또는 Session 개체에 저장된 항목을 액세스할 때는 대개 컬렉션 이름을 삭제하는 것이 안전합니다. 그러나 Request 개체의 경우에는 컬렉션에 대개 중복 이름을 지닌 항목이 포함되므로 컬렉션 이름을 지정하는 것이 더 안전합니다.
컬렉션의 모든 항목 사이를 반복하여 컬렉션에 무엇이 저장되어 있는지를 보거나 항목을 수정할 수 있습니다. 컬렉션 사이를 반복할 때는 반드시 컬렉션 이름을 제공해야 합니다. 예를 들어, VBScript의 For...Each 문을 사용하여 Session 개체에 저장된 항목을 액세스할 수 있습니다.
<% '카운터 변수를 선언합니다. Dim strItem '컬렉션의 각 항목에 대해 해당 값을 표시합니다. For Each strItem In Session.Contents Response.Write Session.Contents(strItem) & "<BR>" Next %>
또한 VBScript의 For...Next 문을 사용하여 컬렉션 사이를 반복할 수 있습니다. 예를 들어, 앞의 예제에서 Session 개체에 저장된 항목 3개를 나열하려면 다음 문을 사용하십시오.
<% '카운터 변수를 선언합니다. Dim intItem '카운터 값이 3이 될 때까지 루프를 반복합니다. For intItem = 1 To 3 Response.Write Session.Contents(intItem) & "<BR>" Next %>
사용자는 일반적으로 컬렉션에 저장된 항목이 몇 개나 되는지 모르기 때문에 ASP는 컬렉션에 Count 속성을 지원하여 컬렉션에 있는 항목 수를 반환합니다. Count 속성을 사용하면 카운터의 마지막 값을 지정할 수 있습니다.
<% '카운터 변수를 선언합니다. Dim lngItem, lngCount lngCount = Session.Contents.Count '카운터가 컬렉션의 항목 수와 같아질 때까지 현재 루프를 반복합니다. For lngItem = 1 To lngCount Response.Write Session.Contents(lngItem) & "<BR>" Next %>
JScript에서 for 문을 사용하면 컬렉션 사이를 반복 실행(루프)할 수 있습니다. JScript의 for 문과 함께 Count 속성을 사용할 때 효과를 더 크게 하려면, Count 값을 지역 변수로 할당하고 변수를 사용하여 카운터의 마지막 값을 설정하십시오. 그러면 스크립트 엔진이 루프를 처리할 때마다 Count 값을 조회할 필요가 없습니다. 다음은 이러한 기술을 사용한 예제입니다.
<%
var intItem, intNumItems;
intNumItems = Session.Contents.Count;
for (intItem = 1; intItem <= intNumItems; intItem++)
{
Response.Write(Session.Contents(intItem) + "<BR>")
}
%>
Microsoft JScript는 ASP 컬렉션을 반복 처리하는 데 사용할 수 있는 Enumerator 개체를 지원합니다. atEnd 메서드는 컬렉션에 다른 항목이 더 있는지 표시합니다. moveNext 메서드는 컬렉션의 다음 항목으로 이동합니다.
<%
Session.Contents("Name") = "Suki White"
Session.Contents("Department") = "Hardware"
.
.
.
//Enumerator 개체를 만듭니다.
var mycollection = new Enumerator(Session.Contents);
//컬렉션을 반복 처리하고 각 항목을 표시합니다.
while (!mycollection.atEnd())
{
var x = myCollection.item();
Response.Write(Session.Contents(x) + "<BR>");
myCollection.moveNext();
}
%>
단일 쿠키에 여러 관련 값이 포함되도록 스크립트를 작성하여 브라우저와 웹 서버 사이에 전달되는 쿠키의 수를 줄일 수 있습니다. 그래서 Request 및 Response 개체의 Cookies 컬렉션은 단일 항목에 여러 값을 보유할 수 있는 것입니다 이러한 하위 항목 또는 하위 키에 개별적으로 액세스할 수 있습니다. Request.Cookies 및 Response.Cookies 컬렉션에 한해서 하위 키를 지원합니다. Request.Cookies는 읽기 연산만 지원하고 Response.Cookies는 쓰기 연산만을 지원합니다.
다음은 일반 쿠키와 하위 키를 가진 쿠키를 만드는 예제입니다.
<%
'브라우저에 쿠키를 보냅니다.
Response.Cookies(DLCCookieNameString).Path = "/"
'브라우저에 하위 키가 있는 쿠키를 보냅니다.
Response.Cookies("Mammals")("Elephant") = "African"
Response.Cookies("Mammals")("Dolphin") = "Bottlenosed"
%>
브라우저에 보낸 HTTP 응답의 쿠키 텍스트는 다음과 같이 나타납니다.
HTTP_COOKIE= Mammals=ELEPHANT=African&DOLPHIN=Bottlenosed; Fruit=Pineapple;
Request.Cookies 컬렉션의 모든 쿠키와 쿠키의 모든 하위 키를 열거할 수 있습니다. 하지만 하위 키가 없는 쿠키에서 하위 키를 반복하면 어떤 항목도 만들 수 없습니다. 이러한 상황을 막으려면 먼저 Cookies 컬렉션의 HasKeys 속성을 사용하여 쿠키에 하위 키가 있는지 확인하십시오. 다음 예제는 이 기술에 대해 설명합니다.
<% '카운터 변수를 선언합니다. Dim Cookie, Subkey '전체 쿠키 컬렉션을 표시합니다. For Each Cookie In Request.Cookies Response.Write Cookie If Request.Cookies(Cookie).HasKeys Then Response.Write "<BR>" '하위 키를 표시합니다. For Each Subkey In Request.Cookies(Cookie) Response.Write " ->" & Subkey & " = " & Request.Cookies(Cookie)(Subkey) & "<BR>" Next Else Response.Write " = " & Request.Cookies(Cookie) & "<BR>" End If Next %>
이 스크립트는 다음 결과를 반환합니다.
Mammals ->ELEPHANT = African ->DOLPHIN = Bottlenosed Fruit = Pineapple
Cookies, Request, Response 및 ClientCertificate 컬렉션은 동일하면서 고유한 문자열 키 이름을 참조할 수 있습니다. 예를 들어, 다음 문은 동일한 키 이름, User를 참조하지만, 각 컬렉션에 대해서 각기 다른 값을 반환합니다.
strUserID = Request.Cookies("User")
strUserName = Request.QueryString("User")
키 이름의 대소문자는 키 값을 지정하는 첫 컬렉션에 의해 설정됩니다. 다음 스크립트를 살펴 보십시오.
<%
'UserID 키를 사용하여 QueryString 컬렉션에서 값을 검색합니다.
strUser = Request.QueryString("UserID")
'브라우저에 쿠키를 보내지만 다른 철자를 가진 UserId 키를 참조합니다.
Response.Cookies("UserId")= "1111-2222"
Response.Cookies("UserId").Expires="December 31, 2000"
%>
쿠키에 키 이름이 UserId로 할당된 것으로 표시되더라도, 실제로는 UserID로 키 이름이 쿠키에 할당되었습니다. QueryString 컬렉션은 이 키의 대소문자를 먼저 정의합니다.
컬렉션 값에 대한 참조는 키 이름의 대소문자와는 무관하므로 응용 프로그램이 키 이름 처리에 대/소문자 구분을 사용하지 않은 한 스크립트에는 영향을 미치지 않습니다.
세션 및 Application 개체는 스칼라 변수나 개체 인스턴스를 보유할 수 있습니다. Contents 컬렉션은 Server.CreateObject를 호출하여 작성된 개체 인스턴스와 스칼라 변수를 보유할 수 있습니다. StaticObjects 컬렉션은 Session 개체 범위 내에서 HTML <OBJECT> 태그를 사용하여 작성된 개체를 보유합니다. 이러한 방식으로 개체를 인스턴스화하는 방법에 대한 자세한 내용은 개체 범위 설정을 참조하십시오.
개체를 포함하는 컬렉션을 반복 처리할 때는 개체의 세션이나 응용 프로그램 상태 정보를 액세스하거나 개체 메서드나 속성을 액세스할 수 있습니다. 예를 들어, 응용 프로그램에서 사용자 계정을 만드는데 여러 개체를 사용하고 또한 각 개체에는 초기화 메서드가 있다고 가정합니다. StaticObjects 컬렉션을 반복하여 개체 속성을 검색할 수 있습니다.
<% For Each Object in Session.StaticObjects Response.Write Object & ": " & Session.StaticObjects(Object) Next %>
이 항목에서 설명한 ASP 컬렉션이 Visual Basic의 Collection 개체와 비슷하지만 몇 가지 차이가 있습니다. ASP 컬렉션은 Count 속성과 Item, Remove, RemoveAll 메서드를 지원하고,Add 메서드는 지원하지 않습니다.