지난 글에서는 문법이 잘못되었을 때 발생하는 SyntaxError에 대해 알아봤습니다.
이번에는 분명 문법은 올바른 코드인데 오류가 발생하는 경우를 알아보려고 합니다.
예시 코드부터 살펴볼까요?
# NameError
def name_error_example_1():
x = 10
print(y)
def name_error_example_2():
def inner_function():
value = 10
inner_function()
print(value)
name_error_example_1()
name_error_example_2()
오.. 여러 함수들이 보입니다. def 뒤에 ':'도 잘 작성해두었고요.
언뜻 보아서는 오류가 없는 것 같으니 한번 실행해볼까요?

처음 보는 NameError 라는 오류가 나왔습니다.
NameError라... 이름에 뭐가 문제가 있는걸까요?
오류를 상세히 알고싶으면? 맨 마지막 줄을 읽으라고 했죠.
NameError: name 'y' is not defined
이름오류 : 'y'라는 이름은 선언되지 않았습니다.
라고 적혀있네요. 어라 분명 앞에서 선언을 했었는데...

아 지금 보니 선언한 변수 이름은 x이고 뒤에선 y로 활용하고 있네요.
수정할 수 있는 두가지 방법이 있겠죠?
1. x를 y로 바꿔서 선언하기
2. y를 x로 바꿔서 활용하기
자 잘 수정한뒤에 실행을 한번 더 해봅시다.

보면 위의 함수는 잘 실행되어서 10이 잘 출력되었고
밑에는 이런.. 오류가 하나 더 있습니다.
이번에는 'value'는 선언되지 않았습니다. 혹시 'False'를 말하시는건가요?
라고 친절하게 적혀있네요.
하지만 저희는 False를 원하는 것도 아니고.. 분명히 이번에는 정확하게 value를 선언해줬습니다!
코드를 한번 다시 볼까요?
def name_error_example_2():
def inner_function():
value = 10
inner_function()
print(value)
보면 inner_function() 이라는 함수에 value = 10이 선언이 되어있고
그 밑에 inner_function() 해서 함수를 한번 실행까지 시켜주었죠.
그런데 왜 print(value)에서 오류가 생기는걸까요?
코드가 길어지고, 변수를 썼다가 없앴다가 하다보면 AI도 많이 하는 실수 중 하나입니다.
변수를 사용할 때에는 지금 사용하려는 곳의 상위에 있거나 같은 범위에 있어야 합니다.
말이 좀 어려우신가요?
더보기에서 예시를 들어서 설명해드릴테니 천천히 이해해봅시다.
물론 바로 이해가 되신분은 설명을 넘기셔도 됩니다.
a = 5
def testFunc():
b = 10
def testFunc2():
c = 20
print(a + b + c)
testFunc2()
print(a + b + c)
testFunc()
자 어려운 코드가 나왔습니다. 무려 변수가 a, b, c 3개나 있네요.
이 코드를 직접 실행해보면요
testFunc2()의 print(a + b + c)는 잘 작동하는데
testFunc의 print(a + b + c)에서 c가 오류를 일으킵니다.
이해가 되셨나요?
a는 바깥에서 선언되어 testFunc와 testFunc2가 모두 이용할 수 있습니다.
b는 testFunc에서 선언되어 동일하게 testFunc와 testFunc2가 이용할 수 있습니다.
c는 testFunc2에서 선언되어서 testFunc2만 이용할 수 있고,
testFunc 입장에서는 아니 'c'가 뭔데? 하는 상황이 발생합니다.
이처럼 변수는 어디에서 만들었는지에 따라 사용할 수 있는 범위가 다릅니다.
이 범위를 보통 스코프(scope)라고 부릅니다.
이 코드 같은경우에는 원래 사용자의 방식에 맞춰서 수정을 해야겠죠?
value라는 값이 다른 함수에서도 쓰이고 다 쓰이는 변수에요.. 하면 가장 바깥에 선언을 해주어야겠죠?
이 함수에서는 전체적으로 사용되는 값이에요 하면 name_error_example_2()함수의 처음부분에 선언을 해주어도 될 것 같구요.
하지만 제 의도는 inner_function에서 어떤 작업을 하고 그 값을 받으려는 목적이었기에 아래처럼 수정을 해보았습니다.
def name_error_example_2():
def inner_function():
value = 10
return value
value = inner_function()
print(value)
정말 멋진 코드네요.
실행해보면 이번 예시 코드에서의 오류를 모두 해결했다는 것을 알 수 있습니다.
이처럼 NameError는
변수명이나 함수명처럼 어떤 이름(name)을 사용했는데,
파이썬이 그 이름을 현재 코드 안에서 찾지 못할 때 발생하는 오류입니다.
그래서 NameError는 어디부터 확인해야되는데요?
1. 변수명이나 함수명에 오타가 없는지
2. 해당 이름을 정의했는지
3. 함수 안에서 만든 변수를 바깥에서 쓰고 있는지
4. AI가 준 코드가 앞부분을 생략하고 있지 않은지
제 경험상으로는 특히 AI와 작업을 같이 하다보면,
앞부분을 생략하거나 다른 파일에서 쓰던 변수명을 동일하게 사용하려다가 오류가 자주 발생했습니다.
또한 저는 test라는 변수명을 참 좋아하는데 항상 tset이라고 쳐서 오류가 발생하는 경우가 있습니다...
NameError는 사실 본인이 작성하는 코드에서는 오타가 아니면 잘 발생하지는 않는 오류입니다.
하지만 우리는 AI와 작업하고 있고, 내가 직접 작성하는 코드가 아니다보니 종종 마주칠때가 있는데요.
AI가 코드를 작성해주더라도, 변수와 함수가 어디에 정의가 되어있는지 직접 확인하는 습관은 에러가 아니여도 꼭 필요합니다.
왜냐하면, 변수와 함수는 프로세스가 실행되는 동안 메모리를 차지할 수 밖에 없고
모든걸 바깥에다가 선언해두면 프로그램이 실행되는 동안 계속 메모리에 저장되고 있을테니
여러분들의 기발한 프로젝트들이 너무 무거워지는 불상사가 발생할 수 있겠죠?
여러분이 모든 오류를 알아볼 수 있을때까지,
다음에도 다른 오류를 같이 읽어보고 알아보는 글을 올려보도록 하겠습니다!
'AI 코딩 > 오류 읽기 시리즈' 카테고리의 다른 글
| AI 코딩할 때 꼭 알아야 할 오류 읽는법 : IndexError (0) | 2026.04.27 |
|---|---|
| AI 코딩할 때 꼭 알아야 할 오류 읽는 법 : TypeError (0) | 2026.04.24 |
| AI 코딩할 때 꼭 알아야 할 오류 읽는 법 : ModuleNotFoundError (0) | 2026.04.24 |
| AI 코딩할 때 꼭 알아야 할 오류 읽는 법 : IndentationError (0) | 2026.04.23 |
| AI 코딩할 때 꼭 알아야 할 오류 읽는 법 : SyntaxError (0) | 2026.04.23 |