디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 107 추천 0 댓글 2

5.3 goto 

goto 문은 프로그램의 제어 흐름을 지정된 레이블(label)로 즉시 이동시키는 분기문입니다. 이러한 직접적인 제어 흐름 변경은 코드의 논리 구조를 순차적으로 파악하기 어렵게 만들어 유지보수성을 저해하는 요인이 됩니다. 이러한 이유로, 비록 Ada를 포함한 많은 언어에 이 기능이 존재하지만 현대적인 구조적 프로그래밍에서는 사용을 지양합니다.

5.3.1 구문

goto 문은 레이블 선언과 goto 호출, 두 부분으로 구성됩니다.

  1. 레이블 선언: <<레이블_이름>>과 같이 이중 꺾쇠괄호로 선언합니다.
  2. goto 호출: goto 레이블_이름; 형태로 사용합니다.
-- 구문 예시 (좋은 사용 사례는 아님)
<<my_label>>
-- ... 코드 ...
goto my_label;

5.3.2 제한적인 사용 사례: 깊은 중첩 루프 탈출

goto가 논의되는 매우 드문 상황 중 하나는, 다중으로 중첩된 루프를 한 번에 탈출해야 할 때입니다. exit 문은 하나의 루프만 탈출할 수 있기 때문에, 여러 루프를 탈출하려면 복잡한 플래그 변수를 사용해야 할 수 있습니다. 이 경우 goto가 코드를 더 명확하게 만들 수도 있습니다.

다음은 2차원 배열에서 특정 값을 찾으면 모든 루프를 즉시 중단하는 예제입니다.

with Ada.Text_IO;

procedure goto_example is
  matrix : array (1..10, 1..10) of Integer;
  value_to_find : constant Integer := 7;
