최근 수정 시각 : 2024-10-25 09:49:34

무한 루프

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

1. 프로그래밍 용어

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

UNIX 터미널 프로그램에서 이 명령어를 입력하면 무한 루프가 행해진다.[5]
#!syntax sh
$ yes
이 경우에는 시스템에 부하 테스트(스트레스 테스트)를 행하기 위해 고의적으로 일으키는 루프다.[6] 정지시키기 위해서는 그냥 Ctrl+C를 눌러 인터럽트를 발생시키면 된다.

스크래치 엔트리에서는 무한/계속 반복하기 블럭이 있다.

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

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

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

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

재귀함수는 이론상 무한루프가 가능하나, 함수 실행을 스택에 저장하기 때문에 (메모리가 유한하기에) 무한 루프가 성립하지 않고 런타임 에러가 난다. 컴파일러에서 루프 한도를 직접 지정해줄 수 있다.

C나 Node.js 등으로 무한 루프를 cpu 스레드 개수정도 동시에 실행하면 CPU가 100%인 것을 볼 수 있다. 프로세스 하나에서 작업을 잡고 놔주지 않기 때문이며 반복문 끝에 잠시 대기로 들어가는 코드(Sleep() 등)을 사용하면 잠시 점유를 놓기 때문에 CPU 점유율이 내려간다.

1.1. 의도치 않은 무한 루프

흔히 있는 버그이다. 이런 점은 하드디스크가 맛가도 의도치 않은 버그를 볼 수 있으며 부등호를 숙지하지 못하는 초기에 부등호를 반대로 집어넣어서 경험해볼 수 있다. 간혹가다 함수를 설정했는데 그 함수 내에서 함수값을 가져오는 문자열을 입력한다면 무한 루프가 성립한다. '함수를 설정함→함수값이 필요함→함수값을 얻기 위해 함수를 설정함→함수값이 필요함' 식으로 무한 루프에 걸리고, 이러면 대부분 함수값을 얻으면서 설정하는 과정에서 함수값에 오류를 일으켜 오류를 내뿜거나 심하면 IDE가 응답하지 않는다. Unity 게임메이커 스튜디오의 경우에는 응답 없음도 안 뜨고 아예 뻗는다.

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

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

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

참고로 무한루프제 게임의 경우에는 1000만점에 도달하는 것이 바로 일본 스코어러들의 최종적인 목표이다. 이러한 1000만점 목표는 제비우스가 그 시초이다. 그리고 무한 루프제를 채택한 게임에선 일정 실력 이상이 되면 하루종일 붙들고 있는게 가능한만큼 하이스코어 집계에선 무한루프의 경우 대부분 1000만점을 넘는 순간 1000만+α의 형태로 집계를 종료한다. 하지만 북미 스코어러는 그런 거 없고, 체력이 되는 데 까지 계속 진행한다. 예를 들면 자우스트는 자그마치 67시간 30분 동안 플레이를 하여 기네스 기록이 되었다.

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

3. 영구 패턴

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

3.1. 레벨 디자인 기법


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


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

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

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

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

카드게임에서 무한 루프가 나온다. A 상태 → B 상태 → C 상태 →... 다시 A상태로 오는 경우다. 다만 루프를 발동하면서 코스트가 발생하는 경우에는 몇 루프 못 가고 멈춘다. 다만 루프의 효과로 상대에게 대미지를 가한다면 원턴킬이 성립할 수 있어, 카드 개발사 측에서 제재가 들어가는게 보통.

유희왕의 무한루프 사례는 유희왕/무한 루프 문서를 참조.

매직 더 개더링은 유희왕과는 다르게, 사용자가 임의로 멈출 방법이 전혀 없는 채로 무한 루프에 들어가면[12] 그대로 게임이 무승부 처리된다. 가장 대표적인 수단이 다른 지속물이 아무 것도 없는 채로 망각륜 3개만이 서로를 추방하면서 왔다갔다하는 상태. 매온에서는 게임이 자동으로 뻗으면서 무승부 처리되고 다음 게임으로 넘어간다. 레거시에는 무한히 돌아간다는 걸 증명할 수 없는 무한루프를 돌리는 Four Horsemen이라는 덱이 존재한다.[13]

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

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

