Case 문

Case 문

Free Pascal은 case 문을 지원해요.

출처: 문서

본문

여러 case 분기에 나타나는 상수들은 컴파일 시점에 알려져 있어야 해요. 그리고 그 타입은 열거형, 서수 타입(문자 포함), 문자열 타입 중 하나일 수 있어요. case 표현식도 이 타입이어야 하며, 그렇지 않으면 컴파일러 오류가 나요. 또 모든 case 상수는 타입이 같아야 해요.

컴파일러는 case 표현식을 평가해요. case 상수 중 하나의 값이 표현식의 값과 일치하면, 그 상수 뒤에 오는 문이 실행돼요. 그 후 프로그램은 마지막 end 다음에서 계속돼요.

case 상수 중 어느 것도 표현식 값과 일치하지 않으면, else 또는 otherwise 키워드 뒤의 문 목록이 실행돼요. 이 문 목록은 비어 있을 수도 있어요. else 부분이 없고 일치하는 case 상수도 없으면, 프로그램 흐름은 마지막 end 다음으로 계속돼요.

case 문들은 복합 문(Begin..End 블록)일 수 있어요. 다만 else 경우에는 여러 문이 허용돼요(문법 다이어그램에서 볼 수 있듯이). 추가로 Begin..End 블록으로 감쌀 수도 있지만 필수는 아니에요.

한 가지 주의할 점이 있어요. Turbo Pascal과 달리 Free Pascal에서는 중복된 case 레이블이 허용되지 않아요. 그래서 다음 코드는 컴파일할 때 오류가 나요.

Var i : integer;
 ...
 Case i of
  3 : DoSomething;
  1..5 : DoSomethingElse;
 end;

3이 범위 1..5에 (암묵적으로) 포함되기 때문에, 컴파일러는 이 코드를 컴파일할 때 Duplicate case label 오류를 내요. 이는 Delphi 문법과 비슷해요.

다음은 유효한 case 문들이에요.

Case C of
  'a' : WriteLn ('A pressed');
  'b' : WriteLn ('B pressed');
  'c' : WriteLn ('C pressed');
 else
   WriteLn ('unknown letter pressed : ',C);
 end;

또는

Case C of
  'a','e','i','o','u' : WriteLn ('vowel pressed');
  'y' : WriteLn ('This one depends on the language');
 else
   WriteLn ('Consonant pressed');
 end;
Case Number of
  1..10   : WriteLn ('Small number');
  11..100 : WriteLn ('Normal, medium number');
 else
  WriteLn ('HUGE number');
 end;

else 절은 여러 문을 담을 수 있어요.

Case Number of
  1..10   : WriteLn ('Small number');
  11..100 : WriteLn ('Normal, medium number');
 else
   WriteLn ('HUGE number');
   Writeln('How did we get this much ?');
 end;

Free Pascal은 문자열을 case 레이블로 사용하는 것도 허용해요. 이 경우 case 변수도 문자열이어야 해요. 문자열 타입을 쓸 때는 case 변수와 각 레이블이 대소문자 구분 방식으로 비교돼요.

Case lowercase(OS) of
  'windows',
  'dos'   : WriteLn ('Microsoft platform);
  'macos',
  'darwin' : Writeln('Apple platform');
  'linux',
  'freebsd',
  'netbsd' : Writeln('Community platform');
 else
   WriteLn ('Other platform');
 end;

문자열을 쓰는 case 문은 일련의 if then else 문과 동일하며, 최적화는 수행되지 않아요.

하지만 범위는 허용되는데, 다음 코드와 동일해요.

if (value>=beginrange) and (value<=endrange) then
   begin
   end;

더 알아보기