[포스코 신재생에너지 IoT 개발자 5기] Python 11편 — 함수(상)

Doohee·2025년 11월 28일
post-thumbnail

파이썬에서 함수(Function)의 구조적 역할과 사용 방식을 기술적으로 정리한다.

함수는 프로그램을 기능 단위로 분리하고, 로직 재사용 및 유지보수성을 확보하는 핵심 요소이다.

상편에서는 함수 정의부(Definition)와 입력 구조(Parameter System)를 중심으로 설명한다.
특히 다음 요소들을 체계적으로 다룬다.

  • 함수 정의 구조(def, 본문, 반환값)

  • 매개변수(Parameter)와 인자(Argument)의 개념적 차이

  • 위치·키워드·기본값 인자 구성 방식

  • 가변 인자(*args, **kwargs)를 통한 입력 확장성

  • 매개변수 선언 순서 규칙 및 인터페이스 설계 원칙

이 상편은 이후 스코프, 전역 상태, 재귀 구조 등 함수 실행 모델을 이해하는 기반 역할을 한다.

1. 함수란 무엇인가?

1) 정의

  • 함수: 특정 작업을 수행하는 코드 블록으로, "호출할 때만 실행"된다.

  • 복잡한 코드를 기능 단위로 쪼개서

    • 이름을 붙이고

    • 입력(매개변수)을 받고

    • 출력(반환값)을 돌려주는 구조

2) 수학의 함수 VS 프로그래밍 함수

  • 수학의 함수

    • 하나의 입력 ⇒ 하나의 출력

    • y = f(x) 같은 형태

  • 프로그래밍의 함수

    • 여러 개의 입력, 여러 개의 반환값도 가능

    • 화면 출력, 파일 저장, 상태 변경과 같은 부수효과(side effect)를 포함할 수 있다.

func_1

2. 함수의 필요성

1) 코드 재사용 (재활용성)

  • 같은 작업을 여러 번 해야 할 때

    • 매번 코드를 복붙하는 대신 한 번 정의한 함수를 계속 호출
  • 수정이 필요하면 함수 정의부만 수정하면 됨

2) 가독성 향상

  • 복잡한 로직을 기능 단위로 이름 붙인 함수로 쪼개면

    • 코드의 의도가 명확해지고

    • 다른 사람이 읽고 이해하기 쉬워짐

3) 유지보수 용이성

  • 요구사항 변경 시 중복된 코드 여러 군데를 수정하는 대신 해당 기능을 담당하는 함수만 수정하면 됨

4) 프로그램의 구조화(모듈화)

  • 큰 프로그램을 여러 개의 작은 작업(함수)으로 나누어 계층적으로 설계

  • 각 함수는 하나의 "기능"만 담당하는 것이 원칙 ⇒ 단일 책임 원칙

5) 협업과 확장성

  • 팀원 간에 "이 함수는 내가, 저 함수는 네가"처럼 작업 분담이 쉬워짐

  • 작은 함수들을 쌓아서 더 큰 기능을 구성하는 계층적 설계에 유리

3. 내장 함수와 사용자 정의 함수

1) 내장 함수

  • 파이썬이 기본 제공하는 함수들

  • 언제든 바로 사용 가능

  • 예) print(), len(), type(), sum()

2) 사용자 정의 함수

  • 사용자가 직접 def 키워드로 정의하는 함수

4. 사용자 정의 함수의 기본 문법

1) 함수 정의 문법

  • def 키워드

    • "define"의 줄임말. 함수를 정의할 때 반드시 사용

func_2

  • 함수 이름

    • 함수를 구분하는 식별자

    • 파이썬에서는 일반적으로 snake_case 사용

func_3

  • 매개변수

    • 함수가 외부로부터 입력받은 값들의 이름(선택)

func_4

  • 콜론(:) & 들여쓰기

    • 콜론 뒤에 이어지는 들여쓰기 블록이 함수 본문

