파이썬에서 함수는 일급 객체(First-Class Object)입니다.
이 말은 함수도 변수에 담을 수 있고, 인자로 전달하거나 반환할 수 있는 값이라는 뜻입니다.
하지만 초보자들이 자주 헷갈리는 지점이 있습니다.
바로 함수 이름 뒤에 괄호 ()를 붙이느냐, 안 붙이느냐에 따른 의미의 차이입니다
1. 함수와 함수 호출의 차이
먼저 이 두 코드를 비교해보세요:
def say_hello():
return "Hello!"
# 1
print(say_hello) # 함수 객체 자체를 출력
# 2
print(say_hello()) # 함수 실행 결과 출력
결과
- say_hello → <function say_hello at 0x...>
- 이건 함수 객체 자체를 가리킵니다. 아직 실행된 적 없음.
- say_hello() → "Hello!"
- 이건 함수를 즉시 실행하고 그 결과값을 리턴합니다.
2. ()는 “이 함수 지금 실행해!” 라는 명령어
| 표현 | 의미 |
| func | 함수 객체 그 자체 |
| func() | 함수 실행, 결과값 반환 |
| f = func | 함수를 f에 저장 |
| f = func() | 함수 실행 후 그 결과를 f에 저장 |
❌ 잘못된 호출
def run():
print("Running!")
# ❌ 이렇게 쓰면 실행돼버림
result = run()
# ✅ 실행하지 않고 참조만
result = run
→ run()을 써버리면, 즉시 실행되고 None이 저장됩니다.
→ run만 쓰면 함수 객체가 저장되어 나중에 실행할 수 있어요.
3. 콜백 함수 전달 시
def call_func(f):
print("Before call")
f()
print("After call")
def hello():
print("Hello")
call_func(hello) # ✅ 함수 객체 전달
# call_func(hello()) ❌ → hello가 즉시 실행됨
→ hello()를 넘기면 그 자리에서 실행되고 결과값만 남습니다.
→ hello를 넘겨야 call_func가 직접 실행할 수 있어요.
4. 데코레이터에서
def decorator(func):
def wrapper():
print("Before")
func()
print("After")
return wrapper
@decorator
def greet():
print("Hi!")
greet() # 실행 시 wrapper가 작동함
→ @decorator는 greet = decorator(greet)과 동일합니다.
→ decorator()는 즉시 실행하지 않고, wrapper 함수를 객체로 리턴해야 하므로 ()를 붙이지 않습니다.
5. 메타포 (비유)
- func는 레시피입니다. (설명서)
- func()는 요리한 결과물입니다.
레시피를 들고 있을 순 있지만, 요리를 하려면 ()를 붙여야 합니다.
정리하면
| 표현 | 의미 |
| func | 함수 객체 (실행 안됨) |
| func() | 함수 실행 (결과값 반환) |
| return func | 함수 전달 (실행 안됨) |
| return func() | 실행 후 결과를 반환 |
()는 단순한 괄호가 아닙니다.
함수를 실행할지, 그냥 넘길지를 결정짓는 명확한 명령입니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 데이터 모델링: 매직 메서드로 객체를 데이터처럼 다루기 (0) | 2025.09.06 |
|---|---|
| 파이썬에서 *args와 시퀀스 언패킹의 차이 이해하기 (0) | 2025.09.06 |
| 파이썬 클로저(Closure): 변수와 스코프 개념 정리 (0) | 2025.06.22 |
| 래퍼(Wrapper)와 데코레이터(Decorator): 파이썬 함수 확장의 핵심 (0) | 2025.06.22 |
| 기능을 코드로 추상화 개념 (0) | 2025.06.22 |