최근 수정 시각 : 2019-07-18 21:13:01

무한 루프

무한반복에서 넘어옴
  • 예시를 보고 싶다면 이 무한 루프 링크를 연 뒤 그곳에서 이걸 계속 누르면 된다.[1]

1. 프로그래밍 용어
1.1. 의도치 않은 무한 루프
2. 게임 스테이지의 무한 루프3. 영구 패턴4. TCG, CCG에서의 무한 루프5. 관련 문서

1. 프로그래밍 용어

프로그램이 일련의 명령을 무한히 반복하는 것을 말한다. 이런 무한 루프는 프로그래밍 실수로 인해 발생할 수도 있고 의도적으로 탈출 조건을 설정한 다음 만들 수도 있다.
while(1);
같은 식으로 간단히 만들 수 있다. 또는 for문을 사용하고 싶다면
for(;;)
를 쓰면 된다.[2]

macOS등의 터미널 프로그램에서 이 명령어를 입력하면 무한 루프가 행해진다.
yes
이 경우에는 시스템에 부하 테스트(스트레스 테스트)를 행하기 위해 고의적으로 일으키는 루프다. 정지시키기 위해서는 그냥 터미널을 강제 종료하면 된다.

스크래치에서는 무한 반복하기 블럭이 있다.

프로그래밍을 막 배우기 시작한 단계에서의 무한 루프는 대부분 실수에서 나오므로 나쁜 것이라고 생각하기 쉽지만 우리가 쓰는 거의 모든 프로그램이 실행 중이라는 것은 곧 무한 루프 속에 있다는 것을 의미한다.

예를 들어, 우리가 이렇게 모니터로 위키를 보면서 위키질을 할 수 있는 것도 OS가 무한루프를 통해 화면을 뿌리는 것을 반복하면서 동시에 입력신호를 대기하는 무한 루프가 돌아가고 있는 덕분이다. 비디오 게임 역시 마찬가지로 게임을 시작하고 가만히 놔두더라도 실제 게임 속에서는 입력 -> 갱신 -> 그리기라는 한 번의 루프를 초당 수십번씩 도는 것(60/144 FPS 등)을 전제로 작성되고 있다. 이것을 게임 루프라고 한다.

의도적인 무한 루프가 필요한 경우, 제어를 위해 반드시 그 탈출 조건을 만들어야 한다. 반복문 내에 break;와 같은 중단점을 삽입하거나, 좀더 안정적인 방법으로 해당 루프문에 조건을 걸어놓고 해당 조건을 충족시켜 주는 방법이 있다.

시스템을 정지시켜야 할 상황 등을 위해 무한 루프를 발생시키는 기계어 명령어도 있다. 가령 인텔 x86 CPU의 HLT 명령어는 더 이상의 명령어 실행을 정지시키고 인터럽트나 리셋 등의 특정 조작에 의해서만 동작을 재개하는 명령어이다. 간혹 한 발 더 나아가 인터럽트나 시스템 명령에도 응답하지 않고 유의미한 동작을 하는 것도 아니거니와 내부에서는 바쁘게 돌아가는, 무의미한 동작 상태에 빠지는 명령어가 있을 수도 있는데, 실행은 정지되고 그리 바쁘게 돌아가다 보면 불 붙겠네 해서 이런 명령에 붙는 별명이 Halt and Catch Fire (HCF).[3] 보통은 펜티엄의 버그와 같이 이런 동작을 의도하지 않은 경우가 많지만, 명령 실행은 하지 않으나 의미있는 동작을 하는 CPU도 존재한다. 그 예로 모토로라 68k 프로세서에는 명령 수행을 중지하고 0번지부터 시작해서 모든 가용 메모리 워드를 매 클럭마다 읽어들이지만 그것으로 유의미한 결과를 내지는 않는 명령어가 있는데, 이는 벤더 쪽에서 버스에서의 데이터 흐름 등으로 프로세서의 기계적 결함을 진단할 수 있도록 내장한 명령어라고 한다.

재귀함수는 이론상 무한루프가 가능하나, 함수 실행을 스택에 저장하기 때문에 (메모리가 유한하기에) 무한 루프가 성립하지 않고 런타임 에러가 난다. 컴파일러에서 루프 한도를 직접 지정해줄 수 있다. 근데 재귀함수를 저딴 식으로 짜면 일단 정상이 아니다. 종료 조건 어디갔냐

1.1. 의도치 않은 무한 루프

흔히 있는 버그이다. 이런 점은 부등호를 숙지하지 못하는 초기에 부등호를 반대로 집어넣어서 경험해볼 수 있다. 간혹가다 함수를 설정했는데 그 함수 내에서 함수값을 가져오는 문자열을 입력한다면 무한 루프가 성립한다. '함수를 설정함→함수값이 필요함→함수값을 얻기 위해 함수를 설정함→함수값이 필요함' 식으로 무한 루프에 걸리고, 이러면 대부분 오류를 내뿜거나 심하면 IDE가 응답하지 않는다.