func_5

  • return

    • 함수의 결과 값을 반환

    • return을 만나면 함수는 즉시 종료

    • return을 쓰지 않으면 자동으로 None 반환

func_6

2) 함수 호출 문법

  • 괄호(): 함수에 전달할 값이 없더라도 실행 시 괄호 반드시 필요

  • 인자: 함수 호출 시 전달하는 값

func_7

func_8

return 이 없으므로 None 반환

func_9

⇒ 함수 사용 예시

실습1. 사칙연산 계산기 함수 만들기

문제1) 사칙연산 계산기 함수 만들기

  • 두 개의 숫자와 연산자를 받아 해당 연산 결과를 반환하는 함수를 작성하세요.

  • 함수 이름은 calculate로 합니다.

  • 매개변수는 num1, num2, operator 세 개입니다.

  • operator는 문자열이며, 다음 중 하나 입니다.: "+", "-", "×", "÷"

  • 올바르지 않은 연산자가 들어오면 "지원하지 않는 연산입니다."라는 문자열을 반환하세요.

5. 매개변수와 인자

용어 정리

  • 매개변수(Parameter): 함수 정의부에서 사용하는 이름

  • 인자(Argument): 함수 호출 시 실제로 전달되는 값

func_11

6. 인자의 종류: 위치 / 키워드 / 기본값

1) 위치 인자

  • 전달된 순서대로 매개변수에 대응되는 방식

  • 가장 일반적인 전달 방식

  • 매개변수 개수와 인자 개수가 다르면 TypeError 발생

func_12

2) 키워드 인자

  • 인자의 이름을 명시하여 전달하는 방식

  • 순서와 상관없이 대응 가능, 순서를 헷갈릴 때 안전

func_13

3) 기본값 인자

  • 함수 정의 시 매개변수에 기본값을 지정해 두는 방식

  • 호출 시 해당 인자를 생략하면 기본값 사용

  • 기본값 매개변수는 반드시 뒤쪽에 위치해야 함

func_14

7. 가변인자 *args / **kwargs

1) 위치 가변 인자 - *args

  • 여러 개의 위치 인자를 하나의 튜플로 받는 방식

  • 함수 정의 시 관례적으로 이름을 *args 로 씀

func_15

2) 키워드 가변 인자 - **kwargs

  • 여러 개의 키워드 인자딕셔너리 형태로 받는 방식

  • 함수 정의 시 관례적으로 이름을 **kwargs 로 씀

func_16

3) 정의 순서 규칙

함수 정의 시 매개변수는 다음 순서를 지켜야 한다.

  1. 위치 매개변수

  2. 기본값 매개변수

  3. *args

  4. **kwargs

func_17

8. 매개변수 전달 방식

파이썬은 전통적인 Call by Value 또는 Call by Reference와 동일하지 않으며,
객체의 참조(reference)를 전달하는 모델(Call by Object Reference)을 사용한다.

immutable VS mutable

  • 변경 불가능(immutable) 객체

    • int, float, str , tuple

    • 함수 안에서 값을 "변경"하려고 하면 새 객체가 만들어짐

  • 변경 가능(mutable) 객체

    • list, dict, set

    • 함수 안에서 내용을 변경하면 함수 바깥에도 영향

func_18

실습2. 가변인자 연습하기

문제1) 숫자 여러 개의 평균 구하기

  • 숫자를 몇 개든 받을 수 있는 average() 함수를 만들어보세요.

✔ 출력 결과 (예시)

2.5

문제2) 가장 긴 문자열 찾기

  • 여러 개의 문자열을 받아, 가장 긴 문자열을 반환하는 함수를 만들어보세요.

✔ 출력 결과 (예시)

watermelon

문제3) 사용자 정보 출력 함수

  • 사용자의 이름, 나이, 이메일 등의 정보를 받아 출력하는 함수를 **kwargs로 구현하세요.

  • 정보가 몇 개 들어오든 모두 출력해야 합니다.

