디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 99 추천 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 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
2877382 지금 토스나 뱅크샐러드 들어가보면 [3] 아스카영원히사랑해갤로그로 이동합니다. 08.02 172 0
2877381 취업하려면 토익,컴활1급 도움되나요?? ㅇㅇ(14.52) 08.02 60 0
2877380 마인드 컨트롤.. 프갤러(222.234) 08.02 47 0
2877378 클라이언트 절대다수는 코드 수준을 평가할 수 없다 [3] ㅆㅇㅆ(124.216) 08.02 102 0
2877377 포인터 = 사실 정수형 담는 변수임 [5] 루도그담당(58.239) 08.02 110 0
2877376 근데 포인터 너무 어려워서 겁쟁이 런한 나같은 개발자 없냐? [2] ㅆㅇㅆ(124.216) 08.02 81 0
2877375 포인터 씨발년아 [3] 프갤러(222.234) 08.02 97 0
2877374 코딩 처음시작 조언좀 [2] 프갤러(114.199) 08.02 90 0
2877373 프리도 실력천차만별임. 프리코드 받아보면 [8] ㅆㅇㅆ(124.216) 08.02 121 0
2877370 프리 할 정도면 존나 잘해야 되지 않냐 [2] ㅇㅇ갤로그로 이동합니다. 08.02 84 0
2877369 굉장히 접고 습합니다 [1] 개멍청한유라갤로그로 이동합니다. 08.02 74 0
2877365 프리랜서 이력서 가짜로 쓰는 애들은 뭐냐 [3] ㅇㅇ갤로그로 이동합니다. 08.02 90 0
2877363 레드팀 문서 같은거 보면서 느낀건데 [2] 루도그담당(58.239) 08.02 67 0
2877362 나 약쟁이가 되어버렸음 [4] 공기역학갤로그로 이동합니다. 08.02 93 0
2877361 나 안쫒겨났다. 무지성 도배하기 싫어서 떡밥을 기다리는 중이지 프갤러(14.58) 08.02 53 0
2877358 김건희씨에 대한 빤스맨 윤수괴의 집착이 대단하지않냐? [3] 헬마스터갤로그로 이동합니다. 08.02 90 0
2877357 개인적으로 강의는 프로그램 만드는 강의 아니면 굳이 싶다. ㅆㅇㅆ(124.216) 08.02 65 0
2877356 회사에서 llm 지원해주냐..? [3] 프갤러(58.122) 08.02 80 1
2877354 근데 어차피 지피티 쓰면서 예제 짜달라고하면서 문서 읽는게 [2] ㅆㅇㅆ(124.216) 08.02 90 0
2877351 솔직히 문서 좋은데 루도그담당(58.239) 08.02 54 0
2877350 리액트 문서 추천하자면 ㅆㅇㅆ(124.216) 08.02 64 0
2877349 C/C++ C# Java 이건 기본으로 공부해 놔라. [1] 프갤러(59.16) 08.02 105 0
2877348 갠적으로 내 생각엔 강의 듣는것보다 문서 따라가는게 더 나은거같은데 [2] ㅆㅇㅆ(124.216) 08.02 89 0
2877346 해킹 공부 시작할게요 [2] 루도그담당(58.239) 08.02 66 0
2877345 리액트(코알누, 인프런) [2] 프갤러(222.101) 08.02 374 0
2877343 멋사 백엔드 부트캠프 ㄱㅊ? 프갤러(218.149) 08.02 117 0
2877341 이런 날씨는 밤낮을 바꿔야하는것 아닙니까? [3] 헬마스터갤로그로 이동합니다. 08.02 69 0
2877339 애초에 루비야 넌 그냥 피해망상 정병이잖냐 ㅆㅇㅆ(124.216) 08.02 69 0
2877338 매미 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08.02 53 0
2877336 재활용했다 탄소중립포인트 없어진데 당분간 넥도리아(223.38) 08.02 44 0
2877335 이정부랑 전정부사람들의 공통점 이탓 넥도리아(223.38) 08.02 55 0
2877332 근데 루비야 니가 그 커뮤니티를 황폐하게 만드는 놈인데 누굴 탓해 ㅆㅇㅆ(124.216) 08.02 62 2
2877331 Ada 설계 철학을 책에서 3개 다루는데 나르시갤로그로 이동합니다. 08.02 47 0
2877330 x.y 절 하나 검토하는데 하루 걸리는데 나르시갤로그로 이동합니다. 08.02 49 0
2877327 요새 집필 중인 Ada 프로그래밍 서적 나르시갤로그로 이동합니다. 08.02 55 0
2877326 사마천은 궁형을당해 고자가 되고. 사기를 집필함 프갤러(183.101) 08.02 48 0
2877324 커뮤 남탓 하기 전에 넌 무얼했느냐 나르시갤로그로 이동합니다. 08.02 48 0
2877317 스승님은 항상 주 언어 con을 무조건 보면서 감각을 익히라고하는데 [3] ㅆㅇㅆ(124.216) 08.02 66 0
2877313 태연 ㅇㅅㅇ [7] 헤르 미온느갤로그로 이동합니다. 08.02 73 0
2877311 1차 납품 11시에 하고 자야지.. [1] ㅆㅇㅆ(124.216) 08.02 54 0
2877309 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08.02 50 0
2877308 MS 기반 아키텍트 고대로 따라하면 내가 설계했다기보다는 [2] ㅆㅇㅆ(124.216) 08.02 77 0
2877307 아 씨발 [1] 루도그담당(58.239) 08.02 54 0
2877306 요즘 아키텍트 디자인 방법론보면 플랫폼 종속성 패턴이 대부분 [1] ㅆㅇㅆ(124.216) 08.02 59 0
2877305 전반적으로 아키텍트 관련 서적 최근에 4~5권 읽었는데 ㅆㅇㅆ(124.216) 08.02 54 0
2877304 내가 느끼는게 전반적으로 나보다 지피티가 더 잘짠다. [3] ㅆㅇㅆ(124.216) 08.02 76 0
2877299 ㅆㅇㅆ가 느끼는 한국개발커뮤니티 노답이라 느끼는거 ㄹㅇ 프갤러(183.101) 08.02 566 0
2877297 노란봉투법이 통과되면 [6] 개멍청한유라갤로그로 이동합니다. 08.02 91 0
2877294 챗지피티 4.1 vs 지미나이 프로 [2] 프갤러(149.22) 08.02 56 0
2877287 석열 이 디스했더니 차단당했다 옆갤에서 넥도리아(220.74) 08.02 64 0
뉴스 신화 이민우, ‘싱글맘’ 예비신부 공개…6살 딸과도 다정하게 ‘찰칵’ 디시트렌드 18:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2