함수의 필요성 (추가 예정)사실 함수의 필요성은 Show 예제로 만들어 본 getMax이미 파이썬 설계자가 만든 환상적인
결과는 다음과 같습니다.
a_1(1.) 설명
함수를 정의하는 부분입니다. 인수는 함수의 호출 시점에서 항상 다르게 지정할 수 있습니다. 좀 더 다양한 상황에서 사용할 수 있도록 말이죠. 우리는 함수를 정의한다고 해서 프로그램이 실제로 어떤 동작을 하지는 않습니다. 함수의 실제 동작은 함수를 호출하는 시점에서 이루어집니다. 이것은 중요한 개념이라 뒤에서 다시 설명합니다. a_2(2.) 설명
함수를 정의할 때
왜 변수의 범위를 이렇게 제한할까요? 궁금하신가요? 그럼 좀 있다 다시 설명할게요. a_3(3.) 설명
다음과 같은 함수는 아무것도 반환(리턴)하지 않습니다.
a_4(4.) 설명
실제로 함수를 호출하는 부분입니다. 이제서야 함수의 내부에서 기본적인 사용 방법
함수명과 인수명을 정할 때의 규칙은 변수명을 정하는 규칙과 동일합니다. 블록은 인수 란 함수에게 넘겨주는 값입니다. 함수명 바로 뒤로 이어지는 소괄호 안에 인수가 들어가게 됩니다. 인수는 다음과 같은 특성을 가집니다.
인수 는 매개변수, 인자, argument(아규먼트), parameter(파라미터) 등의 이름으로 불립니다. 미묘한 차이가 있지만 함수에 어떤 값을 넘겨준다는 의미에서 전부 큰 차이가 없으므로 일단은 넘어가되 용어의 존재만 확실하게 기억하고 가도록 합시다. 총 5가지 입니다. 함수 블록 내부에는
함수는 호출(call) 해야 비로소 작동합니다. 호출에 대한 특징은 다음과 같습니다.
함수의 특징 (장점)
변수명을 더 자유롭게 사용할 수 있습니다. (변수의 범위를 제한하는 이유)금방 전 함수의 특징 중 하나가 변수의 범위를 제한한다고 하였습니다. 그 이유는 그렇게 함으로써 변수명을 더 자유롭게 사용할 수 있기 때문입니다. 이게 무슨 말일까요? 범위를 제한하는 것이 오히려 더 자유롭게 사용할 수 있다니요? 함수의 밖과 안은 기본적으로 서로 격리되어 있습니다. 그렇기 때문에 서로에게 영향을 줄 수 없습니다. 즉 함수 밖에서 정의된 변수는 내부에서 접근할 수 없고, 내부에서 정의된 변수는 바깥에서 접근할 수 없습니다. 다른 말로 하자면 함수 내부에서 변수를 정의할 때 함수 외부의 이름과 겹치지 않을까 같은 걱정은 전혀 필요없다 는 뜻입니다. 반대의 상황도 마찬가지고요. 만약 다음과 같은 코드가 있다고 생각합시다.
사실
이렇듯 함수는 기본적으로 외부와 격리하려고 합니다. 하지만 함수 내부에서 외부의 값을 직접 변경하고 싶을 때가 있을 수 있습니다. 이는 심화 내용이므로, 아래쪽 더 나아가기 에서 확인해보세요. 코드 작성의 효율이 높아집니다.사실 함수를 하나도 작성하지 않아도 프로그램을 작성할 수 있습니다. 하지만 함수는 다음과 같은 상황에서 아주 강력합니다.
완전히 같은 기능만 함수로서 만들어야 할까요? 그렇지 않습니다. 함수를 만들 때 미묘하게 다른 기능에 대해서는 바로 인수를 통해서 기능을 쉽게 세분화시킬 수 있기 때문이죠. 이로 인하여 함수 하나를 정의하였다 하더라도 인수를 다양한 방식으로 조합하여 호출할수 있다는 말이죠. 함수 호출 시 매번 같은 점과 다른 점은 다음과 같습니다.
가독성이 좋아집니다.함수는 정의하는 부분과 실제로 사용하는 부분(호출)이 나뉘어져 있습니다. 프로그램은 앞서 얘기한 것처럼 위에서부터 아래로 차례대로 진행되는데요, 함수 호출을 만나게 되면 프로그램 흐름은 그 함수의 정의된 부분으로 순간이동합니다. 함수가 전혀요. 헷갈리지 않습니다. 왜냐하면 우리는 함수 내부에 대해서는 별 생각을 안하고 있기 때문입니다. 우리가 결론은 이렇습니다. 코드를 기능 별로 구분해놓으니 일관된 논리에 따라 코드를 작성할 수 있어 가독성이 크게 향상됩니다. 작동 방식을 이해하기 위하여 코드를 직접 분석하는 일은, 필요 없습니다.일반적으로 함수의 다음 네 가지 요소를 안다면 함수의 실제 내용을 몰라도 곧장 이용할 수 있습니다.
코드 몇 줄 단위보다는 함수 하나하나에 대해 문서를 작성하는 것이 작성하는 사람에게도, 그 기능을 이용하려는 사람에게도 아주 편합니다. 이용하려는 사람은 굳이 소스 코드를 뜯어보지 않아도 그 함수에 대한 문서를 읽고 적절하게 사용하면 됩니다. 즉 내부가 어떻게 동작하는지 알 필요가 없다는 것 인데요, 이런 개념을 캡슐화라고 합니다. 물론 문서가 없는 함수는 직접 코드를 뜯어봐야 알 수 있겠지요. 함수를 만들 일이 있다면 이름을 기억하기 좋게 만들거나 짧은 설명 한 줄 정도는 미래의 나 를 위해 써놓읍시다. 더 나아가기공유에 의한 전달 (pass by sharing)우리는 함수를 호출할 때 변수로 호출할 수도 있습니다. 그럼 다음과 같은 코드는 어떻게 작동할까요?
얼핏 생각하면 인수로 객체와 클래스까지 배우게 된다면, 인수로 넘겨질 때의 특정한 메커니즘이 발동해서, 인수로 넘겨진 본체가 수정이 가해질 수도 있는데, 그 특정 메커니즘을 공유에 의한 전달(pass by sharing)이라고 하고, 이것에 대한 설명은 다음 시간 언젠가 하도록 합시다. (추가 예정) global, nonlocal함수 내부에서 외부의 값을 수정하고 싶을 때도 있다고 했습니다. 그럴 때는 global 키워드를 사용하여 "이 변수는 외부에서 정의한 것이라도 갖다 쓰겠다!" 라고 파이썬 인터프리터에게 일방적으로 통보하면 됩니다. 다음 예시를 봐주세요.
(추가 예정) 연습 문제
프로그래밍 문제아래 함수를 정의하여, 기능이 제대로 동작하는지 테스트해보세요.
프로그래밍 문제 정답
|