[학습 일기 #11] 코드를 정리하는 첫 도구: 함수(Function)

Ariel_Jeong·2025년 12월 19일

[학습 일기 시리즈]

목록 보기
11/44
post-thumbnail

지금까지 하나씩 배워오면서,
점점 코드를 ‘작성하는 것’보다 ‘정리하는 것’이 더 중요해진다는 느낌을 받았다.

액션에 이름을 붙이고 그 이름을 사용하면, 간편하게 정해진 액션대로 출력되도록 할 순 없을까?

이럴 때 필요한 개념이 바로 함수(Function)다.
오늘은 함수를 통해 코드를 의미 단위로 묶고, 연습하는 시간을 가지려 한다.


1. 함수(Function)란? ⚙️

함수는 자주 사용하는 코드 묶음에 이름을 붙여두고, 필요할 때마다 호출해서 쓰는 것이다.

쉽게 말해,

“이 작업은 이런 이름으로 불러서 쓰자”

라고 약속해두는 개념이다.



cf) 함수가 왜 필요할까? 🧐

예를 들어, 인사 메시지를 여러 번 출력해야 한다고 가정해보자.

print("안녕하세요!")
print("안녕하세요!")
print("안녕하세요!")

지금은 간단하지만,
내용이 길어진다거나 이 코드가 10번, 100번 필요해진다면 어떨까?

이럴 때 함수를 사용하면 아래와 같이 바꿀 수 있다.

def say_hello():
    print("안녕하세요!")
    
say_hello()
say_hello()
say_hello()

같은 코드를 반복해서 작성하지 않아도 되고
코드의 의도가 훨씬 명확해진다

say_hello()라는 이름만 봐도
“아, 인사하는 코드구나” 하고 바로 이해할 수 있다.




2. 함수의 기본 구조 🏗️

def 함수 이름():
    실행할 코드 블록
  • def : 함수를 정의한다는 뜻
  • 함수 이름 : 내가 붙인 약속 이름
  • () : 함수임을 나타냄
  • : 이후는 반드시 들여쓰기



2.1. 매개변수(Parameter)와 인자(Argument)

함수는 매개변수(parameter)를 통해 외부에서 값을 전달받아
그 값에 따라 다르게 동작하도록 만들 수 있다.

예를 들어,

def greet(name):
    print(f"안녕하세요, {name}님!")

여기서 name은 함수가 값을 전달받기 위해 준비해둔 '매개변수'이다.
그 결과,

greet("Ariel") # 결과: 안녕하세요, Ariel님!
greet("Python") # 결과: 안녕하세요, Python님!

이 때 함수를 호출하기 위해 전달하는 "Ariel", "Python"과 같은 실제 값은
'인자'라고 부른다.

이와 같이, 함수 이름과 구조는 같지만
어떤 인자를 전달하느냐에 따라 결과가 달라질 수 있다.



중요한 포인트1 : 정의와 실행은 다르다 📌

함수는 정의만 해서는 아무 일도 일어나지 않는다.

def say_hello():
    print("안녕하세요!")

이 상태에서는 아직 실행되지 않는다.
반드시 함수 이름 뒤에 ()를 붙여 호출(call) 해야 실제로 실행된다.

say_hello() # 이 줄에서 실행

이렇듯, 미리 설계해두고 필요할 때 꺼내 쓰는 구조가 '함수'이다.



중요한 포인트2 : 출력과 결과 반환은 다르다 📌

출력(print)과 결과 반환(return)은 다르다
핵심만 먼저 말하자면,

print는 결과를 보여주기 위한 도구이고,
return은 결과를 다음 코드에서 사용하기 위한 도구이다.
따라서 함수의 목적이 무엇이냐에 따라 다르게 선택해야 한다.

🔹 print

  • 역할: 사람에게 보여주기
  • 결과: 화면에 글자만 출력
  • 함수 바깥으로 아무 값도 전달하지 않음
  • 화면에 글자를 출력하고 결과는 사라지기 때문에 재사용 불가.

🔹 return

  • 역할: 결과를 밖으로 돌려주기
  • 결과: 값을 함수 호출 위치로 반환
  • 다른 코드에서 계속 활용 가능




3. 함수의 종류

3.1. 내장 함수

파이썬에서 이미 구현된 함수로써 자세한 사항은 아래 링크를 참고한다.
간략한 예시로는 아래 함수들이 있다.

  • abs(): 절댓값 반환
print(abs(-3)) # 결과: 3
  • len(): 길이 반환
print(len("hello")) # 결과: 5
  • str(): 문자열 반환
print(str(123)) # 결과: "123"



3.2. 사용자 정의 함수

위의 함수의 기본 구조에서 설명한 형태의 사용자가 직접 정의한 함수.



3.3. 람다 함수

