디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Ada 프로그래밍: 열거형과 선택 구조, 그리고 예외 처리

나르시갤로그로 이동합니다. 2025.10.14 23:45:06
조회 68 추천 0 댓글 0

Ada 프로그래밍: 열거형과 선택 구조, 그리고 예외 처리

이번 장에서는 코드의 가독성과 안정성을 크게 향상시키는 에이다의 핵심 기능들을 학습합니다. 데이터를 명확한 이름의 집합으로 표현하는 열거형(Enumeration), 모든 경우를 빠짐없이 검사하도록 강제하는 case 문(case statement), 그리고 프로그램 실행 중 발생할 수 있는 오류를 체계적으로 다루는 예외(Exception) 처리 메커니즘을 다룰 것입니다.


1. 열거형 (Enumeration Types)

프로그래밍에서는 종종 정수나 문자열 상수 대신, 명확하게 정의된 이름의 집합으로 데이터를 표현하는 것이 더 안전하고 이해하기 쉽습니다. 예를 들어, 신호등의 색상을 0, 1, 2와 같은 숫자로 다루기보다는 '빨강', '노랑', '초록'이라는 이름으로 직접 다루는 것이 실수를 줄일 수 있습니다.

에이다의 열거형은 이처럼 서로 연관된 명명된 값들의 집합을 새로운 자료형으로 정의하는 기능입니다.

기본 문법:

type 열거형_이름 is (값1, 값2, 값3, ...);

예시:

다음은 신호등의 색상을 나타내는 Traffic_Light_Color라는 열거형을 정의하는 코드입니다.

type Traffic_Light_Color is (Red, Yellow, Green);

이렇게 정의된 열거형은 그 자체로 하나의 독립적인 자료형이 됩니다. 따라서 Traffic_Light_Color자료형의 변수는 오직 Red, Yellow, Green 세 가지 값만 가질 수 있습니다. 이는 정수형(Integer)이나 문자열(String)과 같은 다른 자료형과 호환되지 않으며, 컴파일러는 이 규칙을 엄격하게 검사하여 형식 안전성(type safety)을 보장합니다.

-- 열거형 변수 선언 및 초기화
Current_Color : Traffic_Light_Color := Red; 

-- 값 변경
Current_Color := Green;

-- 잘못된 대입 (컴파일 오류 발생)
-- Current_Color := 1; 
-- Current_Color := "Red";

이처럼 열거형을 사용하면 허용된 값의 범위가 명확해지고 코드의 의도가 분명해져 유지보수가 용이해집니다.


2. Case 문과 완전성 검사 (The Case Statement and Completeness Checking)

case 문은 특정 변수의 값이 무엇인지에 따라 다른 코드를 실행하도록 하는 선택 구조입니다. 이는 특히 열거형 변수를 다룰 때 매우 유용하며, 에이다는 case 문 사용 시 강력한 안전장치를 제공합니다.

핵심 규칙: 완전성 검사 (Exhaustiveness Check)

에이다 컴파일러는 case 문이 해당 자료형이 가질 수 있는 모든 가능한 값을 반드시 다루도록 강제합니다. 만약 단 하나의 경우라도 누락되면, 이는 경고가 아닌 **컴파일 시점 오류(compile-time error)**를 발생시킵니다.

예시:

앞서 정의한 Traffic_Light_Color 열거형을 처리하는 case 문을 살펴보겠습니다.

procedure Handle_Light (Color : in Traffic_Light_Color) is
begin
   case Color is
      when Red =>
         Put_Line ("정지 신호입니다.");
      when Yellow =>
         Put_Line ("주의 신호입니다.");
      when Green =>
         Put_Line ("진행 신호입니다.");
   end case;
end Handle_Light;

위 코드는 Red, Yellow, Green 세 가지 경우를 모두 처리하므로 정상적으로 컴파일됩니다. 하지만 만약 개발자가 실수로 Green 경우를 누락했다면 어떻게 될까요?

-- 잘못된 예시: Green 경우 누락
procedure Handle_Light (Color : in Traffic_Light_Color) is
begin
   case Color is
      when Red =>
         Put_Line ("정지 신호입니다.");
      when Yellow =>
         Put_Line ("주의 신호입니다.");
      -- when Green => ... 이 부분이 누락됨
   end case;
end Handle_Light;
-- 컴파일 시 오류 발생: "choices for case statement must be static and exhaustive"
-- "missing choice for 'Green' in case statement"

컴파일러는 Green에 대한 처리가 없음을 지적하며 컴파일을 중단시킵니다. 이러한 강제적인 완전성 검사는 프로그램이 예기치 않은 상태에 빠지는 것을 원천적으로 방지하는 매우 중요한 안전 기능입니다.

when others 절:

