디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 123 추천 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/25 - -
이슈 느린 여행으로 삶의 속도를 찾는 유튜버 꾸준 운영자 25/08/26 - -
AD MD's pick 상반기 인기 노트북 운영자 25/08/26 - -
2879171 멍유가 그래도 남혐은 안함 [2] ㅇㅇ(211.36) 08.07 92 0
2879167 프로그래머가 전망이 구리다는건 착각임 [1] 프갤러(211.234) 08.07 157 0
2879166 납땜이랑 선이 단선되어서 우라늄은 접어야할 것 같습니다. 넥도리아(220.74) 08.07 72 0
2879161 멍유의 실체를 다시한번 폭로합니다 [5] ㅇㅇ(211.36) 08.07 168 2
2879157 일본대지진나면 그때 이후로 가야징 ♥냥덩이♥갤로그로 이동합니다. 08.07 59 0
2879156 메이플 왤캐 접어야 할 것 같지... 이게 왜 이럴까... ㅇㅇ(223.39) 08.07 64 0
2879153 한국 시장은 대부분 의도된 기술 폐쇄성으로 인위적 수요를 양성하잖아 ㅆㅇㅆ(124.216) 08.07 67 0
2879151 AI 기업 선정하는 이유는 정부에서 억지로 일자리 만들어주기지 ㅆㅇㅆ(124.216) 08.07 93 1
2879148 Ai 기업 선정 이거 의미있는거맞음? [2] ㅇㅇ(211.210) 08.07 91 0
2879147 일단 오늘 50만원 땄음 ㅇㅇ(39.7) 08.07 81 0
2879144 백엔드 좆밥이었노 ㅋㅋㅋㅋㅋㅋㅋㅋ 프갤러(223.38) 08.07 121 0
2879143 혼자 끄적이고 있는 프로그램 소스 라인수. 프갤러(59.16) 08.07 81 0
2879137 여기 있는 새끼들 중 인터넷 다 끊어놓고 [5] 프갤러(223.38) 08.07 98 1
2879128 로렌스 레식 brain hacking 발명도둑잡기갤로그로 이동합니다. 08.07 58 0
2879127 나님 누엇어양⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.07 51 0
2879125 ai가 대단하긴 하네 솔직히 [1] 프갤러(221.146) 08.07 79 0
2879124 no reach no impact 발명도둑잡기갤로그로 이동합니다. 08.07 50 0
2879123 ㅅㅂ 뭐 잘못 머섯나 ♥냥덩이♥갤로그로 이동합니다. 08.07 65 0
2879122 러스트 못배우는 저능아라도 괜찮아 정신승리하는데 공들여봤자 [1] 프갤러(218.154) 08.07 65 0
2879120 저능아 몽키가 러스트 신포도질 해봤자 아무도 관심 안줍니다. 프갤러(218.154) 08.07 53 0
2879119 담배 술 커피 다 끊음 [1] 프갤러(61.79) 08.07 113 0
2879118 제미나이 대학생 신청했는데 왜 아직 이메일안오냐 [1] 프갤러(124.59) 08.07 98 0
2879117 일을 안한다는게 남의 시선을 이사가는데 친절을 받았는데, [4] 넥도리아(223.38) 08.07 71 0
2879113 애널 날씨 선선하니 가을같네양..⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.07 53 0
2879112 애널 피궁해서 그냥 빨리 자구싶은데 동시에 맛난걸 먹구싶은.. ♥냥덩이♥갤로그로 이동합니다. 08.07 48 0
2879111 그래도 취업못하는일은 없게해준다는분이 3분이나 계심 [6] 공기역학갤로그로 이동합니다. 08.07 189 0
2879109 애널의달성 2.1/2/ ♥냥덩이♥갤로그로 이동합니다. 08.07 61 0
2879108 주변이 죄다 경력 20,30년차들이니 실력이금방느네 [1] 네오커헠(211.234) 08.07 98 0
2879107 러빠로 인하여 그에 대해 반박하면서 나르시갤로그로 이동합니다. 08.07 76 3
2879106 러스트) 10.2 종합 나르시갤로그로 이동합니다. 08.07 73 0
2879105 러스트) 8.5 ‘자격’과 ‘정상성’의 규정: 게이트키핑과 담론적 배제 나르시갤로그로 이동합니다. 08.07 71 0
2879103 러스트) 성능, 안전성, 생산성: 프로그래밍 언어 설계의 상충 관계 나르시갤로그로 이동합니다. 08.07 75 0
2879102 정말 갖고싶은게 생겼어요. 열심히 해보려구요. ㅇㅇ(223.39) 08.07 85 0
2879101 흠 어느새 윈도우 임베의 초고수가 된거같군 네오커헠(211.234) 08.07 81 0
2879100 윾식이 무시하면 안댐 ㅇㅇ갤로그로 이동합니다. 08.07 64 0
2879099 장난쳤는데 일 존나 커짐 [1] ㅇㅇ(211.235) 08.07 83 4
2879097 프로그래밍이 개씨발 말이 안되는건 계층상승을 할수 있음 [2] ㅆㅇㅆ(124.216) 08.07 133 0
2879096 디시 매각 ㄹㅇ 이냐? [1] 루도그담당(211.184) 08.07 129 0
2879095 스텁 구현해서 함수 포인터에 담고 루도그담당(210.104) 08.07 84 0
2879094 의사처럼 자격증이 필요한 것도 아니야. 그냥 컴퓨터 한대면 [2] ㅆㅇㅆ(124.216) 08.07 111 0
2879093 냉정하게 23살먹고 공부해보겠다는건 아집이고 객기일까요?? ㅇㅇ(223.39) 08.07 99 0
2879092 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 08.07 52 0
2879091 진짜 말이 안되지 않냐? 자본 개씹좆도 없는데 프로그래밍이면 [3] ㅆㅇㅆ(124.216) 08.07 113 0
2879090 온누리 이래도 되냐... 넥도리아(223.38) 08.07 61 0
2879089 진짜 항상 프로그래밍에 감사한다. ㅆㅇㅆ(124.216) 08.07 92 1
2879088 프로그래밍은 코드를 짜는 게 아니기때문에 아직은 AI가 대체하지 못함. [3] ㅆㅇㅆ(124.216) 08.07 121 0
2879086 진짜 AI가 나오면, 인터넷에서의 인간 활동 가치가 확 떨어지지 않을까 ㅇㅇ(106.241) 08.07 65 0
2879084 실검앱 만든거있는데 프갤러(175.209) 08.07 98 0
2879083 오잉? ♥냥덩이♥갤로그로 이동합니다. 08.07 61 0
2879082 윈도 메모장에 코파일럿 생겼더라 [4] ㅇㅇ갤로그로 이동합니다. 08.07 122 0
뉴스 '한일톱텐쇼' 황민호, 신들린 장구 퍼포먼스에 재킷 탈의까지...갈라쇼 빛낸 '작은 거인'  디시트렌드 08.27
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2