포켓몬스터 TCG에서도 익스펜디드(엑스트라 룰)에서 무한 루프를 할 수 있는 방법이 존재한다. 준비물은 XY11의 클레피와 포푸니라. 방법은 간단한데 포푸니라가 필드에 있다면 먼저 클래피를 내보내고 클레피의 특성을 사용해 도구로써 포푸니라에게 붙이고 포푸니라의 특성으로 다시 클레피를 패로 되돌리는 과정을 반복하면 된다. 얼핏보면 이 루프는 정말 아무 의미 없는 루프지만 몇몇 카드들과 시너지가 상당한데 BW확장팩 1탄의 란쿨루스와 체력높은 포켓몬 여럿, 스타디움 마그마단의 비밀기지와 조합해 클래피를 내보냈을때 데미지를 올리게 되면 그 데미지를 란쿨루스의 특성으로 옮기고 클레피의 특성을 사용해 도구로 다른포켓몬에게 붙인뒤 포푸니라의 특성으로 패로 되돌리는것을 반복, 이렇게 자신의 필드에 데미지 카운터가 66개 이상이면 SM8의 안농(041/095)을 이용해 특수승리하는 방법이 있었다...만 익스펜디드(엑스트라 룰)에서 SM8의 안농(041/095)이 금지를 당했다.(다만 무한루프를 할 수 있는 카드가 금지를 당한게 아니라 무한루프는 여전히 성립한다.)

레전드 오브 룬테라는 코스트 감소 카드를 활용해 무한루프를 성립시킬 수 있지만, 유저가 직접 카드를 계속 내는 방식으로 유저가 제어할 수 없는 무한루프는 현재까지 없다. 가장 유명한 건 아크샨으로, 2레벨 명소 초읽기를 완성하면 얻는 감시자의 보물의 효과중 카드 2장을 뽑고 모든 카드 비용 1 감소가 있다. 이 카드를 여러번 써서 코스트를 계속 낮춰서 무한루프를 성립시키는 것. 초기에 썼던 건 아이오니아 지역을 조합해 나보리 음모자끼리 계속 귀환시키는 것으로, 아크샨 2레벨 명소 초읽기 효과에 아군을 지정하면 초읽기 진행 효과가 있어 저짓을 계속 반복하면 감시자의 보물을 또 얻어서 코스트를 계속 줄일 수 있다. 그런 뒤 기절 주문인 뇌진탕 유발자를 귀환을 이용해 계속 써서 전체 스턴을 걸고 킬각을 잡는 식으로 썼다. 현재는 주로 필트오버 지역과 조합해 카드를 덱에 복사하는 모조품을 써서 감시자의 보물을 여러번 발동시키는 식으로 사용하지만 못뽑으면 꽝이라 운빨이 조금 필요하다. 그 외엔 빅토르와 영광스러운 진화 주문의 코스트 감소와 생성 효과가 있는 영원그림자 사냥꾼의 조합이 있다. 현재는 라운드마다 같은 종류의 카드를 사용할 수 있는 횟수에 제한이 걸려있다. PVE 모드인 챔피언의 길에서는 매우 쉽게 볼 수 있는데, 그냥 카타리나한테 마나 저장 아이템 하나 끼워주면 바로 무한루프가 되어 무한히 타격해서 게임을 끝낸다. 그 외에도 여러 무한콤보가 있다.

5. 유튜브 크리에이터

파일:상세 내용 아이콘.svg   자세한 내용은 무한루프(유튜브 크리에이터) 문서
번 문단을
부분을
참고하십시오.

6. Perfume의 노래

파일:상세 내용 아이콘.svg   자세한 내용은 ∞ループ 문서
번 문단을
부분을
참고하십시오.

7. 관련 문서



