본문 바로가기
세상의 모든 지식 세상의 모든 지식

Overflow와 Underflow가 프로그램 결과에 미치는 영향

읽는 시간 약 8분

프로그램의 작은 허점 오버플로우와 언더플로우 이해하기

우리가 매일 사용하는 스마트폰 앱이나 컴퓨터 프로그램은 눈에 보이지 않는 수많은 숫자를 계산하며 움직입니다. 날씨를 확인하고, 은행 계좌에서 송금을 하고, 게임에서 점수를 얻는 이 모든 과정 뒤에는 숫자를 다루는 컴퓨터의 연산 장치가 있습니다. 하지만 컴퓨터가 다룰 수 있는 숫자의 크기에는 물리적인 한계가 존재합니다. 이 한계를 넘어설 때 발생하는 현상이 바로 오버플로우와 언더플로우입니다.

컴퓨터는 무한한 숫자를 기억할 수 없습니다. 정해진 메모리 공간 안에서만 숫자를 표현해야 하므로, 담을 수 있는 그릇의 크기가 정해져 있습니다. 이 그릇이 넘칠 정도로 너무 큰 숫자가 들어가거나, 반대로 너무 터무니없이 작은 숫자가 들어가면 프로그램은 심각한 오류를 일으키게 됩니다. 이는 단순한 이론적인 문제가 아니라 실제 서비스 장애나 금전적 손실, 심지어 안전사고로까지 이어질 수 있는 중요한 문제입니다.

오버플로우와 언더플로우의 개념과 유형

오버플로우와 언더플로우는 컴퓨터가 표현할 수 있는 범위를 벗어날 때 발생하지만, 그 양상은 정수와 실수를 다룰 때 조금씩 다르게 나타납니다. 각각의 특성을 이해하면 프로그램이 왜 이상 동작을 하는지 쉽게 파악할 수 있습니다.

정수 오버플로우와 언더플로우

정수는 딱 떨어지는 숫자를 의미합니다. 컴퓨터는 보통 8비트, 16비트, 32비트, 64비트 등의 크기로 정수를 저장합니다. 예를 들어 8비트 그릇이 표현할 수 있는 최대 숫자가 127이라고 가정해 보겠습니다. 여기에 1을 더하면 어떻게 될까요. 상식적으로는 128이 되어야 하지만, 8비트 그릇에는 이 숫자를 담을 공간이 없습니다. 그 결과 값이 뜬금없이 최솟값인 마이너스 127로 바뀌어 버리는 현상이 발생합니다. 이를 정수 오버플로우라고 부릅니다.

반대로 표현할 수 있는 최솟값보다 더 작은 숫자를 만들려고 할 때 발생하는 현상이 정수 언더플로우입니다. 마이너스 128을 담을 수 있는 그릇에서 더 아래로 내려가려고 하면 갑자기 최대값인 127로 숫자가 튀어 오르게 됩니다. 시ꠎ계 바늘이 한 바퀴 돌아서 완전히 반대 방향을 가리키는 것과 비슷한 원리입니다.

부동소수점 오버플로우와 언더플로우

실수는 소수점이 있는 숫자를 말하며, 컴퓨터에서는 이를 부동소수점 방식으로 표현합니다. 실수에서의 오버플로우는 표현 가능한 최대 범위보다 큰 숫자가 만들어질 때 발생하며, 컴퓨터는 이를 무한대라는 특별한 값으로 처리합니다.

실수에서의 언더플로우는 조금 다른 의미를 가집니다. 표현할 수 있는 최소 크기보다 0에 더 가까운 아주 미세한 소수가 만들어질 때 발생합니다. 이 경우 컴퓨터는 그 값을 정확하게 표현할 수 없기 때문에 강제로 0으로 만들어 버립니다. 과학 계산이나 금융 계산에서 이 아주 작은 오차가 누적되면 나중에 감당하기 힘들 정도로 큰 결과의 외곡을 불러올 수 있습니다.

실생활에서 마주할 수 있는 치명적인 영향들

이러한 현상들은 단순히 컴퓨터공학 전공자들만 아는 지루한 이론이 아닙니다. 실제 역사 속에서도 오버플로우와 언더플로우 때문에 거대한 프로젝트가 실패하거나 막대한 손실이 발생한 사례가 적지 않습니다.

가장 유명한 일화 중 하나는 1996년에 발사된 아리안 5호 로켓 폭발 사고입니다. 이전 모델의 소프트웨어를 그대로 재사용하는 과정에서 64비트 부동소수점 숫자를 16비트 부정수로 변환하려다 오버플로우가 발생했습니다. 이 사소한 계산 오류로 인해 로켓은 방향을 상실했고, 발사 후 수십 초 만에 공중에서 폭발하여 수백억 원의 비용이 순식간에 사라졌고 우주 개발 역사에 뼈아픈 기록을 남겼습니다.