모든 경우를 명시적으로 나열하기 어렵거나, 특정 몇 가지 경우를 제외한 나머지를 동일하게 처리하고 싶을 때는 when others 절을 사용할 수 있습니다.

   case Color is
      when Red =>
         Put_Line ("정지 신호입니다.");
      when others => -- Yellow와 Green의 경우
         Put_Line ("정지 신호가 아닙니다.");
   end case;

when others를 사용하면 컴파일러의 완전성 검사 조건을 만족시킬 수 있습니다.


3. 에이다의 오류 처리: 예외 (Error Handling in Ada: Exceptions)

프로그램 실행 중에는 0으로 나누기, 메모리 부족, 파일 접근 실패 등 다양한 오류 상황이 발생할 수 있습니다. 에이다는 이러한 실행 시점(run-time) 오류를 처리하기 위해 예외(Exception) 메커니즘을 사용합니다.

이는 오류가 발생할 수 있는 함수의 반환 값으로 오류 코드를 전달하는 방식과 달리, 정상적인 실행 흐름과 오류 처리 흐름을 명확하게 분리하는 구조입니다.

기본 구조: begin-exception-end 블록을 사용하여 예외를 처리합니다. begin exception 사이에는 정상적인 로직을, exception end 사이에는 예외가 발생했을 때 실행할 코드를 작성합니다.

begin
   -- 정상적인 실행 코드
   -- 이 블록에서 예외가 발생하면 실행이 즉시 중단되고
   -- 아래 exception 핸들러로 제어가 넘어감
   ...
exception
   when 예외_이름_1 =>
      -- 예외_이름_1이 발생했을 때 처리할 코드
   when 예외_이름_2 | 예외_이름_3 =>
      -- 예외_이름_2 또는 예외_이름_3이 발생했을 때 처리할 코드
   when others =>
      -- 위에서 명시되지 않은 다른 모든 예외를 처리할 코드
end;

예시: 0으로 나누기 오류 처리

0으로 나누기를 시도하면 에이다 런타임 시스템은 미리 정의된 Constraint_Error라는 예외를 발생(raise)시킵니다. 호출하는 쪽에서는 이 예외를 잡아(catch) 적절히 대응할 수 있습니다.

function Safe_Divide (Numerator : Integer; Denominator : Integer) return Float is
begin
   return Float (Numerator) / Float (Denominator);
exception
   when Constraint_Error =>
      Put_Line ("오류: 0으로 나눌 수 없습니다.");
      return 0.0; -- 오류 발생 시 기본값 반환
end Safe_Divide;

Safe_Divide 함수를 호출하는 코드는 Constraint_Error가 발생하더라도 프로그램이 중단되지 않고, 함수가 반환하는 기본값 0.0으로 실행을 이어나갈 수 있습니다.