익명 함수(이름이 없는 함수)를 만들 때 사용.
lambda와 인자, 함수 본문을 이용하여 정의한다.

주로 간단한 계산이나 일회성 로직을 위해 사용되며
특히, 함수를 매개변수로 전달하는 경우에 유용하다.

# 사용자 정의 함수
def add(a, b):
    return a + b
    
# 위의 함수를 람다 함수로 바꿔서 표현하면
add = lambda a, b: a + b

print(add(3, 4)) # 결과: 7
  • lambda: 익명 함수 만들거임
  • a, b: 매개변수
  • :: 여기서부터 함수의 내용
  • a + b: return값

👉 람다 함수는 return을 쓰지 않으며, 콜론 뒤 표현식 자체가 곧 return 값이다.




4. 인자 전달 방법

4.1. 위치 인자(Positional Arguments)

인자의 순서에 따라 매개변수에 할당되는 인자.

def add(a, b):
    return a + b
    
result = add(3, 5)
    print(result) # 결과: 8

위의 경우,
위치에 따라 a에는 3이, b에는 5가 할당된다.



4.2. 기본값 인자(Default Arguments)

함수를 정의할 때 미리 매개변수에 정의해둔 값으로
함수 호출 시 인자를 전달하지 않으면 기본값이 사용된다.
이 때 기본값 인자는 매개변수 = 기본값의 형태로 지정하며,
이는 반드시 위치 인자 뒤에 정의되어야 한다.

def greeting(name, message="어서오세요"):
    print(f"{message}, {name}님!")
    
greeting("홍길동", "환영합니다") # 결과: 환영합니다, 홍길동님!
greeting("홍길동") # 결과: 어서오세요, 홍길동님!



4.3. 키워드 인자(Keyword Arguments)

인자를 이름과 함께 지정하여 순서가 상관 없는 인자.
코드의 가독성을 높이고, 유지 보수를 용이하게 해줄 수 있다.

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")
    
greet(greeting="Hi", name="Ariel") # 결과: Hi, Ariel!



4.4. 가변 인자(Variable Arguments)

임의의 개수의 인자를 받을 수 있게 해주는 기능.
가변 인자는 매개변수 앞에 *를 붙여 정의하며, 함수 내부에서는 튜플로 처리된다.

일반 매개변수와 함께 사용할 경우에는 일반 매개변수 뒤에 정의되어야 한다.

def sum_numbers(*args):     # ()안의 값들이 튜플로 만들어짐
    total = 0     # 합계는 0부터 시작
    for number in args:    # 튜플 안에 있는 값들을 하나씩 꺼내 사용
        total += number    # 앞 순서의 합계 값에 다음 숫자를 더함
    return total
    
result = sum_numbers(1, 2, 3, 4, 5)
print(result) # 결과: 15



4.5. 키워드 가변 인자(Keyword Variable Arguments)

임의의 개수의 키워드 인자를 받을 수 있는 기능.
매개변수 앞에 **를 붙여 정의하며, 함수 내부에서는 딕셔너리로 처리된다.

일반 매개변수 및 가변 인자와 함께 사용 시
일반 매개변수, 가변 인자, 키워드 가변 인자 순으로 정의되어야 한다.

def print_info(**kwargs):    # ()안의 값들이 딕셔너리로 만들어짐
    for key, value in kwargs.items():    # 키와 값을 둘 다 사용. kwargs만 적으면 키 값만 호출되어 에러 발생
        print(f"{key}: {value}")
        
print_info(name="홍길동", age=30, city="서울")

# 결과
name: 홍길동
age: 30
city: 서울




5. 지금까지 배운 문법과의 연결

함수는 지금까지 배운 모든 개념을 담을 수 있다.
예를 들어,

def check_bloodsugar(have_meal, blood_glucose_level):
    if (not have_meal) and (blood_glucose_level < 100):
        return("정상입니다.")
    elif (have_meal) and (blood_glucose_level < 140):
        return("정상입니다.")
    elif (not have_meal) and (100 <= blood_glucose_level <= 125):
        return("공복혈당장애(당뇨 전 단계)입니다.")
    elif (have_meal) and (blood_glucose_level >= 200):
        return("위험합니다.")
    elif (not have_meal) and (blood_glucose_level >= 126):
        return("위험합니다.")

if result == "공복혈당장애(당뇨 전 단계)입니다.":
    print("생활습관 개선 필요")
    
result = check_bloodsugar(False, 110)    # 결과: 생활습관 개선 필요     

이 순간부터 코드는 본격적으로 “설계된 구조”가 되기 시작한다.
이렇듯 함수를 사용하면 보다 효율적이고 깔끔하게 코드를 짤 수 있다.




[참고한 사이트 목록]

profile
R&D 분야의 경험을 토대로 커리어 확장에 도전중인 개발꿈나무입니다.

0개의 댓글