게임 속에서도 종종 이런 현상을 발견할 수 있습니다. 과거 유명한 게임에서 플레이어의 소지금이나 아이템 개수가 시스템이 허용하는 최대치를 넘어서면서 음수로 바뀌어 버리는 버그가 있었습니다. 이로 인해 갑자기 부자가 되거나 반대로 모든 아이템이 사라지는 황당한 경험을 한 유저들이 존재했습니다.

금융 시스템이나 재고 관리 프로그램에서도 마찬가지입니다. 상품의 재고가 언더플로우로 인해 마이너스가 되었는데 시스템이 이를 인지하지 못해 무한대의 주문을 받을 수 있게 되거나, 계좌 잔액 계산 과정에서 오류가 발생해 예상치 못한 금액이 출금되는 등의 사고가 발생할 수 있습니다.

흔히 갖는 오해와 잘못된 상식

프로그래밍이나 컴퓨터 사용에 대해 잘 모르는 사람들은 종종 오버플로우에 대해 오해를 하곤 합니다. 이러한 잘못된 인식을 바로잡는 것이 안전한 소프트웨어를 이해하는 첫걸음이 됩니다.

  • 컴퓨터는 알아서 큰 숫자를 계산해 줄 것이다라는 믿음은 틀렸습니다. 컴퓨터의 메모리는 유한하며, 프로그래머가 특별한 조치를 취하지 않으면 정해진 크기를 넘는 순간 데이터는 오염됩니다.
  • 에러 메시지가 친절하게 뜰 것이라고 기대하지만, 실제로는 에러 메시지 없이 조용히 잘못된 값으로 연산이 계속 진행되는 경우가 훨씬 많아 원인 파악이 더 어렵습니다.
  • 최신 컴퓨터나 스마트폰의 성능이 워낙 좋아졌기 때문에 이런 문제는 옛날 호랑이 담배 피우던 시절의 이야기라고 생각하기 쉽지만, 데이터의 단위가 커질수록 여전히 발생할 수 있는 위험 요소입니다.

안전한 프로그램을 만들기 위한 실용적인 예방 팁

개발자나 시스템을 설계하는 사람들이 이러한 문제를 사전에 방지하고 프로그램의 안정성을 높이기 위해 실무에서 적용하는 방법들이 있습니다. 일반 사용자나 기획자들도 이러한 개념을 이해하고 있다면 시스템을 더 안전하게 설계할 수 있습니다.

  • 데이터를 담을 그릇의 크기를 정할 때 예상되는 최대값보다 훨씬 넉넉한 자료형을 선택하는 것이 좋습니다. 예를 들어 단순한 숫자에 32비트 대신 64비트 공간을 할당하면 오버플로우 발생 확률을 크게 낮출 수 있습니다.
  • 연산을 수행하기 전에 입력값의 범위를 먼저 검증하는 절차를 넣어야 합니다. 사용자가 입력한 값이나 외부에서 들어온 데이터가 허용된 범위를 벗어나는지 사전에 확인하는 방어적 프로그래밍 습관이 필요합니다.
  • 현대적인 프로그래밍 언어나 라이브러리는 오버플로우가 발생할 경우 자동으로 감지하여 예외를 발생시켜 주는 기능을 제공합니다. 이러한 기능을 적극적으로 활용하는 것이 좋습니다.
  • 큰 숫자를 다룰 때는 일반적인 정수형 대신 무한대의 자릿수를 지원하는 별도의 라이브러리나 데이터 구조를 사용하는 것이 안전합니다.

자주 묻는 질문과 답변

오버플로우가 발생하면 프로그램이 무조건 멈추나요

대부분의 경우 프로그램이 멈추지 않고 그대로 실행을 이어 나갑니다. 다만 내부적으로 계산된 값이 완전히 엉뚱한 숫자로 바뀌어 있기 때문에 이후의 모든 연산 결과가 오염되며, 이것이 더 위험한 상황을 초래합니다.

언더플로우는 마이너스 값이 되는 현상을 말하나요

많은 분들이 언더플로우를 마이너스 영역으로 내려가는 것으로 오해하지만, 정수에서의 언더플로우는 최소 범위를 넘었을 때 최대값으로 튀어 오르는 현상을 말하며, 실수에서의 언더플로우는 너무 작은 소수가 되어 0으로 수렴하는 현상을 의미합니다.

일반 사용자도 오버플로우를 겪을 수 있나요

직접 코드를 작성하지 않더라도 오래된 게임, 버그가 있는 금융 앱, 혹은 데이터가 폭증하는 엑셀 시트 등을 사용할 때 간접적으로 경험할 수 있습니다. 시스템이 갑자기 멈추거나 숫자가 이상하게 표시되는 현상의 원인이 될 수 있습니다.

이 문제를 완벽하게 해결할 수 있는 방법이 있나요

하드웨어의 물리적인 한계는 존재하기 때문에 완벽한 원천 차단보다는 예외 처리와 범위 검증을 통해 문제가 발생했을 때 즉시 감지하고 대응할 수 있는 시스템을 구축하는 것이 현실적인 최선의 방법입니다.

bizleader7
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.