열거 배열과 집합 비교

서수 타입을 배열 첨자로 사용하기

고정 길이 배열 Constant-length arrays

열거형, 사용자 정의 구간 서수 타입 모두 배열 첨자로 사용할 수 있어 배열 인덱스 범위를 유연하게 설정할 수 있습니다.

열거형을 배열 첨자로 쓰는 예시

type
  // 1. 일반 숫자 구간 첨자 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 1부터 시작하는 첨자 범위 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. 사용자 정의 서수 타입을 배열 첨자로 활용
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. 열거형을 직접 배열 첨자로 사용 (가장 자주 쓰임)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;
var
  AnimalNameArr: TAnimalNames;
begin
  AnimalNameArr[akDuck] := '오리';
  AnimalNameArr[akCat] := '고양이';
  AnimalNameArr[akDog] := '강아지';
end;
Code language: PHP (php)

IntToStr는 표준 변환 함수로 SysUtils 유닛에 정의되어 있습니다. 역할: 정수 숫자를 문자열로 변환.

전체 예제 코드

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

uses
  SysUtils; // IntToStr 사용을 위해 필수로 포함

type
  // 1. 일반 숫자 구간 첨자 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 1부터 시작하는 첨자 범위 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. 사용자 정의 서수 타입을 배열 첨자로 활용
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. 열거형을 직접 배열 첨자로 사용 (가장 자주 쓰임)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;

var

  // 인덱스 0~9 배열 변수 선언
  Arr0To9: TArrayOfTenStrings;

  // 인덱스 1~10 배열 변수 선언
  Arr1To10: TArrayOfTenStrings1Based;

  // 사용자 정의 서수 인덱스 배열 변수
  ArrCustomIdx: TAlsoArrayOfTenStrings;

  // TMyNumber 타입 반복 변수 I
  I: TMyNumber;

  // 열거형 인덱스 배열 변수
  AnimalNameArr: TAnimalNames;

begin

  // 1. 0~9 인덱스 배열 사용법
  Arr0To9[0] := '0번 요소'; // 값 할당
  Arr0To9[5] := '중간 요소';
  Writeln(Arr0To9[0]); // 값 출력

  // 2. 1 시작 인덱스 배열, 0으로 접근 불가
  Arr1To10[1] := '첫 항목';
  Arr1To10[10] := '마지막 항목';
  Writeln(Arr1To10[10]);

  // 3. 사용자 정의 서수 TMyNumber를 첨자로 반복 순회
  for I := Low(TMyNumber) to High(TMyNumber) do
  begin
    ArrCustomIdx[I] := '순서' + IntToStr(I);
  end;

  Writeln(ArrCustomIdx[3]);

  // 열거 값을 첨자로 열거 배열에 값 할당 예시
  AnimalNameArr[akDuck] := '오리';
  AnimalNameArr[akCat] := '고양이';
  AnimalNameArr[akDog] := '강아지';
end.Code language: PHP (php)

컴파일 시 경고 메시지 2개 발생

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(55,35) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString"
mydemo.dpr(55,33) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
Linking mydemo.exe
63 lines compiled, 0.2 sec, 68464 bytes code, 4276 bytes data
2 warning(s) issued

D:\fpcdemo>mydemo
0번 요소
마지막 항목
순서3Code language: CSS (css)

집합 타입

Sets, 내부 구현은 비트 필드 bit-fields

집합은 열거형 또는 서수 타입을 기반으로 정의하며 여러 열거 값을 한번에 저장할 수 있고 집합 연산, 요소 추가/삭제를 지원합니다.

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

type
  TAnimalKind = (akDuck, akCat, akDog);
  // 열거형 기반 집합 타입 정의
  TAnimals = set of TAnimalKind;
var
  A: TAnimals;
begin
  A := [];                     // 빈 집합 리터럴
  A := [akDuck, akCat];        // 여러 요소 직접 할당
  A := A + [akDog];            // 집합 합집합 (요소 추가)
  A := A * [akCat, akDog];     // 집합 교집합 (양쪽 공통 요소만 유지)

  Include(A, akDuck);          // 내장 프로시저: 단일 요소 추가
  Exclude(A, akDuck);          // 내장 프로시저: 단일 요소 삭제
end.
Code language: PHP (php)

집합 자주 사용하는 연산 설명

  1. []:빈 집합 리터럴
  2. +:합집합, 두 그룹 요소 병합
  3. *:교집합, 양쪽에 공통으로 존재하는 요소 추출
  4. Include(집합, 요소):안전하게 요소 추가
  5. Exclude(집합, 요소):안전하게 요소 삭제

Previous:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다