begin
  -- 예제 행렬 초기화 (여기서는 생략)
  matrix(3, 8) := value_to_find;

  for i in matrix'range (1) loop
    for j in matrix'range (2) loop
      if matrix (i, j) = value_to_find then
        Ada.Text_IO.put_line ("Found " & Integer'image (value_to_find) &
                              " at (" & Integer'image (i) & "," &
                              Integer'image (j) & ")");
        goto found_it; -- 중첩된 루프를 한 번에 탈출
      end if;
    end loop;
  end loop;

  Ada.Text_IO.put_line ("Value not found."); -- 이 줄은 값을 찾으면 실행되지 않음

  <<found_it>>

  Ada.Text_IO.put_line ("Search complete.");

end goto_example;

실행 결과:

Found 7 at ( 3, 8)
Search complete.

5.3.3 goto의 구조적 대안

goto 사용이 필요해 보이는 대부분의 상황에는 더 나은 구조적 대안이 존재합니다.

  • 이름 있는 루프와 exit 문 (가장 권장되는 대안)

    중첩 루프를 한 번에 탈출하기 위해 goto를 사용하는 것은 Ada의 이름 있는 루프 기능으로 완벽하게 대체할 수 있습니다. 각 루프에 이름을 부여하고 exit 문에 탈출하려는 루프의 이름을 명시하면 됩니다. 이는 goto 없이 명확하고 구조적인 방식으로 동일한 목적을 달성합니다.

    with Ada.Text_IO;
    
    procedure named_loop_example is
      matrix : array (1 .. 10, 1 .. 10) of Integer;
      value_to_find : constant Integer := 7;
    begin
      -- ... 행렬 초기화 ...
      matrix(3, 8) := value_to_find;
    
    outer_loop: -- (1) 루프에 이름 부여
      for i in matrix'range (1) loop
        for j in matrix'range (2) loop
          if matrix (i, j) = value_to_find then
            Ada.Text_IO.put_line ("Found value at (" & i'image & ", " & j'image & ")");
            exit outer_loop; -- (2) 지정된 이름의 루프를 즉시 탈출
          end if;
        end loop;
      end loop outer_loop;
    
      Ada.Text_IO.put_line ("Search complete.");
    end named_loop_example;
    

    이 방식은 goto와 레이블이 코드의 다른 부분에 흩어져 있는 것과 달리, 루프의 시작과 끝이 명확하게 한 쌍으로 존재하므로 가독성과 유지보수성이 훨씬 뛰어납니다.

  • 프로시저/함수로 분리

    중첩 루프 로직을 별도의 서브프로그램으로 추출하고, 값을 찾았을 때 return 문을 사용해 즉시 종료할 수 있습니다.

  • 상태 플래그 사용

    Boolean 플래그 변수를 두어 바깥쪽 루프의 탈출 조건을 제어합니다.

5.3.4 goto의 적법성 규칙과 제약 (legality rules and constraints)

goto 문은 아무 곳으로나 제어를 이전할 수 없으며, 프로그램의 구조적 무결성을 해치지 않기 위한 엄격한 규칙을 따릅니다. Ada 레퍼런스 매뉴얼에 명시된 핵심 규칙은 다음과 같습니다.

핵심 규칙: 목표 문장(레이블)을 감싸는 가장 안쪽의 실행 코드 블록(sequence_of_statements)은, goto 문 또한 반드시 감싸야 합니다.(The innermost sequence_of_statements that encloses the target statement shall also enclose the goto_statement.)

이 규칙은 제어 이전이 항상 같은 레벨 또는 안쪽에서 바깥쪽으로만 가능함을 의미합니다. 이 규칙에 따라 다음과 같은 주요 제약 사항이 파생됩니다.

허용되지 않는 주요 점프 유형

1. 바깥쪽에서 안쪽 스코프로의 점프

루프나 블록문 외부에서 내부로 제어를 이전하는 것은 금지됩니다.

-- 잘못된 예: 루프 외부에서 내부로 점프
procedure invalid_jump_in is
begin
  goto inner_label; -- 컴파일 오류!

  for i in 1 .. 10 loop
    <<inner_label>>
    Ada.Text_IO.put_line ("This is unreachable.");
  end loop;
end invalid_jump_in;

2. 복합문의 다른 대안(alternative)으로의 점프

if-elsif-else, case, select 문의 한 갈래(alternative)에서 다른 갈래로 직접 점프하는 것은 금지됩니다.

-- 잘못된 예: if-elsif 대안 간의 점프
procedure invalid_jump_between_alts (a : Integer) is
begin
  if a = 1 then
    goto label_2; -- 컴파일 오류!
  elsif a = 2 then
    <<label_2>>
    null;
  end if;
end invalid_jump_between_alts;

3. 예외 핸들러에서 다시 원래 코드로의 점프

예외가 발생하여 예외 핸들러로 제어가 이전된 후, 다시 원래의 실행 코드로 돌아가는 것은 금지됩니다.

-- 잘못된 예: 예외 핸들러에서 정상 흐름으로 복귀
procedure invalid_jump_from_handler is
begin
  <<retry_point>>
  -- ... 위험한 연산 수행 ...
  raise Program_Error;

exception
  when Program_Error =>
    goto retry_point; -- 컴파일 오류!
end invalid_jump_from_handler;

이러한 규칙들은 goto로 인해 발생할 수 있는 잠재적인 혼란과 논리적 오류를 언어 차원에서 체계적으로 방지합니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 시구, 시축 했다가 이미지가 더 나빠진 스타는? 운영자 25/08/11 - -
AD 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
2877813 정확히 말해서 Hook은 인터셉트 매커니즘이고 [3] ㅆㅇㅆ(124.216) 08.04 96 2
2877812 그냥 비동기 원리를 모르는거지 그냥 쓰는걸수도 있잖아 [6] ㅆㅇㅆ(124.216) 08.04 109 0
2877809 근데 밑에 비동기 모른다는거 충격이네 [3] 루도그담당(118.235) 08.04 93 0
2877805 내가 생각할때 웹앱개발자들은 걍 자동으로 다해주는거임 [1] 네오커헠(1.237) 08.04 144 0
2877804 강물 ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 08.04 70 0
2877803 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08.04 52 0
2877802 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08.04 61 0
2877801 ETW 패치함 루도그담당(211.184) 08.04 44 0
2877798 ... 배구공(119.202) 08.04 58 0
2877796 흠, 웹쪽은 async에 통신을 일임해도 안뻗나보네 [1] 네오커헠(211.234) 08.04 138 0
2877794 히히히 [1] 어린이노무현갤로그로 이동합니다. 08.04 88 0
2877791 아침부터 서비스 장애로 7시 출근함 [2] 아스카영원히사랑해갤로그로 이동합니다. 08.04 83 0
2877790 gradle은 진짜 가젤펀치 마렵네 [2] 헬마스터갤로그로 이동합니다. 08.04 72 0
2877789 동양인 70억 민족성 ㄹㅇ 대단하지않냐?? [1] 뒷통수한방(1.213) 08.04 62 0
2877788 내가 8년전부터 지금까지 계속 하던말들이 무시당하는이유 타이밍뒷통수한방(1.213) 08.04 48 0
2877786 빨리 이 칼날 위를 걷는 삶이 아닌 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 08.04 73 0
2877785 C++ 쓰는데 [7] 루도그담당(118.235) 08.04 109 0
2877784 오늘도 피곤하구나 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 08.04 72 0
2877783 민생쿠폰때문에 콜센터 전화했는데 뭔 통화료를 부과하냐??? 뒷통수한방(1.213) 08.04 53 0
2877780 씨발 히키새끼야 너 믿고 프로그래밍 공부했다가 시간 날렸다 [9] 프갤러(222.108) 08.04 124 1
2877775 유니티 인디게임 대부분 유저 데이터 암호화해놓냐 [11] 프갤러(118.223) 08.04 125 0
2877774 딱신(211.234) 08.04 54 0
2877773 오늘을 살자 내일도 살리자 넥도리나(220.74) 08.04 67 0
2877769 개좆되는 게임성만 있으면 [1] 뉴진파갤로그로 이동합니다. 08.04 91 0
2877767 씨발 다시는 히키같은 새끼가 나오면 안 됨 프갤러(222.108) 08.04 86 0
2877763 히키 씨발년 진짜 증오스럽다 개새 [3] 프갤러(222.108) 08.04 110 1
2877760 이거 갖고싶움 ㅇㅅㅇ [3] 어린이노무현갤로그로 이동합니다. 08.04 108 0
2877759 진짜 프로그래머들 이래요? [1] ㅇㅇ갤로그로 이동합니다. 08.04 146 1
2877754 머학에서 수업 30시간 이상 못듣는거 충격적이지않음? [1] 공기역학갤로그로 이동합니다. 08.04 96 0
2877753 메모리랑 io를 원하는 타이밍에 통제못하는게 화남 [1] 공기역학갤로그로 이동합니다. 08.04 96 0
2877750 이렇게 까지 해서 벌어야 하나? ㅇㅇ(175.223) 08.04 71 0
2877749 Rust 특 [2] 프갤러(121.150) 08.04 101 0
2877747 슬슬 오늘도 한권의 책을 다 읽었으니 자야긋다 [2] ㅆㅇㅆ(124.216) 08.04 87 0
2877745 async에 대해서 조금 쉽게 설명을 해주자면 대강 이럼. [1] ㅆㅇㅆ(124.216) 08.04 125 0
2877743 근데 C# 개발자가 async를 안 쓸수가 있나? ㅆㅇㅆ(124.216) 08.04 107 0
2877742 나는 인생에 지향하는 바가 명확하다면 좀 넉넉치않아도 행복하다 생각함 ㅆㅇㅆ(124.216) 08.04 94 0
2877741 가끔은 유학을 사람들이 아예 안 읽어서 참 아쉽단 생각을 해. ㅆㅇㅆ(124.216) 08.04 90 0
2877740 개발자 된지 2년 넘었는데 async가 뭔지 모름 [12] 프갤러(1.245) 08.04 174 0
2877739 안철수씨 말 덜 더듬더라 [2] 헬마스터갤로그로 이동합니다. 08.04 108 0
2877738 중요한건 인생의 경험을 어떻게 자산화 하느냐가 낭비냐 아니냐가 되는거지. [1] ㅆㅇㅆ(124.216) 08.04 102 0
2877737 인생은 남이 보면 지옥이더라도 자기가 만족하면됨. [6] ㅆㅇㅆ(124.216) 08.04 104 0
2877736 인생이 지옥으로 떨어지는 건 한순간이다 [8] 아스카영원히사랑해갤로그로 이동합니다. 08.04 233 1
2877733 하노이의탑 재귀호출 문제 풀다가 자살하고싶어짐 [1] ㅇㅇ(223.39) 08.03 114 0
2877728 113.오구차단 넥도리아(220.74) 08.03 61 0
2877726 넥도리아 쟤도 차단해야겠네 프갤러(113.59) 08.03 101 0
2877725 내일 아침 국장 볼만하겠노 [1] 아스카영원히사랑해갤로그로 이동합니다. 08.03 156 1
2877723 지피티5나오면 국비는 ㅈ댐? [1] ㅇㅇ(211.235) 08.03 185 0
2877721 챗지피티랑 제미나이랑 성능차이 존나 심한듯 [2] 프갤러(220.70) 08.03 123 0
2877720 사람들 생성형 ai 잘다루는 백엔드 개발자 존나 좋아하는 듯 프갤러(118.36) 08.03 114 0
2877719 오늘 해킹 공부한 것 루도그담당(58.239) 08.03 84 0
뉴스 케데헌 ‘골든’, 빌보드 ‘핫 100’ 1위…BTS 이어 새 역사 썼다 디시트렌드 08.12
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2