함수는 영어로 function 이라고 한다. 이쪽은 영어가 더 이해가 쉽다. function 기능이라는 뜻으로 차차 알아가겠지만 다양한 이름을 가진 녀석이다. 함수, 프로씨저, 루틴, 메소드 등등 분명 똑같은 것 같은데 용도에 따라 다른 이름으로 부른다. 파이썬도 OOP지만 대체로 함수라고 부른다.
매개변수에 인자를 넣으면 처리한 값을 리턴한다. 매개변수, 인자 처음 들어보는 말일 수도 있다. 쉽게 보면 숫자값을 넣었는데 계산해서 다시 돌려주는 것이다. 수학의 함수하고도 비슷한 맥락이라 식을 구성하면 당연히 풀수있다.
Hello World 부터 사용해온 print 함수도 처리기다. " 따옴표 안의 문자열을 넣으면 그 문자열을 화면에 출력하는 일을 한다. 이 경우 직접 돌려받는 값은 없지만 화면에 표시를 하면서 결과를 받았다고 볼 수 있다.
함수의 형식을 보자.
def add(num1,num2):
return num1+num2
print(add(5,3))
#출력값
8
함수를 설명할 때 다들 이 예제로 시작한다. 제일 설명이 쉽기 때문이다. 파이썬은 다른 언어에 비하면 문법이 매우 간결하다. 그래서 직관적이다.
함수라는 표시는 def 라는 키워드 하나가 충분하다. def 는 정의하다의 define 의 앞글자이다. 함수를 정의하는 것은 구체적인 실행 내용의 작성을 의미한다.
두개의 인자를 받는다. 인자는 함수에 넣어주는 값이다. 매개변수는 함수에서 받아서 처리할 때 인자의 값을 복사해서 쓴다. 즉 인자를 직접 쓰는 것이 아니다. 인자는 값만 전달하고 나온다. 그래서 함수에 준 인자의 값은 변하지 않는다. 매개변수를 함수 내부에서 처리해서 다시 바깥으로 결과값을 반환RETURN 하는 것이다. 그래서 리턴리턴 이라고 했었다.
반환,리턴,돌려준다,함수의 결과값... 다 똑같은 말이다.
일단 예제를 더 보자.
def sub(num1,num2):
return (num1 - num2)
a = 10
b = 3
c = sub(num1=a,num2=b)
print(c)
#결과값
7
이번엔 빼기 함수를 만들었다. 내용을 보면 쉽게 알 수 있다. 하나의 수에서 하나의 수를 빼는거다. 이제 a와 b변수들을 만들어서 sub 함수에 전달할 것이다. 이것을 함수를 호출한다고 한다. (Call) 호출한다는 것은 저기 어디에 있는 기능을 가져온다는 것이다.
이제 값을 전달하는데 예제처럼 sub 함수의 num1=a 이렇게 쓰지 않아도 된다. 보통은 sub(a,b)라고 한다. 굳이 표기한 것은 함수를 사용할 때 과정을 설명하기 위해서다. 여기서 매개변수가 num1 num2 가 되고 인자가 a 와 b 가 전달하는 실제 값이 된다.
sub는 a와 b의 메모리에 직접 접근하지 않고 복사본을 만들어서 내부 프로세스를 실행한다. num1과 num2의 처리가 끝나면 값을 돌려준다. 이 때 받는 것이 c라는 변수이다. 값을 리턴한 sub 함수는 메모리상에서 해제된다. c가 리턴값을 받아주지 않으면 그대로 사라진다.
함수를 처음 공부할 때 모든 것을 기억하지 않아도 된다. 사용법만 알아도 충분하다. 어차피 원리를 평생 모를 함수들이 많다. 함수의 목적은 잘 쓰여지기 위해서 만들어진다.
우리는 함수들을 만든 사람들의 덕택으로 살아가고 있다. 데니스 리치는 C언어와 유닉스를 개발했고 초기 C의 라이브러리 함수들을 개발했다. 심지어 자기가 개발한 C언어에 대한 책도 썼다. 그리고 2011년 잠들었다. 거인의 어깨에 서서 넓은 세상을 바라보라는 뉴턴의 말이 들리는 것 같다.
보통 void함수라고 하는데 그런 것을 파이썬에서 따로 정의하지 않은 것 같다. 아무것도 돌려주지 않는 함수들도 엄연히 존재한다.
name1 = "JONES"
def printname(name):
print(name)
printname(name1)
이 코드는 화면에 JONES라는 이름만 출력하고 종료한다. 반환값은 없지만 화면에 출력을 하는 일을 수행했다.
반대의 예도 존재한다. 매개변수는 없고 반환값만 있다.
def welcome():
print("Welcome to my show!")
return "Hello!"
c= welcome()
print(c)
아니면 둘다 없어도 된다. 함수는 자기의 일을 수행할 뿐이다.
def welcome():
print("Welcome to my show!")
welcome()
반환값이 없는데 대입을 하면? NoneType 클래스가 반환된다. NoneType은 참조가 없다는 말이다.(불형에서 거짓)
매개변수의 개수가 달라져도 작동하는 함수를 만들려면 * 연산자를 사용한다. 매개변수를 모아서 튜플로 만들어 준다. 튜플이니까 iterable 로 for문에 사용할 수 있다.
def func1(*a1):
sum = 0
for i in a1:
sum += i
print(sum)
func1(10,30,40,80,70)
func1(10,20)
func1(-10,80,-25,60)
func1(1,2,3,4,5,6,7)
#결과값
230
30
105
28
입문과정에서는 딱히 이런 함수를 작성할 일은 없을 것이다. 이런 구조가 있다는 것만 알아도 충분하다.
매일 사용하는 print 함수도 매개변수의 개수가 달라진다.
print("Hello","World")
print("Hello World")
둘다 출력이 잘된다. 매개변수를 여러개 받을 수 있기 때문임.
함수는 매우 광범위한 주제이다. 프로그래밍 교재를 몇장 읽었다고 되는 일이 아니다. 또 함수만 보는게 아니라 클래스같은 파이썬의 다른 부분들에서 어떻게 쓰이는 것인지도 공부해야한다. 다음 포스트에서는 다른 주제에 관하여 다룰 예정이다.