Menu
Coddy logo textTech

논리 오류란 무엇인가요?

논리 오류(logic error)는 프로그램의 추론이 잘못되어, 비정상 종료나 오류 메시지 없이 틀린 결과를 내는 실수입니다. 코드는 올바르고 모든 줄이 실행되지만, 프로그래머가 의도한 대로 동작하지 않습니다.

글쓴이: Kevin Spektor, 공동 창업자, CTO

업데이트: 2026년 9월 24일

시험 점수 80, 90, 100의 평균은 90이에요. 이 프로그램은 아무 불평 없이 실행되고 다른 값을 출력해요.

Average: 203.33333333333334

Python은 그 줄에 적힌 그대로 했어요. 나눗셈이 덧셈보다 먼저 계산되므로 마지막 점수만 3으로 나뉘었고, 결과는 80 + 90 + 33.33이에요. 프로그래머가 의도한 것은 (scores[0] + scores[1] + scores[2]) / 3이었어요. 괄호를 넣으면 프로그램은 Average: 90.0을 출력해요.

왜 오류 메시지가 나오지 않나요

컴퓨터는 코드가 올바른 형식인지는 검사하지만, 코드가 맞는지는 검사하지 않아요. 파서는 문법을 검사해서 구문 오류를 잡아요. 런타임은 각 연산을 검사해서 0으로 나누기 같은 런타임 오류를 잡아요. 숫자 세 개를 더하고 그중 하나를 3으로 나누는 것은 올바른 문법이고 허용되는 연산이므로, 두 검사를 모두 통과해요.

프로그램이 평균을 계산해야 한다는 것은 프로그램을 작성한 사람만 알아요. 그 의도는 코드 어디에도 없으므로, 어떤 도구도 결과를 의도와 비교할 수 없어요. 논리 오류는 여러분이 컴퓨터에게 시킨 일과 여러분이 원한 일 사이의 틈이에요.

논리 오류의 흔한 원인

대부분의 논리 오류는 몇 가지 패턴에서 나와요.

  • 하나 차이 오류(off-by-one). 반복문이 한 번 더 돌거나 한 번 덜 돌아요. 끝 값은 포함되지 않으므로 range(1, 5)는 1, 2, 3, 4를 만들어요. 반복(이터레이션)을 참고하세요.
  • 연산자 우선순위. 위의 평균 예제처럼 a + b / 2는 b만 나눠요.
  • 잘못된 비교. <=가 필요한 곳에 <를, or가 필요한 곳에 and를 쓴 경우예요. 조건은 불리언 식이라서 연산자 하나만 틀려도 어떤 입력에서는 결과가 뒤집혀요.
  • 잘못된 순서의 조건. if와 elif 연쇄에서는 처음으로 참이 된 조건이 선택되므로, 넓은 조건을 먼저 두면 그 아래의 좁은 조건들이 가려져요.
  • 잘못된 변수. 반복문 안에서 total을 갱신하고 subtotal을 출력하는 경우예요.
  • 숫자에 대한 가정. 부동소수점 수는 근삿값이기 때문에 Python, Java, JavaScript에서 0.1 + 0.2 == 0.3은 False예요. 7 // 2는 3.5가 아니라 3이에요.

다음은 조건 순서 실수예요. 95점은 A여야 해요.

D
D
F

95는 60 이상이므로 첫 번째 분기가 선택되고 elif에는 절대 도달하지 않아요. 가장 높은 기준을 먼저 두면 모든 결과가 올바르게 나와요.

프로그래밍 오류의 종류

프로그래밍 오류는 보통 언제 나타나고 무엇이 보고하느냐에 따라 세 종류로 나눠요.

구문 오류런타임 오류논리 오류
나타나는 시점프로그램 실행 전실행 중실행 중, 또는 끝내 발견되지 않음
감지하는 것파서 또는 컴파일러런타임 또는 운영체제사람 또는 테스트
프로그램이 실행되나요?아니요실패하는 줄까지네, 끝까지
오류 메시지있음, 줄 번호 포함있음, 트레이스백 포함없음
Python 예시콜론이 없는 if x > 310 / 0평균을 구하려는 a + b / 2
찾는 방법메시지 읽기트레이스백 읽기알고 있는 답과 출력 비교

교재에 따라 더 많은 종류를 나열하기도 하지만, 대부분은 이 세 가지 안에 들어가요. incompatible types: String cannot be converted to int처럼 Java 컴파일러가 거부하는 타입 오류는 구문 오류처럼 컴파일 타임에 발견되며, 어떤 책에서는 이를 의미 오류(semantic error)라고 불러요. 링커 오류는 C나 C++ 프로그램을 빌드하는 마지막 단계에서, 함수가 선언되었지만 그 코드를 어디에서도 찾을 수 없을 때 일어나요. 0으로 나누기, 메모리 부족, 없는 파일 열기 같은 산술, 자원, 파일 오류는 모두 런타임 오류예요. "의미 오류"라는 말을 논리 오류의 다른 이름으로 쓰는 강좌도 있으니, 교재가 어떤 뜻으로 쓰는지 확인하세요.

