디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 125 추천 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 가전디지털, 신학기 페스타! 운영자 25/08/29 - -
2881432 노인들의 열등감 어떻하누 뒷통수한방(1.213) 08.14 79 0
2881431 부성애 모성애도 존재하는데 '효'라는 단어는 왜 안씀?? 뒷통수한방(1.213) 08.14 76 0
2881428 휴가쓰고 사천놀러옴 [2] 밀우갤로그로 이동합니다. 08.14 76 0
2881427 오늘 쉬는사람이 승자 [1] ㅇ.ㅇ(122.199) 08.14 104 0
2881426 다음 납품은 중학교 방과후 수업용 유니티 게임 납품. ㅆㅇㅆ(124.216) 08.14 56 0
2881425 R이 학부생~석사 초입 상대로 그래프 장사하니까 돈이 됨 ㅆㅇㅆ(124.216) 08.14 72 0
2881424 지금은 닥치는대로 다 하는데 범위를 좀 줄여야하는데 ㅆㅇㅆ(124.216) 08.14 70 0
2881423 게임,클라,웹,통계 안받는 분야가 없는데 ㅆㅇㅆ(124.216) 08.14 92 0
2881422 일어났다 또 작업 해야한다.. [2] ㅆㅇㅆ(124.216) 08.14 78 0
2881421 의외의 사실: [4] 아스카영원히사랑해갤로그로 이동합니다. 08.14 106 0
2881420 폭풍전야 개멍청한유라갤로그로 이동합니다. 08.14 57 0
2881419 [대한민국] 트럼프 정책 관련되어서- 프갤러(121.172) 08.14 54 0
2881414 여행지에 사전조사 / 볼거리들 다 알아보고 가야 잘 즐길 수 있음?? ㅇㅇ(223.39) 08.14 46 0
2881409 그 약이라는게 그렇게 끊기가 힘듬?? 계속 생각나?? [1] ㅇㅇ(223.39) 08.14 127 0
2881408 개발이 근데 그렇게 힘듬? [3] 프갤러(106.101) 08.14 138 0
2881407 시골 터미널 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08.14 97 0
2881406 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08.14 54 0
2881405 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08.14 96 0
2881404 AI 가 답해주는 포럼 웹사이트 만듬 프갤러(211.55) 08.14 87 0
2881402 게임 1인 개발 성공하니까 단나더 생각나네 ㅇㅇ(125.182) 08.14 147 1
2881400 게임개발하고싶어서 컴공 진학 희망하는 학생인데 진짜 궁금한거 있음. [15] 프갤러(58.78) 08.14 215 0
2881399 패턴 템플릿을 만들어두고 세부 구현 주의사항을 제네릭하게 만들어서 [1] ㅆㅇㅆ(124.216) 08.14 105 0
2881397 시스템 명세 짜고 설명붙이고 구현하고 ㅆㅇㅆ(124.216) 08.14 90 0
2881396 하루 평균 클래스 40개의 명세, 함수, 메서드 약 200개여개 명세 [1] ㅆㅇㅆ(124.216) 08.14 121 0
2881381 근데 개발자 취업시장 안좋은건 [22] 프갤러(118.235) 08.14 567 0
2881370 참 공부를 하면서 느낀다 루도그담당(58.239) 08.14 86 0
2881369 프갤에 글이 없네 ㅋㅋ [2] 프갤러(121.139) 08.14 104 1
2881368 냉면 먹어야겠다 ㄱ ㅐ ㅆ ㅣ빨썌끼들아!!!!!! 프갤러(121.139) 08.14 65 0
2881366 님이 사용 중인 어플들 러스트가 아니라 C/C++로 만든거다 나르시갤로그로 이동합니다. 08.14 95 0
2881365 납품 준비 하나 끝. 아 존나 힘들다 ㅆㅇㅆ(124.216) 08.14 68 0
2881364 식당 술값이 폭리면? 주식 수익은 부당 이익이냐? 나르시갤로그로 이동합니다. 08.14 70 0
2881363 식당 술값이 폭리면? 개발비도 폭리냐? 나르시갤로그로 이동합니다. 08.14 71 0
2881360 GC없는, (메모리 등) 안전 대세 언어: Ada 나르시갤로그로 이동합니다. 08.14 96 0
2881359 러스트가 확실히 대세가 아닌 이유 나르시갤로그로 이동합니다. 08.14 110 0
2881351 개인적으로 개발 세부 구현사항은 문서화 안하지만 전반적으로 ㅆㅇㅆ(124.216) 08.14 90 0
2881348 그리고 기본적으로 마소 예제는 나름대로 기술 분석 해두는게 좋더라 [2] ㅆㅇㅆ(124.216) 08.14 132 0
2881347 뇌과학적으로 고소득층 사람들은 물건보다 '이것'에 집착합니다 발명도둑잡기갤로그로 이동합니다. 08.14 66 0
2881346 아인슈타인의 ‘그 논문’ 50년간 묻혔다가 과학계 레전드로 역주행 발명도둑잡기갤로그로 이동합니다. 08.14 86 0
2881345 나는 대부분 내가 만들어보거나 해본 것들 어지간하면 적어둠 [8] ㅆㅇㅆ(124.216) 08.14 128 0
2881344 나는 크롤링 전문이 아니라서, 그냥 기초 원리만 아는거. [3] ㅆㅇㅆ(124.216) 08.14 121 0
2881343 아씨발나스닥왜자꾸올라개새끼야!!!!!!! [3] 아스카영원히사랑해갤로그로 이동합니다. 08.14 111 0
2881342 웹 크롤링 뷰티풀 스프 사용하는 방법 [2] ㅆㅇㅆ(124.216) 08.14 111 0
2881341 나도 어제 좆개판으로 크롤러 짯는데 [2] 루도그담당(58.239) 08.14 104 0
2881340 R 스크립트 짜면서 느끼는데 유독 파이썬 R은 GPT가 잘짜 ㅆㅇㅆ(124.216) 08.14 87 0
2881338 개발 항상 하면 느끼지만 가장 큰 적은 '돌아가는데 굳이..' 이거임 [2] ㅆㅇㅆ(124.216) 08.13 107 0
2881337 그 약이라는게 그렇게 끊기가 힘듬?? 계속 생각나?? [7] ㅇㅇ(223.39) 08.13 143 0
2881336 파이썬 질문있습니다 [3] 프갤러(211.105) 08.13 108 0
2881335 ㅆㅇㅆ님 이 글에 대해 의견좀 [1] 발명도둑잡기갤로그로 이동합니다. 08.13 110 0
2881331 내가 ai 안쓰는 이유 프갤러(121.139) 08.13 110 0
2881330 금융 로직의 문제는 뭐냐면 [1] 밀우갤로그로 이동합니다. 08.13 121 0
뉴스 장우영, 9월 15일 미니 3집 발매…단독 콘서트 개최 디시트렌드 08.28
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2