디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 103 추천 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 - -
2878275 꼬추랑 물 컵에다가 섞어서 맹물에 마시면 정력증진되고, 소주보다 좋음 넥도리아(220.74) 08.05 59 0
2878224 친구는 인공지능 친구가 있어요 발명도둑잡기갤로그로 이동합니다. 08.05 57 0
2878203 미제의 살인기업 쿠팡 소식 발명도둑잡기갤로그로 이동합니다. 08.05 87 0
2878181 음기 충전 발명도둑잡기갤로그로 이동합니다. 08.05 48 0
2878178 내 코드 라이브러리 만든거 봐줄 사람이 없노 [2] ㅆㅇㅆ(124.216) 08.05 118 0
2878165 민주당이 진실 규명 촉구한 '내란 10대 의혹', 무엇무엇 있나 보니 발명도둑잡기갤로그로 이동합니다. 08.05 71 0
2878152 조유리 '이제 안녕! (Farewell for now!)' 발명도둑잡기갤로그로 이동합니다. 08.05 55 0
2878150 삶이 너무 많은 후회와 미련으로 점철되어 앞으로 나아갈 힘이 없구나... [1] ㅇㅇ(223.39) 08.05 76 0
2878144 멜론의 몰락은 지역 독과점 회사가 글로벌 독과점 회사에게 먹힌 것이다 발명도둑잡기갤로그로 이동합니다. 08.05 41 0
2878143 컴공 이 좆같이 근본없는 학과 커리큘럼의 특징 [1] ㅇㅇ(124.49) 08.05 130 2
2878135 요즘 싸피 영 아닌가봐 프갤러(61.79) 08.04 107 0
2878134 오늘의 소설, 영화 실마리: 인공지능이 인간 멸종시키는 시나리오 발명도둑잡기갤로그로 이동합니다. 08.04 53 0
2878128 나는 사람을 존나팻음 [1] 프갤러(121.139) 08.04 97 1
2878125 지금 미장 뭐임???? [2] 아스카영원히사랑해갤로그로 이동합니다. 08.04 114 0
2878123 핵폭탄 만들었을 때처럼...'인간 통제력 상실' 초지능 AI 위기 발명도둑잡기갤로그로 이동합니다. 08.04 39 0
2878119 220.84 예전 아이피 118.235 발명도둑잡기갤로그로 이동합니다. 08.04 58 0
2878118 윤석열이 빤스만입고 버틴거 신박하지않냐? 헬마스터갤로그로 이동합니다. 08.04 79 1
2878116 1j == -1j // True [2] 재현갤로그로 이동합니다. 08.04 74 0
2878115 220.84 역학 갤러리도 하나보다 [1] 발명도둑잡기갤로그로 이동합니다. 08.04 61 0
2878114 디씨 보안 20년전이랑 바뀐게없는데 ㅋㅋ 프갤러(121.139) 08.04 71 2
2878113 ㅋㅋ 한심한 장애인들 프갤러(121.139) 08.04 81 4
2878110 근데 프록시 안쓰고 저렇게 하는건 생각도 못했네 똑똑하노 ㅆㅇㅆ(124.216) 08.04 98 0
2878108 개추주작은 무료 프록시 써도 되잖아 역류기가 되느냐가 중요하지 ㅆㅇㅆ(124.216) 08.04 85 0
2878107 저거주작기하면 머하냐 개념글등록도 안되는데 ㅋㅋ 프갤러(121.139) 08.04 81 3
2878106 ㅆㅇㅆ가 조금더 겸손해지면 좋겠음 [1] 프갤러(121.139) 08.04 89 6
2878103 Reeve Stimpson - Over Me 발명도둑잡기갤로그로 이동합니다. 08.04 33 0
2878102 ㅆㅇㅆ병신이 전에 뭐 해커 옹호하던데 [2] 프갤러(121.139) 08.04 94 7
2878099 나 주작기 프록시 버전은 돌아가는데, 역류기는 안되지 않나? ㅆㅇㅆ(124.216) 08.04 69 0
2878098 이달의 소녀/여진 “키스는 다음에 (Kiss Later)” [1] 발명도둑잡기갤로그로 이동합니다. 08.04 54 0
2878093 잠들뻔하다 깻당 ♥꽃보다냥덩♥갤로그로 이동합니다. 08.04 48 0
2878092 "잘자 내꿈꿔" 016 광고 관련 예전에 썼던 글 발명도둑잡기갤로그로 이동합니다. 08.04 100 0
2878086 내기 인공지능에 처음 공포를 느꼈던 것은 아키네이터였다 [1] 발명도둑잡기갤로그로 이동합니다. 08.04 60 0
2878084 챗지피티가 반말 쓰는건 왜 그런거죠? 발명도둑잡기갤로그로 이동합니다. 08.04 54 0
2878082 루트(-1) == -루트(-1) [1] 재현갤로그로 이동합니다. 08.04 74 0
2878081 좇센징들보면 그놈이 그놈 도찐개찐인데 지능높다고함 ㅋㅋㅋ 뒷통수한방(1.213) 08.04 63 0
2878079 비야네도 말했듯이 필요하지 않다면 내버려둬라. ㅆㅇㅆ(124.216) 08.04 50 0
2878077 106.101이 쓴 "내가 외힙을 듣는이유" [1] 발명도둑잡기갤로그로 이동합니다. 08.04 54 0
2878075 일론머스크 스타링크는 대만 전쟁 시 한국이 참여 안하면 발명도둑잡기갤로그로 이동합니다. 08.04 44 0
2878074 항상 생각하지만 컴퓨터 과학자, 공학자들이 한 말을 읽어라 ㅆㅇㅆ(124.216) 08.04 86 0
2878073 ㅆㅇㅆ 신천지새끼 아부리 또터네 ㅋㅋ [2] 프갤러(121.139) 08.04 91 3
2878072 사실 강의 팔이 같은거 전부 가두리 양식임 프갤러(205.206) 08.04 147 1
2878070 컴공은 취미로 상당히 괜찮은 과목임. 여기 애새끼들 말 믿지마라 ㅆㅇㅆ(124.216) 08.04 95 0
2878068 컴퓨터는 변하지만 계산은 변하지 않는다는점만 봐도 컴공은 컴퓨터에 대한 [2] ㅆㅇㅆ(124.216) 08.04 112 3
2878067 ip바꿔서 신분세탁 해야하는데 프갤러(121.139) 08.04 37 0
2878065 코딩 취미로 할만한가요 [6] 프갤러(211.192) 08.04 88 0
2878063 장애인 새끼들 프갤러(121.139) 08.04 47 1
2878062 gpt 정신나갔노? [2] 프갤러(113.59) 08.04 74 0
2878060 당장 트랜지스터, CPU 아키텍쳐 몰라도 너네 코딩 할 수 있잖아 ㅆㅇㅆ(124.216) 08.04 44 0
2878058 컴공을 한다는 애들이 컴퓨터 구조에만 집착하는건 본질을 못보는거임 [2] ㅆㅇㅆ(124.216) 08.04 105 0
2878057 코딩알못 문과인데 파이썬이 왜 최적화가 구린 언어라는건가요 [2] 프갤러(211.192) 08.04 72 0
뉴스 '착한 사나이' 이동욱X이성경, 단둘이 떠난 여행부터 달콤한 입맞춤까지 ‘설렘 폭발’ 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2