이처럼 에이다의 예외 처리는 오류 발생 가능성이 있는 코드의 실행과 그 오류를 수습하는 코드를 분리하여 프로그램의 구조를 더 명확하고 견고하게 만듭니다. 참고로 러스트(Rust) 언어는 예외(Exception) 처리 구문이 없으며, Result Option 같은 열거형을 반환하여 오류를 처리하는 방식을 사용합니다. 이는 에이다의 예외 처리와는 다른 철학을 가진 접근 방식입니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 영포티룩도 멋지게 소화할 것 같은 40대 스타는? 운영자 25/10/27 - -
AD 할로윈 슈퍼위크~!! 운영자 25/10/23 - -
2896624 ㅆㅇㅆ님 제말을 믿어주세요 에어로홍갤로그로 이동합니다. 10.15 72 0
2896623 미야우 묻습니다 에어로홍갤로그로 이동합니다. 10.15 60 0
2896622 이번에 건강검진 피검사 받아보니까 과로로 간이랑 [2] ㅆㅇㅆ(113.192) 10.15 80 0
2896621 윤석열 석방 [3] 에어로홍갤로그로 이동합니다. 10.15 84 0
2896619 이런 문장 되게 좋지 않니? ㅇㅇ갤로그로 이동합니다. 10.15 58 0
2896618 나다 ㅋ 나 미야우 왔다 [9] Meow갤로그로 이동합니다. 10.15 97 0
2896611 항상 배움이 부족한거 같다. 그런 생각이 들어 [8] ㅆㅇㅆ(113.192) 10.15 93 0
2896610 3840 * 2160 세상이 유일한 락입니다 나르시갤로그로 이동합니다. 10.15 55 0
2896607 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 10.15 46 0
2896603 [대한민국] 세상이 혼세할 때 나타나는 현상 - 이 조 단위 돈 싱가포르 프갤러(121.172) 10.15 60 0
2896598 이런 소켓 연결 실패! 프갤러(121.172) 10.15 108 0
2896597 토지거래허가구역 지정 이거는 꼭 나쁜가? [2] chironpractor갤로그로 이동합니다. 10.15 199 0
2896596 1920x1080 모니터에서 영상 보는 게 삶의 낙임 [1] ㅇㅇ갤로그로 이동합니다. 10.15 74 0
2896594 내가 할 수 있을까? 솔직히 공기업 납품은 좀 자신이 없음 [2] ㅆㅇㅆ(113.192) 10.15 103 0
2896593 일단 연구실 납품 한건이랑 자바 스프링부트 포폴 생각해봐야할듯 [2] ㅆㅇㅆ(113.192) 10.15 106 0
2896591 나는조현병이야 나는내향적이야 나는조현병이냐 너는외향병자냐 [2] 손발이시립디다갤로그로 이동합니다. 10.15 86 0
2896588 아니 ㅅㅂ 내 연봉의 2배를 받고 있으면 [3] ㅇㅇ(211.234) 10.15 149 0
2896587 오늘 뭔가 일이 한번에 몰려오네 8만원 3만원 짜리 5만원짜리 [2] ㅆㅇㅆ(113.192) 10.15 111 0
2896586 카카오페이 깔아도 카카오톡 안 깔아놓으니 못 쓰네 [2] 프갤러(182.227) 10.15 103 0
2896585 인류의 거짓된역사를 종말시킬거다 역사는 신세대인 내가 만든다 [1] 타이밍뒷.통수한방(1.213) 10.15 88 0
2896581 오늘 또 병원가야 되네 ㅎㅎ 나르시갤로그로 이동합니다. 10.15 68 0
2896580 점심 [3] 발명도둑잡기(39.7) 10.15 91 0
2896575 aws 왜씀? 프갤러(49.165) 10.15 85 0
2896572 전공자인데 왜 취업이 안되지? [2] ㅇㅇ(175.116) 10.15 216 0
2896571 외교부 장관 윤석열 임명했다는군요 나르시갤로그로 이동합니다. 10.15 94 0
2896568 그사기가아님 프갤러(211.119) 10.15 81 0
2896564 반디집 있는 남자 프로페셔널 넥도리아2024(220.74) 10.15 94 0
2896562 지금 놀고 있는 애들은 배달이나 노가다 용접해라 [3] 프갤러(61.253) 10.15 123 0
2896561 드디어 PS3111 SSD 도시바 복구 키오시아 넥도리아2024(220.74) 10.15 65 0
2896560 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 10.15 49 0
2896559 미개한 리액트 버리고 러스트 leptos 쓰십시오 [3] 프갤러(218.154) 10.15 119 0
2896558 마치 나라를 위해 윤석열을 뽑아놓고는 [2] 헬마스터갤로그로 이동합니다. 10.15 113 0
2896557 유지보수를 위해 철학을 도입해놓고는 헬마스터갤로그로 이동합니다. 10.15 74 0
2896556 리액트 리덕스 문법은 진짜 미개하지않냐? [5] 헬마스터갤로그로 이동합니다. 10.15 120 1
2896555 요새 일많이 없음? [6] 프갤러(180.70) 10.15 128 0
2896553 맞네 캄보디아로 시끄러운거 보니 이거 생각나네 ㅇㅇ갤로그로 이동합니다. 10.15 102 0
2896552 난 직장이랑 집이 가까워서 [3] 루도그담당(211.184) 10.15 113 0
2896551 난 소비쿠폰 의미 없다고 생각해..ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 10.15 92 0
2896550 요즘 국비 신입 연봉 얼마정도 줘야됨? [1] 프갤러(118.235) 10.15 208 0
2896549 빨간 대가리..ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 10.15 82 0
2896548 지하철 탈때마다 창년소리 뭐냐? [2] 헬마스터갤로그로 이동합니다. 10.15 125 0
2896547 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.15 57 0
2896545 하루 한 번 헤르미온느 찬양 (마지막) 헤르 미온느갤로그로 이동합니다. 10.15 57 0
2896540 자동 로그인이 되는 남자 모니터 세션에 따라 드라이버 쇼트가 키 열거형 넥도리아2024(220.74) 10.15 60 0
2896539 생각해보니 앱히키.. 캄보디아 간거 아녀??? [2] 프갤러(39.7) 10.15 125 0
2896535 그냥 써야되지 근데 컵에다가 케찹 스파게티 끓여서 넣으니 맛있네... 넥도리아(220.74) 10.15 95 0
2896528 먼가 플머의 행동습성중에 수집본능이 있는거같지 않음? [1] 공기역학갤로그로 이동합니다. 10.15 76 0
2896519 외노자의 수제번역, あたらよ - 10月は無口な君を忘れる。 프로외노자갤로그로 이동합니다. 10.15 69 0
2896518 외노자의 수제번역, やなぎなぎ - 約束をしよう 프로외노자갤로그로 이동합니다. 10.15 67 0
2896516 외노자의 수제번역, 貴方の夜が明けるまで [1] 프로외노자갤로그로 이동합니다. 10.15 88 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2