✔ 출력 결과 (예시)

name: wdh
age: 23
email: wdh@example.com

문제4) 할인 계산기

상품 가격 목록을 **kwargs로 받아 각각 10%씩 할인된 가격을 출력하는 함수를 작성하세요.

✔ 출력 결과 (예시)

상품명: bag 원가: 50000 할인가: 45000
상품명: shoes 원가: 100000 할인가: 90000
상품명: dress 원가: 120000 할인가: 108000

9. 실무 예시

예제1) 센서 데이터 평균 계산 함수 (가변 인자 *args 활용)

  • 실제 에너지 / 환경 데이터에서 여러 측정 구간의 평균을 동시에 계산할 때 사용되는 형태

✔ 요점

  • 입력 구간 수가 정해져 있지 않을 때 *args 가 매우 유용하다.

  • 상편에서 배운 "가변 인자로 입력 확장성 확보" 개념의 실전 적용

예제2) 설정값 병합기

  • 설비 설정, IoT 디바이스 정보, 환경 파라미터 등을 딕셔너리 형태로 관리할 때 사용하는 패턴

✔ 요점

  • mutable 객체를 다룰 때는 .copy()로 원본 보호

  • 입력 확장이 자연스럽고, 실무에서 실제로 많이 쓰는 구조

예제3) 리스트 기반 데이터 필터링

  • 입력 값에 따라 원본 데이터가 변할 수 있다는 점을 보여주는 예

✔ 요점

  • list는 mutable이라 함수 내부 변경이 외부에도 반영된다.

  • 상편 마지막 학습 범위인 mutable / immutable 전달 방식과 정확히 맞물림.

10. 함수(상) 한눈에 보기

  • 함수 정의 구조: def 키워드, 매개변수 목록, 들여쓰기 블록, 선택적 return

  • 반환값(Return): return 지정 시 결과 반환, 없으면 None 자동 반환

  • 매개변수(Parameter) VS 인자(Argument)

    • 매개변수: 함수 정의부에서 사용되는 이름

    • 인자: 함수 호출 시 전달되는 실제 값

  • 위치 인자(Positional Argument): 인자 순서가 매개변수 순서와 1:1 대응됨

  • 키워드 인자(Keyword Argument): 매개변수 이름을 명시하여 전달, 순서와 무관

  • 기본값 인자(Default Argument): 기본값은 뒤쪽 매개변수부터 설정 가능, 호출 시 생략 가능

  • 가변 인자 (*args): 여러 개의 위치 인자를 튜플 형태로 수신

  • 가변 키워드 인자 (**kwargs): 여러 개의 키워드 인자를 딕셔너리로 수신

  • 매개변수 선언 순서 규칙: 위치 인자 → 기본값 인자 → *args → **kwargs

  • mutable/immutable 전달 특성

    • immutable(int, str, tuple) → 함수 내부 변경이 원본에 영향 없음

    • mutable(list, dict, set) → 함수 내부 변경이 원본에도 반영됨

11. 아웃트로

상편에서는 함수 정의 구조, 다양한 형태의 매개변수 구성,
가변 인자를 통한 입력 확장 방식, mutable/immutable 기반 전달 방식까지 정리했다.
즉, 함수의 입력 구조를 설계하는 데 필요한 핵심 요소들을 체계적으로 정리한 것이다.

이 단계에서 함수 호출 시의 입력 흐름과 데이터 변경 가능성을 이해하면 이후에 이어지는 스코프 탐색 규칙, 전역 상태 관리, 재귀 호출, 람다 함수 등 함수 실행 환경과 관련된 심화 개념을 보다 명확하게 이해할 수 있다.

하편에서는 함수 호출 시 이름이 어떻게 탐색되고, 전역/지역 상태가 어떻게 관리되며, 재귀 호출과 람다 함수가 어떤 구조로 동작하는지 구체적으로 분석한다.

profile
에너지 기획 전문가로 성장하고자 합니다.

0개의 댓글