본문 바로가기

웹개발/PHP

초급용 PHP : 함수와 클래스 생성 방법론 ( 함수편 )

php 스쿨을 산책하다가 내용이 좋아서 가져왔습니다 :)



반갑습니다.

오늘도 여지없이 돌아온 초급용 입니다.

그간 업무가 바쁜관계로.. (-_ㅡ;  전혀 죄송하지 않습니다.

세번째 초급용 함수와 클래스의 기본 개념에 대해서 써볼까 합니다.

그 첫번째 시간으로 함수에 대해서 알아 봅시다..

뭐 앞서 제가 이런 글을 쓰는 이유를 모르시는 분들은 js편을 먼저 보시기 바랍니다.

초급용이라 아시는 분은 안보셔도 됩니다. 태클은 영구반사 아이템을 사용하겠습니다.

프로그램을 제작 하다보면 많은 코드의 양때문에 혹은 반복적으로 발생되는

코드때문에 우리는 아주 열심히 잘 하는?, 안가르쳐 줘도 타고나는 재주?를 여지없이

발휘합니다. 궁극의 Ctrl + C & V 신공 (-_ㅡ)))

하지만 이런거 말고 좀더 쉬운게 없을까요? 일의 효율성을 높일 수 있는 궁극적인

해결책 그 첫번째 방법이 바로 사용자 정의 함수 (user function)! 음.. 사용자 정의

함수라는 명칭이 있는지 잘 모르겠군요 ^^; 하지만 저는 그렇게 부릅니다.

언어를 제가 개발한 언어 개발자가 아니기 때문에 만들어 놓은 문법에 따라 언어를

사용하는 사용자라는 개념에서죠. 아무튼 함수의 생성에 관한 이야기 입니다.

직접적인 코드도 있지만 개념적인 설명이 많기 때문에 다소 지겨울 수도 있습니다.

책을 통한 설명이나 개시판을 통한 학습을 하다 보면 많은 초급 개발자분들이 함수를

어떻게 만들어야 할까에 대해서 많은 고민을 하게 됩니다.

쉬운 예로

자 오늘은 페이징로직을 이용한 함수를 만들어 봅시다~

이러면 페이징을 배웠어도 어떻게 함수로 만들어야 할지 또 함수를 만들면 어떻게

함수가 동작되는가, 함수를 사용하면 어떤 이점이 있는가 등등 별의별 잡다한 생각을

하면서 결국

function paging(){
|
}

커서를 저 위치에 놓고 궁리만 하고 있죠 -_-;;

결론부터 말씀드리면 함수를 쉽고 빨리 만들기 위해서는 먼저 기능구현부터 해야합니다.

함수부터 만들겠다고 function 함수명() 이렇게 해놓으면 다음에 뭘 해야 할지 솔직히

감 안오죠. 수십번을 만들어도 마찮가지입니다. 수백번을 만든다면 가능해질 문제이긴

합니다만.. 우리에게는 그렇게 많은 시간이 없다는것이죠.

선행 학습 내용으로 함수는 어떻게 동작되는가를 알아야 겠습니다.

php해석기(parser) 는 function을 만나게 되면 일단 메모리에 로드시켜 놓습니다.

변수를 선언했을 때 메모리의 일정 공간을 선언된 변수명으로 할당받는 것과 같은

이치 입니다. 선언된 변수와 함수는 언제든 재사용 가능하다는거 아시겠죠?

다만 php의 특성상 파일단위 프로그램이 종료되면 모든 변수와 함수는

언로드(메모리에서 삭제) 된다는 것을 유의 하시기 바랍니다.

특정 기술인 공유메모리, 세마포어 등을 이용하면 타 사용자간의 데이터 공유도
 
가능합니다만.... C언어를 먼저 공부를 해야만 메모리 접근,제어에 이해가 될 것입니다.

그럼 실질적인 예제를 통해서 함수를 만드는 방법을 읶혀 보겠습니다.

※ 기능구현 ( 구구단 3단)

아주 고전적인 예제중 구구단 만들기라는 예제가 있습니다.

아주 오래된 예제이지만 현재도 기초수업에 사용되는 이유는 각종 제어문을

다양하게 사용함으로서 문법과 로직을 효과적으로 이해하는 좋은 예제이기 때문입니다.

구구단 출력에 관한 코드는 별도의 주석을 첨부하지 않겠습니다.

$dan = 3;
$exp = 1;
$summary = 0;
while($exp < 10){
    $summary = $dan * $exp;
    echo $dan .' * '. $exp .' = '. $summary .'<br />';
    $exp++;
}

쉽죠? 이정도는 알고 계시리라 생각하고 진행 하겠습니다.

기능은 완벽했습니다. 더이상 나무랄데 없이 정확한 결과가 출력되었습니다.

우리가 원하는 기능이 구현된 상태에서 함수를 제작하겠습니다.

일단 아무 생각하지말고 function 부터선언합시다!!

※ 함수선언

function gugudan(){
    $dan = 3;
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}

음.. 뭔가 좀 되는 분위기!! 어이 수업에 불만있냐 눈돌리지마라

5분만 집중하면 1년뒤 연봉이 달라진다! ㅡ_-?? (진짜?)

그런데 이제 두번째 항목으로 생각해야 할 문제가 발생 했습니다.

이렇게 해놓으면 항상 gugudan함수를 호출할 때 마다 3단만 출력된다는게