의도적이지 않은 무한 루프는 마인크래프트를 만든 마르쿠스 페르손처럼 해결하면 될 수도 있다.[4] 문제가 생기면 그만큼 루프가 돌아야 해결된다는 게 문제가 되긴 하지만, 코딩 자체가 모든 시나리오에 맞게 돌아갈수는 없으니 만약을 준비해 놓는다는 점으로는 좋은 기술이다.

멀티태스킹이 되지 않는 OS는 프로그램이 무한 루프에 빠지면 리부팅밖에 답이 없다. 그렇기 때문에 언제든지 프로그램의 수행을 강제로 종료할 수 있는 키가 있다. MS-DOS는 CTRL+Pause[5], 유닉스 계열은 CTRL+C를 사용한다. 물론 이것도 근본적으로는 프로그램이 해당 인터럽트를 처리하지 않아서 커널에서 기본 동작인 해당 프로그램의 종료를 처리하는 것이기 때문에 해당 프로그램이 인터럽트를 무시하도록 되어 있거나[6] 아래의 HCF처럼 프로그래머의 실수나 하드웨어 결함으로 인터럽트를 못 받는 상황이 되었다면 답이 없다. 스마트폰에서 이런 일이 일어날 경우를 벽돌 현상이라 칭한다.

2. 게임 스테이지의 무한 루프

주로 고전 게임에서 흔히 나오는 것. 마지막 스테이지를 클리어 하면 1스테이지로 돌아가고 다시 처음부터 플레이 한다. 2주차 플레이하고는 다른 것이 무한 루프 게임은 몇 번을 깨도 구성이 바뀌는 것이 없다. 단 무한 루프제 게임에서도 한 바퀴를 돌 때마다 구성이 조금씩 바뀌다가 무한 루프가 시작되는 주차에서 구성의 변화가 멈추는 경우는 있다.

참고로 무한루프제 게임의 경우에는 1000만점에 도달하는 것이 바로 일본 스코어러들의 최종적인 목표이다. 이러한 1000만점 목표는 제비우스가 그 시초이다.

게임 개발자의 입장에서는 만들기 쉽다. 끝판과 첫판을 연결하기만 하면 된다.

3. 영구 패턴

영구 패턴 또한 무한 루프의 일종이다. 일본 게임계에서는 특유의 스코어러 문화 때문에 영구 패턴을 영구 패턴 이외의 무한 루프와 구분해서 말하는 관행이 있지만, 서양 게임계에서는 영구 패턴 또한 loop 또는 infinite loop라고 부른다. 한국은 케바케이지만 딱히 엄밀히 정의하진 않는 편.

3.1. 레벨 디자인 기법


해당 영상은 메탈슬러그2로, 선로를 포함한 배경이 숲에서 다리로 반복되다 스테이지 보스인 드래곤 노스케 부분에서 배경이 또 바뀐다.


해당 영상은 언차티드 2: 황금도와 사라진 함대로, 선로와 배경을 모듈화해 컨베이어처럼 반복시키지 않고 거대한 순환선처럼 만들었다.[7]

이것의 핵심은 미궁 같은 구조[8] 혹은 달리는 차량이나 열차 등이 무대인 곳에서 구조물이나 배경들이 컨베이어 벨트처럼 계속해서 반복되며, 특정 지점에 도달 혹은 보스 제거 등 특정 목표를 만족시키면 루프 구성의 일부가 변경, 혹은 끝나거나 한다.

또한 플레이어가 올라타거나 지나가야 하는 구조물이 반복되는 경우, 최대한 걸리적 거리지 않게 일직선 형태로 되어 있다.

4. TCG, CCG에서의 무한 루프

유희왕의 경우는 유희왕/무한 루프 항목으로.

매직 더 개더링은 유희왕과는 다르게, 사용자가 임의로 멈출 방법이 전혀 없는 채로 무한 루프에 들어가면[9] 그대로 게임이 뻗어버려서 무승부 처리하고 다음 게임에 들어간다. 가장 대표적인 수단이 다른 지속물이 아무 것도 없는 채로 망각륜 3개만이 서로를 추방하면서 왔다갔다하는 상태.

하스스톤은 멈출 수 있는 무한 루프가 성립하는 경우가 있지만 대부분 운에 의존하거나 굉장한 수고를 들여야 하기에 인정하는 편이다. 대표적으로 무한염구 법사가 있는데, 이 외에는 턴 시간제한 때문에 실용적으로 쓰기가 다소 힘들다. 이렇게 몇 장의 카드로 플레이를 하면서 무한 루프가 되는 경우 말고 카드 효과 때문에 뭘 하는 순간 카드 효과가 무한 반복되는 경우도 있다. 대표적으로 아키나이 영혼사제 + 고통의 여제.[10] 이 경우엔 61번 루프를 반복하게 되면 시스템상 강제로 종료하게 되어있다. # 하지만 이후 2017년 8월 얼어붙은 왕좌의 기사들부터는 고통의 여제의 능력을 생명력 흡수라는 효과로 새로 지정하고 비슷한 카드들을 내면서 한 번만 대미지를 주고 끝나게 패치되어 더 이상 무한루프가 아니다. 이 외에도 모독이랑 특정 카드 연계[11] 등 무한 루프는 몇 개 더 존재하나, 모두 일정 횟수 반복하면 시스템상 강제 중단하게 되어있다.