논리 오류 찾는 방법

  1. 이미 아는 답으로 테스트하세요. 작은 입력에 대해 올바른 결과를 손으로 계산한 다음 비교해요. 점수 세 개가 삼천 개보다 확인하기 쉬워요.
  2. 중간 값을 출력하세요. score와 선택된 분기를 출력하거나, 반복할 때마다 반복 카운터를 출력하면 현실이 계획에서 벗어나는 정확한 단계가 보예요.
  3. 디버거로 한 줄씩 실행하세요. 중단점을 걸고 한 줄씩 실행하면 코드를 고치지 않고도 같은 효과를 얻어요.
  4. 경계를 테스트하세요. 0, 1, 가장 큰 값, 빈 리스트, 정확한 기준값(성적 예제에서는 60과 90)을 넣어 보세요.
  5. 코드를 소리 내어 설명하세요. 다른 사람이나 고무 오리에게 각 줄을 설명하다 보면, 그 줄이 한다고 가정한 일이 아니라 실제로 하는 일을 말하게 돼요.

assert는 이미 아는 답을 자동 검사로 바꿔요. 조건이 참이면 아무것도 하지 않고, 거짓이면 프로그램을 멈춰요.

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    assert grade(95) == "A", "95 should be an A"
           ^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A

실패하는 테스트는 조용한 논리 오류를 줄 번호가 있는 요란한 오류로 바꿔요. 이것이 단위 테스트의 핵심 아이디어예요.

다른 언어의 논리 오류

패턴은 어디서나 같지만 언어마다 고유한 함정이 있어요. JavaScript에서 "5" + 3은 문자열 "53"이고 "5" - 3은 숫자 2이므로, 폼에서 텍스트로 읽은 값은 아무 오류 없이 잘못 더해질 수 있어요. C에서 if (x = 5)는 x에 5를 대입하고 항상 참이 돼요. Clang은 기본으로 이에 대해 경고하지만(using the result of an assignment as a condition without parentheses), 여전히 컴파일되고 실행되므로 컴파일러 경고를 오류만큼 진지하게 읽으세요.

다음 단계

이 페이지를 구문 오류, 런타임 오류 페이지와 비교하며 각 종류가 어떻게 보고되는지 살펴보세요. 하나 차이 오류는 반복문에서 생기므로 반복(이터레이션) 페이지와 Python for 반복문 가이드를 이어서 읽으면 좋아요. 실제 연습 문제에서 틀린 결과를 찾는 연습을 하려면 Python 강좌를 해 보세요.

자주 묻는 질문

구문 오류와 논리 오류의 차이는 무엇인가요?
구문 오류는 언어의 문법을 어긴 것이라서 프로그램이 실행되기 전에 거부되고, 줄 번호가 담긴 메시지가 나와요. 논리 오류는 문법을 완벽하게 지키고 끝까지 실행되지만 결과가 틀리며, 메시지가 전혀 없어요. 구문 오류는 메시지를 읽어서 찾고, 논리 오류는 출력을 테스트해서 찾아요.
Python에서 논리 오류란 무엇인가요?
트레이스백 없이 실행되지만 틀린 답을 내는 Python 코드예요. 1부터 5까지 포함하려고 했는데 range(1, 5)를 쓴 경우, (a + b) / 2를 의도했는데 a + b / 2를 쓴 경우, if 분기를 잘못된 순서로 검사한 경우가 대표적이에요. Python은 여러분이 무엇을 의도했는지 알 방법이 없으므로 이런 오류를 감지할 수 없어요.
프로그래밍 오류 5가지 종류는 무엇인가요?
흔히 드는 다섯 가지는 구문 오류, 의미(타입) 오류, 링커 오류, 런타임 오류, 논리 오류예요. 앞의 세 가지는 프로그램을 빌드하는 동안 발견되고, 런타임 오류는 실행 중에 나타나며, 논리 오류는 틀린 결과로만 드러나요. 많은 강좌에서는 구문, 런타임, 논리 세 가지만 가르쳐요.
논리 오류도 버그인가요?
네. 버그는 프로그램이 의도와 다르게 동작하게 만드는 모든 결함이고, 논리 오류는 그중 가장 흔한 종류예요. 비정상 종료와 오류 메시지도 버그지만 스스로 존재를 알리는 반면, 논리 오류는 사람이나 테스트가 알아채야 해요.
논리 오류는 왜 찾기 어려운가요?
아무것도 그 위치를 가리키지 않기 때문이에요. 줄 번호도 메시지도 없고, 틀린 결과가 그럴듯해 보일 수도 있어요. 시험 점수 세 개의 평균이 203인데 아무도 다시 확인하지 않는 경우처럼요. 이미 알고 있는 답과 출력을 비교해야 찾을 수 있으며, 그래서 결과를 아는 테스트가 중요해요.
Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기