[1] C 언어 family 기준. [2] Java, JavaScript에서는 true를 쓰지만 JavaScript 같은 경우엔 1을 넣어도 잘 작동한다. [3] 일부 C 컴파일러에서는 경고 수준이 높을 경우 while(1) 문 사용 시 조건문이 상수라는 이유로 경고를 발생시킨다. for는 경고를 발생시키지 않는다. 물론 동작은 둘다 똑같이 무한 루프다. [4] 컴파일러가 최적화가 잘 된 요즘에는 while(1)을 쓰나 for를 쓰나 동일하지만, 90년대 이전에는 while(1)이 루프가 돌 때마다 조건을 검사하여 약간 더 느렸었다. 그래서 옛날부터 해왔던 교수님들은 아직도 for를 선호하기도 한다. [5] 해당 문서로. [6] 가끔씩 프로그램 설치할 때마다 [y/n] 형식의 질문에서 매번 y 입력하는 게 귀찮다고 쓰는 작자들도 있다. [7] 정작 이 항목에는 HCF로는 HANGUL CHOSEONG FILLER 때문에 들어올 수 없다. [8] 이 키의 하단에 잘 보면 'Break'라는 표기가 있다. [9] 대표적으로 의 경우 SIGINT (Ctrl+C)를 무시하도록 되어 있다. 당장 유닉스 셸이 SIGINT를 무시하지 않는다고 쳐 보면 실수로 Ctrl+C 한 번 누를 때마다 로그인을 다시 해야 한다! [10] 이는 해당 하드웨어와 엔진이 모듈화도 필요없을 정도로 여력이 있어서 가능한 얘기다. [11] 슈퍼 마리오브라더스 4-4, 7-4 스테이지가 이런 경우로, E자형의 분기 중 출구 분기 외의 곳으로 나아가면 방금 지나온 분기 구조로 돌아오는 구조가 출구 분기로 들어서기 전까지 무한히 반복된다. [12] 멈출 수 있을 때는 무한루프를 몇 번이나 반복할지 정해야 한다. 무한루프가 증명되었는데도 이를 그냥 반복만 하고 있는 건 시간을 일부러 끄는 반칙으로 간주하기 때문. "이러이러해서 무한루프 성립하는데 몇 번 반복할게요"라고 증명과 선언을 하고 게임을 속행한다. [13] 짧게 요약하자면, 무덤에 특정한 카드들만이 존재하는 상황이 올 때까지 계속 서고를 밀다가 엠라쿨로 도로 섞어넣는 루프를 돌려댄다. 이 상황이 오는 것 자체는 필연적이지만 언제 올지는 아무도 모르므로 무한루프가 증명이 안 되는 것이다. [14] 아키나이는 회복을 딜로 바꾸는데, 고통의 여제는 피해를 주면 영웅을 회복시켜주는 효과를 가지고 있다. 이 둘이 필드에 있을 때 고통의 여제가 전투로 피해를 입히면 그 수치만큼 회복이 되어야 하는데 이게 피해로 바뀌고, 그러면 다시 피해를 입힌 게 되니 효과가 발동해 회복을 시키려 하나 이 역시 피해로 바뀌고 이것을 무한 반복한다. 즉 자기 영웅 체력을 깎는 자살 무한 루프. [15] 모독은 광역 1 피해를 주고, 이 효과로 하수인이 죽을 경우 한 번 더 발동한다. 미궁 탐험 모드에 나오는 체력 1에 죽으면 바로 부활하는 밀랍 광전사라는 카드와 연계하면 무한 루프가 되며, 일반전에서도 몇 가지 카드를 연계하면 무한 루프가 가능하다. [16] 시간포식자가 카드 12장 사용 시 턴을 강제로 끊는다. 다만 그 대가로 시간포식자의 단순 전투력은 형편없으므로, 성장성을 담당하는 카드나 유물을 챙겨갔다면 뚫을 수 있다. [17] 뽑을 카드 더미와 버린 카드 더미를 완전히 없애버려야 한다. 핸드 제한은 10장이므로 덱이 10장 이하여야 한다. 물론 전투 도중 소멸시켜서 덱을 줄여도 된다. [18] 버린 카드 더미에 들어가자마자 뽑을 카드 더미가 없으므로 덱을 섞고, 뽑을 카드 더미가 단 하나 뿐이므로 바로 다시 집어오는 것. [19] 덱을 3번 섞을 때마다 에너지 2 제공 [20] 덱을 섞을 때마다 방어도 6 제공