Slay the Spire에서 멈추지 않는 팽이를 얻은 채로 0코스트 카드만 남기면 무한루프가 성립한다. 직접 턴 종료를 누르기 전에는 무한번 카드를 쓸 수 있게 된다. 루프 제한이 아예 없으나 로그라이크 게임성과 극한의 덱 압축이 필요해서 정말 보기 힘들다. 다른 방법으로는 핸드에 덱의 모든 카드를 들고 [12] 강철의 섬광 같은 0코스트 1드로 카드를 쓰면 쓰자마자 다시 핸드로 돌아오는데 [13] 이래도 무한 루프가 성립한다.

5. 관련 문서



[1] 백괴사전에서는 진짜 이런 식으로 만들어놓은 문서가 있는데 "재귀 참조"라는 문서다.(#) 구글에서도 recursion(재귀)라고 검색하면 'recursion을 찾으셨나요?'라며 검색어 재귀 추천을 하는 것을 확인할 수 있다. 여담이지만 과거에 백괴사전에서 이런 식으로 만든 문서는 뫼비우스의 띠였으나 현재 뫼비우스의 띠는 순환 참조로 이동되고 이런 무한 루프는 재귀 참조 문서에서 볼 수 있다.[2] 일부 C 컴파일러에서는 경고 수준이 높을 경우 while(1) 문 사용 시 조건문이 상수라는 이유로 경고를 발생시킨다. for(;;) 는 경고를 발생시키지 않으나 다른 의견이 있을 경우 수정바람. 물론 동작은 둘다 똑같이 무한 루프다.[3] 정작 이 항목에는 HCF로는 HANGUL CHOSEONG FILLER 때문에 들어올 수 없다.[4] 루프가 일정 횟수를 도달하면 해당 코드의 실행을 그냥 멈춰버렸다.[5] 이 키의 하단에 잘 보면 'Break'라는 표기가 있다.[6] 대표적으로 의 경우 SIGINT (Ctrl+C)를 무시하도록 되어 있다. 당장 유닉스 셸이 SIGINT를 무시하지 않는다고 쳐 보면 실수로 Ctrl+C 한 번 누를 때마다 로그인을 다시 해야 한다![7] 이는 해당 하드웨어와 엔진이 모듈화도 필요없을 정도로 여력이 있어서 가능한 얘기다.[8] 슈퍼 마리오브라더스 4-4, 7-4 스테이지가 이런 경우로, E자형의 분기 중 출구 분기 외의 곳으로 나아가면 방금 지나온 분기 구조로 돌아오는 구조가 출구 분기로 들어서기 전까지 무한히 반복된다.[9] 멈출 수 있을 때는 무한번 해당 행동을 반복해도 좋다. 시간을 일부러 끌면 그것도 반칙이니 '이러이러해서 무한루프 성립하는데 몇번 반복할게요' 라고 증명과 선언만 하면 된다.[10] 아키나이는 회복을 딜로 바꾸는데, 고통의 여제는 피해를 주면 영웅을 회복시켜주는 효과를 가지고 있다. 이 둘이 필드에 있을 때 고통의 여제가 전투로 피해를 입히면 그 수치만큼 회복이 되어야 하는데 이게 피해로 바뀌고, 그러면 다시 피해를 입힌 게 되니 효과가 발동해 회복을 시키려 하나 이 역시 피해로 바뀌고... 이것을 무한 반복한다. 즉 자기 영웅 체력을 깎는 자살 무한 루프.[11] 모독은 광역 1 피해를 주고, 이 효과로 하수인이 죽을 경우 한 번 더 발동한다. 미궁 탐험 모드에 나오는 체력 1에 죽으면 바로 부활하는 밀랍 광전사라는 카드와 연계하면 무한 루프가 되며, 일반전에서도 몇 가지 카드를 연계하면 무한 루프가 가능하다.[12] 뽑을 카드 더미와 버린 카드 더미를 완전히 없애버려야 한다. 핸드 제한은 10장이므로 덱이 10장 이하여야 한다. 물론 전투 도중 소멸시켜서 덱을 줄여도 된다.[13] 버린 카드 더미에 들어가자마자 뽑을 카드 더미가 없으므로 덱을 섞고, 뽑을 카드 더미가 단 하나 뿐이므로 바로 다시 집어오는 것.[14] 진실에 도달하는 것을 막는 능력이기 때문에 어떤 일이 일어났다는 진실을 제로로 만든다. 자세한 것은 여기여기로.