디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 122 추천 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 - -
2880428 긴급] 길냥덩 쥐찢명 잡는 영상 최초 공개 !! ♥냥덩이♥갤로그로 이동합니다. 08.11 62 0
2880427 적당한 추상화는 이해에 도움되는데 [2] 루도그담당(118.235) 08.11 101 0
2880426 GOT7(갓세븐) "A" 발명도둑잡기갤로그로 이동합니다. 08.11 65 0
2880425 나님 스스로에 대해 더 잘 알아야행 ♥냥덩이♥갤로그로 이동합니다. 08.11 59 0
2880424 이게 추상화 계층 레이어가 나뉘어져있다는 이해가 있으면 존나 편함 [3] ㅆㅇㅆ(124.216) 08.11 83 0
2880423 프로그래밍 설계하면서 중요한 청사진은 문법으로 구현되지 않음. ㅆㅇㅆ(124.216) 08.11 78 0
2880421 프로그래밍 아키텍트의 장점이 언어에 구애를 안받음 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 08.11 75 0
2880420 영웅의 여정 발명도둑잡기갤로그로 이동합니다. 08.11 40 0
2880419 프로도: "이런 일이 내 시대에 일어나지 않았더라면 좋았을 텐데요." 발명도둑잡기갤로그로 이동합니다. 08.11 54 0
2880418 개발자란 직업 나만 멋있어보임? [4] 프갤러(211.60) 08.11 136 0
2880417 집정리하다 나온 먼지 덮인 ‘이것’···경매서 9000만원에 팔렸다는데 발명도둑잡기갤로그로 이동합니다. 08.11 53 0
2880416 지피티이거 웹에서 루도그담당(118.235) 08.11 67 0
2880415 젊은애들이 힘든일 안 하려는 이유 발명도둑잡기갤로그로 이동합니다. 08.11 64 0
2880414 지피티 글 삭제도 좀 이상하지 않냐 [1] 프갤러(61.79) 08.11 67 0
2880413 챗지피티는 5나오고나서 애가 더 멍청해진거같네 [2] 공기역학갤로그로 이동합니다. 08.11 106 0
2880412 애초에 마소는 이미 자기네들 홈페이지 완성 예시 다 올려뒀잖아 [3] ㅆㅇㅆ(124.216) 08.11 99 0
2880410 "소고기 사먹을 줄 알았더니"…소비쿠폰 풀리자 대박 난 '이곳' 발명도둑잡기갤로그로 이동합니다. 08.11 57 0
2880409 마소가 만들어논거보면 좋은 점이 [1] 루도그담당(118.235) 08.11 85 0
2880408 특이점 온다 노동해방시대 온다 ㅇㅇ 뒷통수한방(1.213) 08.11 58 0
2880407 Asp.net core 이거 존나 좋은데 [2] 루도그담당(118.235) 08.11 92 0
2880405 내가 프갤에 있는 이유)여기 조차도 안가면 이야기할 곳이 없다 [2] ㅆㅇㅆ(124.216) 08.11 87 0
2880403 적어도 프로그래밍 업종은 중국애들이 시민의식이 더 높음. [2] ㅆㅇㅆ(124.216) 08.11 88 0
2880402 유독 프로그래밍 업계라는 애들이 톡시하지 않냐? [2] ㅆㅇㅆ(124.216) 08.11 94 2
2880401 40대부터는 사업을 하고 싶다 프갤러(61.79) 08.11 63 0
2880400 번식한새끼들은 대우해주는거 아무리봐도 이해 좇나 안가네 뒷통수한방(1.213) 08.11 58 0
2880399 Asp.net core는 왜 안 쓰는거냐 루도그담당(118.235) 08.11 73 0
2880398 gpt5.0때문에 오늘 두시간 날렸네 프갤러(175.210) 08.11 78 0
2880397 댓글 이쁘게 발명도둑잡기갤로그로 이동합니다. 08.11 63 0
2880396 이기적인 놈 응용 좆되노 이기 [1] 슈퍼막코더(126.194) 08.11 102 0
2880395 2찢명 운지 스타또⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.11 72 0
2880394 개발자 목메지마라 ♥냥덩이♥갤로그로 이동합니다. 08.11 69 0
2880393 아이 구해주는 코끼리 발명도둑잡기갤로그로 이동합니다. 08.11 53 0
2880392 챗지피티같은 이미지 생성기 만드는거 어려움? ㅇㅇ(106.102) 08.11 70 0
2880391 한국인이 시골에 친척끼리 같이 살던 문화라 남과 비슷해지려 발명도둑잡기갤로그로 이동합니다. 08.11 63 0
2880390 특이점 온다 노동해방시대 온다 ㅇㅇ 뒷통수한방(1.213) 08.11 50 0
2880389 이젠 챗봇에 질문하는걸 프롬프트 엔지니어링 ㅋㅋ [5] 헬마스터갤로그로 이동합니다. 08.11 94 0
2880388 개발자 목 매는게 별 거 있나 재밌으니까 하는거지 [1] ㅆㅇㅆ(124.216) 08.11 73 0
2880387 개발자 목매는이유가 뭐임? [2] 프갤러(221.143) 08.11 139 0
2880386 친자식이 아니랍니다 발명도둑잡기갤로그로 이동합니다. 08.11 64 0
2880385 흠.. 함 운덩하면 이틀은 봐야하는건강? ♥냥덩이♥갤로그로 이동합니다. 08.11 63 0
2880384 찢재앙 국가수지 개박살 ♥냥덩이♥갤로그로 이동합니다. 08.11 64 1
2880383 아스카느님 상하이 여행을 고려 중이시다 [14] 아스카영원히사랑해갤로그로 이동합니다. 08.11 105 0
2880382 체력이란 무엇인강? [2] ♥냥덩이♥갤로그로 이동합니다. 08.11 73 1
2880381 노동해방시대 오면 좋은점 ㅋ 뒷통수한방(1.213) 08.11 56 0
2880380 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 08.11 43 0
2880379 벌떡벌떡 ♥냥덩이♥갤로그로 이동합니다. 08.11 137 1
2880378 빌게이츠 AI 시대 노동해방 발명도둑잡기갤로그로 이동합니다. 08.11 66 0
2880377 애널 좀 축축하넹 ♥냥덩이♥갤로그로 이동합니다. 08.11 66 0
2880376 노동해방시대 오면 좋은점 ㅋ 뒷통수한방(1.213) 08.11 64 0
2880375 금융권 가고싶은데 어떤거 준비해야돼? [2] 프갤러(220.88) 08.11 344 0
뉴스 '은수 좋은 날' 이영애X김영광, 피할 수 없는 운명 앞에 선 두 사람... 그 결말은? 두 번째 메인 포스터 공개! 디시트렌드 08.26
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2