디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 78 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [92] 운영자 20.09.28 46038 65
2878047 남자가 근육질 남자 보고 좋아하면 동성애 성향 있는건가 발명도둑잡기갤로그로 이동합니다. 22:15 0 0
2878046 틱톡에 태이,우아 떡방박제됨 ㅋ 짤리기 전에 봐ㄱㄱ 프갤러(220.119) 22:15 0 0
2878044 우주문명과 통신 편지 ♥꽃보다냥덩♥갤로그로 이동합니다. 22:13 1 0
2878043 아이러니하게 컴공은 컴퓨터 구조를 깊게 이해할수록 프로그래밍이 어려움 [2] ㅆㅇㅆ(124.216) 22:12 20 0
2878042 째깍째깍째깍 마귀의 소굴을 채우는 시곗소리. 프갤러(220.84) 22:11 4 0
2878041 한국 가수 노래가 미국이나 외국에서 뜨려면 영어 가사가 유리한가 연구 [1] 발명도둑잡기갤로그로 이동합니다. 22:10 5 0
2878040 틱톡에 태이,우아 떡방박제됨 ㅋ 짤리기 전에 봐ㄱㄱ [1] 프갤러(220.119) 22:10 4 0
2878039 '부천김린' 틱톡에 벗방시절 박제됐음 ㅋ 짤리기전에봐라ㄱㄱ [1] 프갤러(222.106) 22:10 3 0
2878038 나님 주무시기전 소통⭐+ 질문 받음 [1] ♥꽃보다냥덩♥갤로그로 이동합니다. 22:09 11 0
2878037 추억 속의 사람이 그리워요. 프갤러(220.84) 22:07 6 0
2878034 언론에서 아이폰이 안전하다고 오보하면 절대 안되는 이유 발명도둑잡기갤로그로 이동합니다. 22:03 7 0
2878033 흐으음 2가지 제안 받음 어린이노무현갤로그로 이동합니다. 22:03 17 0
2878031 10cm-사랑은 여섯줄 [1] ㅇㅇ(14.52) 22:01 8 0
2878028 전세계 공유기 보안기술 취약점 문제 [2] 발명도둑잡기갤로그로 이동합니다. 21:58 15 0
2878026 마귀를 가둔 봉인 부적의 효력도 떨어져가. 프갤러(220.84) 21:53 7 0
2878025 벌써 10시넹.. ♥꽃보다냥덩♥갤로그로 이동합니다. 21:53 7 0
2878023 아 근데 난 왜 이렇게 멍청할까 [4] 루도그담당(58.239) 21:51 43 0
2878020 마귀의 웅덩이에 태어나고싶지않았어. 프갤러(220.84) 21:47 10 0
2878017 아니 근데 신기하네 2차 보안 휴대폰 보안까지했는데 어떻게 [6] ㅆㅇㅆ(124.216) 21:44 40 0
2878015 인생 다 산 기분 든다는 힙합 갤러리 사용 발명도둑잡기갤로그로 이동합니다. 21:41 8 0
2878014 커서 IDE 생각보다 많이 실망이네 프갤러(211.235) 21:41 20 0
2878011 마귀의 집을 지키기도 지겹습니다. 프갤러(220.84) 21:37 12 0
2878010 기본적인 보안도 못지키는 빡통은 개발자하면 안됨 [1] ㅇㅇ(211.234) 21:37 25 2
2878009 랜선에서 나온 작은거 재활용 어디다 버림? 넥도리아(119.195) 21:37 10 0
2878007 해커는 도둑놈인데 인기가 있을까 ㄹㅇ 도둑노무 새끼들 [2] ㅆㅇㅆ(124.216) 21:36 22 0
2878005 106.101 빛섬 광고 혹시 간첩인가? 발명도둑잡기갤로그로 이동합니다. 21:34 12 0
2878004 나님 일본에서 초고교급 여고생 만난썰 ♥꽃보다냥덩♥갤로그로 이동합니다. 21:32 12 0
2878001 추악한 썩은 시체처럼 살아서 미안해요. 프갤러(220.84) 21:31 11 0
2878000 드라마 <아이쇼핑> 한대서 생각나는 것 [1] 발명도둑잡기갤로그로 이동합니다. 21:28 10 0
2877997 우리 둘째 작은 할아버지가 대학생 때 럭비선수였는데 [1] 발명도둑잡기갤로그로 이동합니다. 21:23 16 0
2877995 지원금2 시작 ㅇㅇ(106.101) 21:23 20 0
2877994 헉! 나님 간택 받은듯? [1] ♥꽃보다냥덩♥갤로그로 이동합니다. 21:21 16 0
2877990 세상의 무게에 짓눌려 터지는 가엾은 영혼을 보세요. 프갤러(220.84) 21:17 16 0
2877988 여행나가면 뭐해야함?? 미리 이것저것 알아보고 가야하나 [1] ㅇㅇ(223.39) 21:13 10 0
2877986 기껏 열심히 보안공부해봤자 대부분이 관제 엔딩아님?? [2] 타이밍뒷통수한방(1.213) 21:10 20 0
2877984 예전에도 말했듯이 디씨인싸이드 프로그래밍 갤러리는 각국 정보기관이 [1] 발명도둑잡기갤로그로 이동합니다. 21:08 17 0
2877981 한남혐오 멍유의 산뜻한 아침❤+ [2] ♥꽃보다냥덩♥갤로그로 이동합니다. 21:04 24 0
2877980 20분 전에 필라이트 맥주 한 잔 마셨다 [1] 발명도둑잡기갤로그로 이동합니다. 21:02 20 0
2877976 디저트를 배불리 먹고싶네요. 프갤러(220.84) 20:57 16 0
2877972 여긴 냥덩시티~⭐+ 냥디~ 냥디~ 야~ [2] ♥꽃보다냥덩♥갤로그로 이동합니다. 20:52 24 0
2877970 프갤보면 정신병 걸릴 것 같음. [1] 프갤러(106.101) 20:51 24 0
2877967 해커 이 씨발련들 대가리를 부숴야함 그냥 [3] ㅆㅇㅆ(124.216) 20:45 38 0
2877964 크~ 존멋 이게 남자지 [1] ♥꽃보다냥덩♥갤로그로 이동합니다. 20:41 20 0
2877963 <컴퓨터 우주 탐험> [1] 발명도둑잡기갤로그로 이동합니다. 20:38 8 0
2877961 보안이 개구린이유 다시말해준다 밀우갤로그로 이동합니다. 20:34 24 0
2877959 BoA 보아 'Crazier' [1] 발명도둑잡기갤로그로 이동합니다. 20:29 19 0
2877954 나의 한 달 소비 내역 [1] 발명도둑잡기갤로그로 이동합니다. 20:21 22 0
2877950 어빠.. 나 오늘 안전해~ [3] ♥꽃보다냥덩♥갤로그로 이동합니다. 20:13 36 0
2877946 디저트로 아이스크림을 먹어야겠어요. 프갤러(220.84) 20:06 18 0
뉴스 ‘나 혼자 산다’ 박나래, 찐친과 웨딩 촬영 공개...“마지막 웨딩화보 일것” 디시트렌드 08.02
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2