파이썬/기초 프로그래밍

()의 진짜 의미: 함수와 실행, 객체와 결과의 차이

Data Jun 2025. 6. 22. 15:59

파이썬에서 함수는 일급 객체(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() 실행 후 결과를 반환

()는 단순한 괄호가 아닙니다.

함수를 실행할지, 그냥 넘길지를 결정짓는 명확한 명령입니다.