함수란 무엇인가?
함수는 재사용 가능한 코드 블럭입니다. 데이터(또는 arguments)를 입력받아 특정 작업을 수행한 뒤, 결과를 반환(return)합니다. 프로그래밍을 하다 보면 반복적이거나 재사용이 필요한 코드가 있을 때 이를 함수로 만들어 활용할 수 있습니다.
또한, 많은 개발자들이 이미 재사용 가능한 함수들을 만들어 놓았는데, 이를 라이브러리(library)라고 부릅니다. 우리가 필요한 기능을 구현하지 않아도, 라이브러리의 함수를 가져다 사용하면 많은 시간을 절약할 수 있습니다.
함수 정의하기
파이썬에서는 def 키워드를 사용하여 함수를 정의합니다.
기본 구조
def 함수이름(파라미터1, 파라미터2):
# 함수의 동작 정의
return 결과값
CPU에서의 함수의 작동 순서
주요 개념 설명
1. 파라미터와 아규먼트의 의미
- 파라미터(Parameter): 함수가 호출될 때 받을 데이터를 정의하는 변수입니다. 함수 내부에서 이 데이터를 사용합니다.
- 아규먼트(Argument): 실제로 함수 호출 시 전달되는 값입니다.
2. 리턴(Return)의 의미
- 함수는 return을 통해 결과값을 반환할 수 있습니다.
- 리턴이 없는 함수: return을 사용하지 않으면, 함수는 암묵적으로 None을 반환합니다.
3. 다양한 파라미터 조합 예제
파라미터가 하나인 경우:
def square(num):
return num ** 2
print(square(4)) # 출력: 16
파라미터가 두 개인 경우:
def add(a, b):
return a + b
print(add(3, 5)) # 출력: 8
리턴 값이 여러 개인 경우:
def calculate(a, b):
return a + b, a - b
result = calculate(7, 3)
print(result) # 출력: (10, 4)
리턴 값이 여러 개인 경우, 결과는 튜플(tuple)로 반환됩니다.
4. 디폴트 파라미터(Default Parameter)
함수를 정의할 때, 파라미터에 기본값을 설정할 수 있습니다. 이를 통해 함수 호출 시 일부 파라미터를 생략할 수 있습니다.
def greet(name, message="안녕하세요"):
return f"{message}, {name}!"
print(greet("철수")) # 출력: 안녕하세요, 철수!
print(greet("영희", "반가워요")) # 출력: 반가워요, 영희!
주의: 디폴트 파라미터를 사용한 경우, 함수 호출 시 순서를 바꿔 사용하려면 변수명을 명시해야 합니다.
print(greet(message="환영합니다", name="민수")) # 출력: 환영합니다, 민수!
✨ 파이썬 기본 제공 함수
파이썬은 자주 사용되는 기능들을 기본 함수로 제공합니다. 예를 들면:
- len(): 길이 반환
- max(): 최댓값 반환
- min(): 최솟값 반환
- sum(): 합 반환
numbers = [10, 20, 30]
print(len(numbers)) # 출력: 3
print(max(numbers)) # 출력: 30
print(min(numbers)) # 출력: 10
print(sum(numbers)) # 출력: 60
✨ 람다 함수 (Lambda Expressions)
람다 함수는 짧고 간단한 익명 함수입니다. lambda 키워드를 사용해 정의하며, 주로 간단한 동작을 함수로 표현할 때 사용됩니다.
# 일반 함수 정의
add = lambda x, y: x + y
print(add(3, 5)) # 출력: 8
람다 함수는 보통 한 줄로 작성되고, 간단한 작업을 빠르게 처리할 때 사용됩니다.
✨ 함수 설명 문서: Docstring
함수의 동작을 이해하기 쉽도록 설명을 추가할 수 있습니다. 이를 Docstring이라고 하며, 함수 정의 바로 아래에 삼중 따옴표(""")로 작성합니다.
def add(a, b):
"""두 수를 더하는 함수입니다."""
return a + b
print(add(2, 3)) # 출력: 5
help(Sum) 으로 주석 내용 확인 가능
✨ 가변 파라미터: *args
*를 사용하면, 함수가 가변적인 개수의 인자를 받을 수 있습니다.
def get_statistics1(*my_nums):
my_list = list(my_nums)
maxnum = max(my_list)
minnum = min(my_list)
avg = sum(my_list) / len(my_list)
return maxnum, minnum, avg, my_list
result = get_statistics1(10, 20, 30, 40)
print(result) # 출력: (40, 10, 25.0, [10, 20, 30, 40])
✨ *args 작동 방식
- *args는 입력값을 튜플 형태로 받습니다.
- 함수 정의 시 *args를 사용하면, 전달된 모든 값을 하나의 튜플로 처리합니다.
def example(*args):
print(args)
example(1, 2, 3) # 출력: (1, 2, 3)
✨ 파이썬과 자바의 메서드 정의 차이점
1. 메서드 정의 구조
- 파이썬: 파이썬은 동적 타이핑 언어로, 함수의 파라미터나 리턴 값의 데이터 타입을 명시하지 않아도 됩니다. 함수 정의가 간결하며, 데이터 타입 검사나 선언은 선택적입니다.
def greet(name):
return f"Hello, {name}!"
- 자바: 자바는 정적 타이핑 언어로, 메서드를 정의할 때 파라미터와 리턴 값의 데이터 타입을 명시해야 합니다. 메서드는 반드시 클래스 내부에 정의됩니다.
public class Main {
public static String greet(String name) {
return "Hello, " + name + "!";
}
}
2. 클래스와 메서드의 관계
- 파이썬: 함수는 클래스 내부뿐만 아니라 클래스 외부에서도 정의할 수 있습니다.
- 자바: 모든 메서드는 반드시 클래스 내부에 정의되어야 하며, 함수와 메서드는 동일한 개념으로 취급됩니다.
3. 동적 타이핑 vs 정적 타이핑
- 동적 타이핑 (Dynamic Typing): 파이썬은 변수나 함수의 데이터 타입을 실행 시점에 결정합니다. 따라서 코드가 간결하고 유연하지만, 타입 관련 오류를 실행 중에 발견할 가능성이 있습니다.
def add(a, b):
return a + b
print(add(3, 5)) # 출력: 8
print(add("hello", "world")) # 출력: helloworld
- 정적 타이핑 (Static Typing): 자바는 컴파일 시점에 변수와 함수의 타입을 검사합니다. 이는 타입 안정성을 제공하지만, 코드가 더 길고 덜 유연할 수 있습니다.
public static int add(int a, int b) {
return a + b;
}
System.out.println(add(3, 5)); // 출력: 8
// System.out.println(add("hello", "world")); // 컴파일 에러 발생