디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 100 추천 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/04 - -
AD 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
2878885 프갤은 찢재명갤로 이름바꿔야지 [1] 뒷통수한방(1.213) 08.07 57 0
2878883 깃헙은 왜 착한 애들밖에 없음? [3] 프갤러(58.29) 08.07 97 0
2878881 이어폰 고무캡이 문제인듯... 테스트 해보겠음. 넥도리아(220.74) 08.07 28 0
2878880 이어폰 설정 넥도리아(220.74) 08.07 67 0
2878878 9가 제일 좋음 7~8 소리 크기 넥도리아(220.74) 08.07 35 0
2878877 4차산업으로 뭐 제대로 이루어진게 1개도없누 뒷통수한방(1.213) 08.07 49 0
2878876 음량이 70-80이었어... 바로 줄여야지. 20으로 넥도리아(220.74) 08.07 35 0
2878875 한남들 쌍욕박는거보다 업무처리가 미숙하시네요 [1] 헬마스터갤로그로 이동합니다. 08.07 41 0
2878874 pc 이어폰으로 들리면 음이 울리면서 작아지는데, 블루투스 이어폰은 고음 넥도리아(220.74) 08.07 40 0
2878872 흠.. 바쁘네 어린이노무현갤로그로 이동합니다. 08.07 77 0
2878870 🐍 Snake XI Woad – 한입에 삼켜라! 프갤러(1.254) 08.06 46 0
2878869 20250805 컴퓨존 직원 선생님과의 상담 내역 [1] 넥도리아(220.74) 08.06 71 0
2878867 모두 잘자여 개멍청한유라갤로그로 이동합니다. 08.06 39 0
2878866 이 강연 가지 못했습니다. (feat. 국회) 넥도리아(220.74) 08.06 61 0
2878865 여초 음악 장르 발명도둑잡기갤로그로 이동합니다. 08.06 46 0
2878864 세계 힙합씬 각국마다 남초인 이유 발명도둑잡기갤로그로 이동합니다. 08.06 42 0
2878863 멍유야.. 수라의 길을 걸으려 하느냐.. [2] ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 68 0
2878862 증세를 한적이없다누 역시 그짝은 대화않하는대 계속 말걸음 ㅠㅠ [1] 뒷통수한방(1.213) 08.06 42 0
2878861 여당 간사 위원들 다수 포함. 직접 메일로 손수 보내주시고, 긴글로 [1] 넥도리아(220.74) 08.06 48 0
2878860 [포토] 주현영, 귀여움이 아쿠마다 갸르~ 발명도둑잡기갤로그로 이동합니다. 08.06 48 0
2878859 퍼플렉시티랑 챗으로 싸우는중 [4] 뒷통수한방(1.213) 08.06 79 0
2878858 카톡 복붙했더니 썸 지수 15점ㅋㅋㅋㅋ 프갤러(1.254) 08.06 38 0
2878857 난 찍기만 했다 안양 시청 처리 시설 내구력 짱. 넥도리아(220.74) 08.06 58 0
2878856 공군 마약? 발명도둑잡기갤로그로 이동합니다. 08.06 35 0
2878855 한마디로 데이터 복구 갈때 컴퓨터 들고 생쑈 넥도리아(220.74) 08.06 54 0
2878854 2찢명 범죄자님 쫌만 더 해듀세여~ ㅋㅅㅋ ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 43 0
2878853 현재 포인트인데 요즘 이러고 다니는데 그만해야 할듯... 넥도리아(220.74) 08.06 52 0
2878852 조나단도 2억넘는 포르쉐 뽑고 곽튜브도 연애 3번했는데 뒷통수한방(1.213) 08.06 37 0
2878851 음기 충전 발명도둑잡기갤로그로 이동합니다. 08.06 23 0
2878849 소신투표 조롱..'정치 홍대병'을 아시나요 발명도둑잡기갤로그로 이동합니다. 08.06 39 0
2878848 카톡 복붙했더니 썸 지수 15점ㅋㅋㅋㅋ 프갤러(1.254) 08.06 29 0
2878847 React 상태관리 라이브러리 뭐씀? [3] 프갤러(121.133) 08.06 87 0
2878846 기 겁나 쎔 vs 유리 멘탈 발명도둑잡기갤로그로 이동합니다. 08.06 38 0
2878843 1년차 개발자한테 기대하는 역량은 어느정도임?? [2] ㅇㅇ(211.104) 08.06 64 0
2878842 소니 엑스페리아 10 ii 액정 자가 수리 후기부터 나사 높이 생각안해워 넥도리아(220.74) 08.06 32 0
2878841 아 개씨발 모기 ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 45 0
2878838 앞으로 왜 달러패권이 위협받는지 설명해주는영상요약 발명도둑잡기갤로그로 이동합니다. 08.06 23 0
2878835 이민 사망 글 쓴 이후부터 내 방 노트북 인터넷이 너무 느리다 발명도둑잡기갤로그로 이동합니다. 08.06 40 0
2878834 흐미 AI가 돈 달래요 ㅠ [1] 나르시갤로그로 이동합니다. 08.06 52 0
2878832 이민 특징 ) 앰생들은 꿈도 못꿈 ㅋㅋ 뒷통수한방(1.213) 08.06 36 0
2878829 나님 탈갤합니당.. [6] ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 81 0
2878828 대기업들 미국으로 전부 이전하든 니들이 앰생인건 똑같잖아 ㅋㅋㅋ 뒷통수한방(1.213) 08.06 26 0
2878827 나님 쉬야하구 주무시는⭐+ ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 32 0
2878826 인공지능으로 Ada, SPARK 프로그래밍 책 작성했어요. 나르시갤로그로 이동합니다. 08.06 39 0
2878825 러빨러 덕분에 러스트 좋같다는거 더 많이 홍보되는군요 나르시갤로그로 이동합니다. 08.06 30 0
2878824 방송법 개정안 국회 통과...언론단체 "방송 독립 첫 걸음" 환영 발명도둑잡기갤로그로 이동합니다. 08.06 24 0
2878823 재업) 5.7 개발 환경의 공정한 비교: 성숙도와 설계 철학의 교차점 나르시갤로그로 이동합니다. 08.06 26 0
2878822 오늘 빵을 안 먹고 지나가네... 넥도리아(220.74) 08.06 31 0
2878820 근데요 이재명 당대표 당시 발언 보면 이전글 참고 - 미담 같던데 넥도리아(220.74) 08.06 37 0
2878819 그래두 멍유 많이 정상인된듯(취소) [8] ♥꽃보다냥덩♥갤로그로 이동합니다. 08.06 58 0
뉴스 재혼 앞둔 김병만, 혼외자 인정…"혼인 파탄 뒤 출산" 디시트렌드 08.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2