# 함수

 

1. 함수의 정의

 

파이썬에서의 함수에 대해 알아보기 전에, 어디선가 함수란 말을 들은 기억이 있지 않나요? 학교 수학시간에 나온 함수는, 우리가 배울 프로그래밍 언어의 함수와 비슷합니다. x의 값에 따라서 y의 값이 정해지듯이 프로그래밍 언어의 함수 역시도 값을 함수에 집어넣으면, 함수는 결과값을 되돌려줍니다. 즉 함수란, 특정한 기능을 수행하는 코드의 집합입니다.

프로그래밍 언어에서의 함수란 이름이 주어진 특정 순서로 실행되는 문장의 연속입니다. 호출된 순간부터 정해진 로직을 실행하죠. 따라서 우리는 적용 할 각 로직에 대해 코드를 반복해서 작성할 필요가 없습니다. 이를 코드 재사용 가능성이라고합니다. 함수는 가독성을 높여주고 코드를 재사용하여 프로그래밍 작성에 좋은 효율을 가져다 줍니다.

 

파이썬 함수 

 


 

2. 사용자 정의 함수

 

파이썬에서 사용자 정의 함수를 만드는 방법은 다음과 같습니다..

def add(num1,num2):
	reslut = num1+num2
    return result

print(add(1,2))

# 결과 값
3

먼저 함수 정의를 위해서는 def라는 키워드를 사용합니다.. 그 다음에 함수를 호출하기 위한 이름을 적고 함수에서 계산을 위해 전달할 인자 값을 넣습니다.. 함수의 이름은 변수명과 같이 함수의 기능을 간단하게 설명하는 이름이면 좋습니다. return은 반환 한다는 의미를 지니고 있습니다. 그래서 return을 만나면 함수는 종료되고 return값을 함수를 호출한 곳으로 전달합니다. 위의 코드에서는 return된 result의 값이 print문의 인자로써 사용되는 것입니다.

 

만약 위 코드에서 return문이 존재하지 않는다면 어떻게 될까요? return을 지우고 함수를 실행시켜 보면 알 수 있듯이 아무일도 일어 나지 않습니다. 함수안에서 정의하는 변수는 지역변수로서 메인 name space에 아무런 영향을 미치지 못합니다. 즉 함수안에서 정의 되었다가, 함수가 끝날 때 메모리에서 해제되어 사라지는 변수입니다. 고로 함수안에서 연산한 결과를 메인함수에서 사용하고 싶을 때에는 반드시 return 해당 값을 해줘야 합니다.

 

def add(num1,num2):
    print(num1+num2)

add(1,2)

#결과값
3

 

위 코드는 return 문 없이 정의한 함수입니다. 이렇게 리턴문이 없는 함수를 우리는 프로시져라고 부릅니다. 이러한 프로시져들은 명령문을 순차적으로 실행하여 마지막 명령문에 도달하였을 때 자동적으로 종료됩니다. 인자값을 받아 함수안에서만 처리하는 것이 목적이라면 위의 소스코드처럼 굳이 return을 해주지 않아도 상관없습니다. 굳이 return하는 데이터 없이 정의하며, 그런 경우에만 특수하게 사용하시면 됩니다.

 


3. 변수의 유효범위

 

함수의 정의방법에서 잠깐 언급했듯이 프로그래밍 언어의 변수에는 종류가 있습니다. 각각의 함수는 별도의 name space를 갖고 있기 때문에 함수 안에서 변수를 선언하게 되면 그 변수는 그 함수의 name space에 생성됩니다.

파이썬에서 name space 규칙은 총 3가지가 있으며 각각을 지역(local), 전역(global), 내장(Built-in)이라고 합니다. 지역변수는 특정 name space에 생성되는 변수이고, 전역변수는 어떠한 name space에서도 접근할 수 있는 변수이며, 내장변수는 파이썬자체에 내장되어있는 변수입니다. 함수안에서 선언되는 변수는 전부 지역변수로 볼 수 있고 함수 바깥 즉, 전역 name space에서 선언된 변수는 전역변수라고 볼 수 있습니다. 다음 예제를 통하여 변수의 유효범위를 알아보도록 하겠습니다.

 

num = 10 # 전역변수 num선언

def printNum():
    print(num) # 전역변수 출력

printNum()

#결과값
10

 

전역변수 num을 선언하고 10으로 초기화 한 후, printNum이라는 함수를 만들어 함수 내부에서 num을 출력하게 끔 해보았습니다. printNum을 실행하였을때 10라는 값이 정확하게 나오는 것을보아 위 설명 그대로 전역변수는 말그대로 전역에서 사용할 수 있습니다. 전역에서 사용할 수 있고 특정 구문(global)이 아니면 변경불가한 특징으로 인하여 상수를 저장할 때 사용합니다.
예를 들어 원주율을 구하는 스크립트가 있을 때 원의 반지름은 유동적일 수 있지만 파이값은 고정적이어야 합니다. 이런 경우에 전역변수 pi를 선언하여 3.14로 초기화 하면 변경 가능성을 미연에 방지할 수 있습니다.

 

num = 10 # 전역변수 num선언
def variable(num):
    num = 20 # 지역변수 num선언

valriable(num)
print(num)

#결과값
10

 

전역 변수 num을 선언하여 값을 10으로 초기화 합니다. 그 후 함수 variable을 정의하여 그 안에 인자값을 20으로 변경해주는 코드를 작성합니다. 그리고 variable을 실행하고 num을 출력시켜보니 값이 그대로 10인것을 확인 할 수 있습니다. 지역변수는 그 변수가 정의된 함수 안에서만 읽을 수 있습니다.
그런데 스크립트 작성자의 의도는 전역변수 num의 값을 수정하는 것이었을지 모릅니다. 이런경우에

만약 전역변수의 값을 변경하고 싶을때에는 global문을 사용하면 손쉽게 변경할 수 있습니다. global 문을 사용했다면 값이 진짜 변경 되는지 한번 확인해 봅시다.

 

num = 10

def variable():
    global num # global문의 사용
    num = num * 100

variable()
print(num)

#결과값
1000

 

저희의 예상 대로 global문을 사용했을 때에는 값이 바뀌었습니다. global 문은 변수가 이미 전역공간에 선언되어 있을경우에 지역공간에서 global <변수이름>의 구조로 사용합니다. 꽤나 편리한 기능인 것 같지만 전역변수를 너무 많이 사용하게되면 스크립트가 복잡해지므로 최소한의 사용만을 지향합시다.

+ Recent posts