디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 74 추천 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 휴대폰 액세서리 세일 중임! 운영자 25/07/28 - -
2877241 윤석열 빤스쇼 나도 보도싶구나 [1] 헬마스터갤로그로 이동합니다. 08.02 65 0
2877240 내일 아니 애널 뛰뛰 하려했는데 그냥 쉬어야할듯 [2] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.02 49 0
2877238 ..갔오? [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.02 42 0
2877237 저딴 게 일국의 머통령이었다니 ㅋㅋㅋㅋ [1] 아스카영원히사랑해갤로그로 이동합니다. 08.02 72 0
2877236 3년뒤에 SRE로 직무 변경할건데 기술 스택 평가좀요 프갤러(153.246) 08.02 24 0
2877235 당신이 먹는것들이 곧 당신이당 By 나님 [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.02 40 0
2877234 힘을 원하는가? [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.02 41 0
2877233 프로그래밍은 왜 애들이 문서를 안읽냐 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 08.02 78 0
2877232 밤샘 작업 매우 힘들구나 아스카영원히사랑해갤로그로 이동합니다. 08.02 36 0
2877230 윤석열 오늘 상황.jpg [6] 야옹아저씨갤로그로 이동합니다. 08.02 235 7
2877228 ㅅㅂ 모기 느낌 때문에 자꾸 불 껏다켯다 하니까 지치넹.. [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 40 0
2877227 돈벌기 어렵네 프갤러(118.235) 08.01 43 0
2877225 누가 제발 저 모기 같은 멍퀴 좀 처리 좀 해주라.. [6] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 67 0
2877224 사무직노동자가 되는길은 멀고도 험하구나 ㅇㅇ(14.52) 08.01 29 0
2877222 분명 모기 있는데.. 미치겟넹.. 모기약에도 안 죽엇낭.. [2] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 45 0
2877221 오늘부터 사이타마 운동법을 할 예정이다 [5] ㅆㅇㅆ(124.216) 08.01 58 0
2877220 컴활1급 딴사람 있음? [1] ㅇㅇ(14.52) 08.01 40 0
2877217 몸상태가 나을듯 말듯 [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 38 0
2877216 남자가 군대가는건 지극히 당연하고 오히려 감사해야 할일임 프갤러(115.138) 08.01 33 0
2877215 코파일럿 버그 많네 [1] 프갤러(175.213) 08.01 40 1
2877213 뉴프로에 사용자 많이 유입됐더라 헬마스터갤로그로 이동합니다. 08.01 38 0
2877212 나님 조만간 프갤러 분석 특집 칼럼 써주겠음 1편 대상자는 [4] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 54 0
2877210 얘들아 나 ㄹㅇ 어떡함? 진짜 좆됐는데 씨발 [5] 프갤러(211.202) 08.01 85 0
2877207 해킹 할줄 알려면 뭐배워야됨? [1] ㅇㅇ(118.235) 08.01 50 0
2877205 ㅅㅂ 일찍 자려구 했는데 모기약 빼느라 못 자구있다 ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 25 0
2877202 모기약 뿌리면 머리 아파서 되도록이면 안 뿌리는댕.. ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 24 0
2877197 프로그래밍도 그림이나 악기같은거처럼 많이 하면 느냐 프갤러(211.192) 08.01 36 0
2877193 요즘 모기 못 봤다고 방심 했더니 바로 나타나넹.. ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 23 0
2877192 아스카 작업 중 커뮤니케이션 미스로 실수함 아스카영원히사랑해갤로그로 이동합니다. 08.01 41 0
2877190 나님 개좃됨.. ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 32 0
2877184 자료구조라는건 어떻게 공부하는거에요? 저 3문제푸는데 9시간걸리는데 [2] ㅇㅇ(223.39) 08.01 39 0
2877181 하루에 천억줄 감사의 코딩 공기역학갤로그로 이동합니다. 08.01 33 0
2877179 모두 냥덩이를 위해 기도 해주세양.. [3] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 56 0
2877176 주민등록 사실조사 참여 안하면 과태료 50만원 부과 될 수도 잇다네 [5] 야옹아저씨갤로그로 이동합니다. 08.01 161 6
2877173 나님 건강 이슈로 당분간 탈갤합니당.. [1] ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 63 0
2877172 구글창업자: 세르게이 - 잼민이ai 금지한사람 골때린다 프갤러(183.101) 08.01 34 0
2877169 열돔은 콘돔이당 By 나님 ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 34 0
2877164 코딩 뉴비 조언좀요 ㅠㅠ 프갤러(118.235) 08.01 55 0
2877162 나님 애널두 무사히 차분하게 주무실 준비..⭐+ ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 36 0
2877161 잠 한번 잘못잤다고 멀미 비스무리하게 오는둣? ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 26 0
2877158 리버스 만유인력? ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 27 0
2877157 오호라 음의 유효질량.. ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 29 0
2877156 피궁해서 누엇당.. 졸리.. ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 24 0
2877154 뭐임 2찢명 계엄 때림? 증시 대폭망 환율 1400대 뚫었넹 ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 64 0
2877153 애널의달성 3.3/1/ ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 28 0
2877151 옷을 벗기는 것보다 화장을 벗기는게 더욱 치욕적인;; ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 57 0
2877149 윤괴수 팬티쇼 보고싶지않냐? [1] 헬마스터갤로그로 이동합니다. 08.01 68 0
2877148 냉정하게 23살먹고 공부해보겠다는건 아집이고 객기일까요?? ㅇㅇ(223.39) 08.01 71 0
2877145 정신력을 직접 산출할수는 없기에 결과물로 유추하며 개인적이당 ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 40 0
2877143 뀨? ♥찢명아티스트냥덩♥갤로그로 이동합니다. 08.01 35 0
뉴스 ‘나 혼자 산다’ 박나래, 찐친과 웨딩 촬영 공개...“마지막 웨딩화보 일것” 디시트렌드 08.02
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2