불만입니다. 이렇게 할 거 같으면 뭐하러 함수를 쓴단 말인가 그냥 복사&붙이기신공을

쓰는거랑 뭐가 다르단 말인가?

그렇습니다~

그래서 나온게 매개변수 입니다.

함수를 만드는데 있어서 결정적으로 프로그램의 유기적 흐름을 만들기 위한 방법!

그런데 이 매개변수를 하기전에 먼저 전역변수와 지역변수에 대한 개념이 잡혀 있어야

합니다.

전역변수
<?
$toto ="전역변수다~";
$로또 = "이것도 전역변수다~";
?>

어? 변수명을 한글로???

가능합니다 ^^ php만이 가능한 기능중에 하나죠

하지만 성능적으로는 안좋습니다. 이유는 1byte처리와 2byte처리에 있습니다.

아무튼 여러분은 여지껏 전역변수만을 사용했다면 이제는 지역변수도 알아야 합니다.

<?
$toto = "전역변수";
echo $toto;
function act(){
    echo $toto;
    $toto = "지역변수";
    echo $toto;
}
?>

아니 변수명이 같자나? 그런데 엄격히 말하면 함수 안의 변수와 함수 밖의 변수는

시스템에서 다르게 인식합니다.

함수 안에서 사용하는 변수는 지역변수이기 때문에 두번째 echo는 아무것도 출력하지

못합니다.

그럼 매개변수는 뭐에요????

매개변수는 이런 지역변수와 전역변수간의 특정 data를 주고 받는 통로이자 함수 내에서

사용할 변수를 미리 선언해 놓은 것입니다. 어렵나요? 아래 예제를 보시죠~!

<?
$toto = "나 전역변수!!";
function act ( $gaga ) {//변수 $gaga 가 바로 매개 변수입니다.
    echo $gaga;
}
act ( $toto ); /// 문제의 핵심 함수를 호출할 때!!
?>
act라는 함수를 호출할 때 gaga변수가 받아야 할 정보를 가지고 있는 $toto변수를

지정해 줌으로써 toto변수의 값을 gaga변수가 가지게 되는 것이죠.

음.. 그럼 이제 매개변수를 이용해서 함수를 호출할 때 지정해준 단의 구구단을

출력해 봅시다.

※ 매개변수

<?
function gugudan($dan){
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}
gugudan( 4 );//$dan 변수가 받을 값을 직접 지정
?>

이런 코드가 되었습니까?

아니 매개 변수 자리에 그냥 4를 지정했네요?

맞습니다 함수를 호출할 때에는 매개변수의 자리에 데이터를 직접 지정해도 되고

혹은 선언된 변수를 지정해도 됩니다.

이렇게 함으로써 여러분은 이제 입력되는 수에 따라 해당 수의 구구단을 출력하는

함수를 만들었습니다.

그럼 꼭 매개변수를 써야만 함수 안과 밖의 특정 값을 주고 받을 수 있습니까?

아닙니다. 매개변수 이외에도 전역화(global) 라는 개념이 있습니다.

global로 선언된 변수들은 함수 안밖에 구애받지 않고 사용할 수 있습니다.

다시 말하면 전역변수, 지역변수의 개념이 아닌 하나의 변수를 공통적으로

사용하는 방법입니다.

※ global

<?
function gugudan(){
    global $dan;
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}
$dan = 4;
gugudan();
?>

$dan변수를 함수 내에서 global로 선언하면 더이상 $dan변수는 지역변수가 아닌

전역화 되어서 함수 안,밖에서 동일하게 취급받습니다.

함수를 호출하기 전에 $dan 변수에 4를 지정했기 때문에 정상적으로 4단이 출력되는

것을 볼 수 있습니다. 전역화도 마찮가지로 하나의 변수만을 쓰는것은 아닙니다.

global $변수명, $변수명, $변수명; 이런 형식으로 쓸 수 있습니다.


이 예제에서 사용되지 않은 return 이라던가 복수의 값을 전달하는 방법등은

여러분이 직접 생각해 보시기 바랍니다. (복수의값 리턴 힌트는 배열입니다.)

아시다 싶이 매개변수라는 것은 한개만을 사용할 수 있는 것은 아닙니다.

함수 내부적으로 어떤 데이터를 처리할 것이냐에 따라 매개변수는 여러개가 될

수 있습니다.

이제 함수를 만들기 위한 방법을 정리를 해보죠.

1. 기능구현.

2. 함수선언.

3. 자료를 입력받을 것인가? 내부적으로 처리할 것인가?

4. 매개변수를 사용하면 몇개를 사용할 것인가?

5. 실행 결과를 함수내에서 출력할 것인가? 호출한 곳으로 되돌려 줄것인가?

1,2 항목은 일반적 진행이면 3~5항목은 여러분이 즉 함수를 만드는 사람이

선택해야 할 문제 입니다.

이번 함수 만들기편에서 많은 부분을 다루고 싶었지만 그렇게 되면 너무 깊이 들어

가게 됨으로 본래의 취지인 초급용 이상의 내용을 다루게 될 것 같아서 여기에서

마무리 짖겠습니다.

P.S) 함수를 만들 때 유의사항

1. 반복적으로 사용되는 내용인가?

2. 단편화 or 모듈화 되었는가?

위 두가지 항목은 함수를 반복적으로 만드는 연습을 하다보면 자연스레

깨우치게 될 것입니다. 다만 노파심에.. 고운하루 되시길 빕니다.



출처 : http://woorisay.x-y.net