디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 5.3 goto 문

나르시갤로그로 이동합니다. 2025.08.02 02:08:49
조회 73 추천 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 - -
2877656 it 취업 이젠 답없다는거 근들갑 아니였음? [1] ㅇㅇ갤로그로 이동합니다. 08.03 73 0
2877654 ㅆㅇㅆ 빠는새끼는 뭐냐? 신천지 성도들이냐? ㅋㅋ 프갤러(121.139) 08.03 46 4
2877652 오눌은 마라탕에 베라까지 [4] 아스카영원히사랑해갤로그로 이동합니다. 08.03 48 0
2877649 클래스도 객체다! 예제 코드 [1] ㅇㅇ(1.230) 08.03 48 0
2877648 솔직히 ㅆㅇㅆ 아쉽긴함 [3] ㅇㅇ(211.210) 08.03 71 0
2877647 데브옵스 개발자를 돈주고 고용해야하는 이유 [4] 에이도비갤로그로 이동합니다. 08.03 78 0
2877646 아 성공했다 [2] 루도그담당(58.239) 08.03 53 0
2877643 파이썬 코딩 문제 2 [2] ㅇㅇ갤로그로 이동합니다. 08.03 54 0
2877641 남이 메이플하는 모습보면 왜 이렇게 한심해 보이냐?? ㅇㅇ(223.39) 08.03 23 0
2877640 데브옵스는 코드가 돌아가는 환경 제공하는 거라고 이해하면됨 [1] ㅆㅇㅆ(124.216) 08.03 35 0
2877639 개발자분들 어떤 키보드 쓰시나요? [4] 프갤러(223.38) 08.03 50 0
2877637 멍유씨는 왜 슬기를 자짤로 쓰나요 [7] 아스카영원히사랑해갤로그로 이동합니다. 08.03 65 0
2877636 devops의 개념이 뭐냐? [12] 아스카영원히사랑해갤로그로 이동합니다. 08.03 69 0
2877635 외주는 크몽으로부터 시작해야 하나? [4] 프갤러(121.129) 08.03 49 0
2877633 신입생분들 걱정마세요. AI는 절대 개발자 대체 못합니다. ㅇㅇ(211.237) 08.03 59 0
2877632 면접에서 알고리즘 라이브코테 20분동안 본다는디 [3] 프갤러(121.190) 08.03 102 0
2877631 공부는 어떻게 해야하는거임?? 이악물고 단전에 힘주고 해야함?? [1] ㅇㅇ(223.39) 08.03 38 0
2877629 농담이 아니고 요즘 외주에 AI API 붙여달라는 애들 많아서 억지로라도 [2] ㅆㅇㅆ(124.216) 08.03 70 0
2877628 솔직히 좇센 재벌들 사라지면 내가 새롭게 해쳐먹을 자신있음 뒷통수한방(1.213) 08.03 27 0
2877627 파이썬은 그냥 쪽수 인원수로 개발하는 느낌 [1] 뒷통수한방(1.213) 08.03 43 0
2877626 도커 말나와서 하는 말인데 요즘 해외서는 선두 그룹은 ㅆㅇㅆ(124.216) 08.03 32 0
2877624 난 죄다 파이썬으로 윈도 프로그램 만드는데 [4] 에이도비갤로그로 이동합니다. 08.03 71 0
2877623 근데 진짜 에어도비 말마따나 파이썬이 대세가 될수밖에 없는게 [6] ㅆㅇㅆ(124.216) 08.03 61 0
2877621 나도 회사에서쓰는 프로그램 간단하게 파이인스톨러썻는데 [1] 밀우갤로그로 이동합니다. 08.03 29 0
2877620 나도 파이썬 안좋아했고 학교다닐때나 쓰는줄알았는데... [3] ㅆㅇㅆ(124.216) 08.03 55 0
2877619 인생은 운과 노력의 종합이라고?? 뒷통수한방(1.213) 08.03 65 0
2877618 다시 작업이나 하러가야겠다 [5] ㅆㅇㅆ(124.216) 08.03 48 0
2877617 피자헛이 망했다 [2] 개멍청한유라갤로그로 이동합니다. 08.03 41 0
2877614 vs code extension 하나 만들어봤다. [4] 프갤러(125.31) 08.03 40 2
2877613 ㄹㅇ 코딩 실력이란 게 별로 필요가 없긴 함 [4] 에이도비갤로그로 이동합니다. 08.03 66 1
2877612 사람마다 프로그램다운로드 위치가 다른데 어떻게 프로그램이 동작함? [2] 프갤러(118.223) 08.03 34 0
2877607 인생은 노력임 ㅎㅎ [2] 뒷통수한방(1.213) 08.03 37 0
2877606 신천지 성도들도 이만희한테 열정은차고 넘친다 ㅋㅋ 프갤러(121.139) 08.03 38 1
2877604 진짜 ㅆㅇㅆ 플밍에 대한 열정은 ㅇㅈ이긴 함 [4] 에이도비갤로그로 이동합니다. 08.03 51 0
2877602 121.139 누군가 했더니 금마였네 ㅆㅇㅆ(124.216) 08.03 30 0
2877601 ㅆㅇㅆ <- 방구석 it 사이비 [1] 프갤러(121.139) 08.03 58 4
2877600 회사에서 말하는 협업이란 [1] 프갤러(59.16) 08.03 39 0
2877599 실력이라는게 코딩 스킬과 도메인 스킬 다 나눠져있음 ㅆㅇㅆ(124.216) 08.03 41 0
2877597 냉정하게 23살먹고 공부해보겠다는건 아집이고 객기일까요?? ㅇㅇ(59.24) 08.03 64 0
2877596 팀노바인가 뭔가가 AI 부정하는건 어쩔수 없지 않나 ㅆㅇㅆ(124.216) 08.03 46 0
2877594 ■요즘 합격할려면 무슨 포폴이 대세인가요? [1] ㅇㅇ갤로그로 이동합니다. 08.03 46 0
2877592 파이썬 문제 [5] ㅇㅇ갤로그로 이동합니다. 08.03 48 0
2877591 AI 내려치기 하는 애들은 팀노바 애들 아닐까 싶다 [3] 프갤러(121.148) 08.03 46 0
2877590 121.139 말하는거보니 프로그래밍쪽도 아닌거 같은데 ㅆㅇㅆ(124.216) 08.03 21 0
2877588 거지세계에서 ㅆㅇㅆ가 커보이는건 당연하지 ㅋㅋ [2] 프갤러(121.139) 08.03 60 4
2877587 일단 현재 프갤에서 플밍 제일 고수는 ㅆㅇㅆ인 것 같음 [7] 아스카영원히사랑해갤로그로 이동합니다. 08.03 109 0
2877586 좀 코딩을 할 때 필요 해석문 좀 달아놔라 [6] 짇알옆차기(222.113) 08.03 71 0
2877584 인공지능에 대한 환상 프갤러(121.148) 08.03 30 0
2877580 프로그래밍 언어 만들어본 사람 있음? [6] ㅇㅇ갤로그로 이동합니다. 08.03 63 0
2877579 아이큐 같은게 사람 포텐셜을 전부 파악못하고 아이큐는 변함 [4] ㅆㅇㅆ(124.216) 08.03 62 0
뉴스 감성 힐링 아이콘 ‘키키(KiiiKiii)’, 써스데이 아일랜드(Thursday Island)의 새로운 뮤즈로 발탁 디시트렌드 08.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2