PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제2장 PHP의 기초 문법

    6. 함수와 클래스

함수(FUNCTION)

1.함수의 정의 및 호출

지금까지 함수에 대한 원론적인 설명 없이도 여러분은 이미 많은 함수 코드를 보아왔다. 앞서 전역 변수와 지역변수, 정적변수가 갖는 변수의 범위와 차이에 관해 설명할 때 함수에 관한 예제 코드를 보았던 것을 기억할 것이다. PHP 에서 함수의 사용은 C나 Perl에서의 문법과 다르지 않다.

 

 function 함수이름 (인자1, 인자2) {

        // 함수의 실행문

        return 리턴값;

 }

단, PHP에서 함수를 호출하기 위해서는 반드시 호출 전에 함수가 정의되어야 한다. 이점은 C와는 다른데 아래의 예제를 보자.

 

 

 <?

   printMe("함수를 호출합니다.");

   

   function printMe($str) {

      echo("$str");

   }

   

 ?>

 

[예제1.27] 함수의 호출과 정의

 

위 예제를 실행하여 보면 "Fatal error : Call to unsupported or undefined function printme()"와 같은 에러 메시지를 받게 된다. 즉, 함수 printMe()의 정의가 2행의 호출문 보다 뒤에 있기 때문에 2행에서 함수를 호출하려고 할 때 해당 함수가 정의되어 있지 않다는 메시지가 나타나게 되는 것이다. 따라서 2행이 함수 정의 부분보다 아래에 있어야 함수의 정상적인 실행 결과로서 "함수를 호출합니다"라는 문자열이 출력될 것이다.

 

2. 함수의 리턴값

아래의 예제는 C나 Perl에서처럼 함수의 단일 리턴값을 전달받아 출력한다.

 

 

 <?

   function foo($a) {

      $b = $a * 3;

      return $b;

   }

   

   $res = foo(4);

   echo("res : $res<br>");

 ?>

 

[예제1.28] 함수의 리턴값

 

기본적으로 PHP에서는 함수의 리턴 값으로 여러 개의 값을 한꺼번에 전달할 수 없다. 그러나 아래와 같이 함수의 결과로 배열을 넘기고 list() 함수로 이를 받으면 여러 값을 한꺼번에 전달하는 효과를 줄 수 있다.

 

 

 <?

   function foo() {

      return array("이완철", "김영아", "김무현");      

   }

   

   list($name1, $name2, $name3) = foo();

   echo("$name1 / $name2 / $name3");

 ?>

 

[예제1.29] 함수의 실행 결과로 여러 값을 전달받기

 

3. 함수의 인자를 전달하는 방법

함수에 인자를 전달하는 방법은 두 가지가 있다.

 

한가지는 지금까지 보아왔던 예제의 경우처럼 함수의 인자로 값(value)을 전달하여 함수를 호출하는 방법이다.

 

 foo(12,20);

 foo("hello");

또 한 가지 방법은 함수의 인자로 값이 아닌 참조(reference)에 의한 호출을 하는 방법이다. 이는 C에서 변수의 값이 아닌 그 포인터를 넘겨 함수를 호출하는 것과 같은 개념이다. 예를 들어 인자로 전달하는 두 값을 함수 호출을 거쳐 모두 변경해야 하는 경우에는 이 참조에 의한 호출 방식을 사용해야 한다.

 

 

 <?

   function foo(&$str) {

      $str .= "world...";

   }

   

   function swap(&$a, &$b) {

      $temp = $b;

      $b = $a;

      $a = $temp;

   }

   

   $a = 10;

   $b = 15;

   echo("\$a : $a - \$b : $b<br>");

   

   swap($a,$b);

   echo("\$a : $a - \$b : $b<br>");

   

   $str = "Hello! ";

   echo("$str<br>");

   foo($str);

   echo("$str<br>");   

 ?>

 

[예제1.30] 참조에 의한 호출

 

[예제1.30]에서 6행~10행의 함수는 인자로 전달받은 두 변수의 값을 서로 바꾼다. 그런데 앞서 함수 내에서 정의된 변수는 global로 선언되지 않는 한 함수의 실행이 종료되면 그 값을 잃어버린다고 하였던 것을 기억할 것이다.

만일 6행에서 인자 앞에 '&'가 없이 swap($a,$b)과 같은 방법으로 호출된다면 이 함수는 아무런 유효한 결과도 갖지 못할 것이다. 즉, swap() 함수를 실행하기 전이나 실행한 후나 변수 $a와 $b의 값에는 변함이 없을 것이다.

 

그러나 함수 호출 후에도 인자로 전달된 두 값이 서로 바뀐 값을 그대로 저장하도록 하려면 바로 여기서 말하는 참조에 의한 호출 방식을 따라 함수를 호출해야 하며 이때 참조에 의한 호출임을 알리기 위해 인자로 전달하는 변수의 앞에 앰퍼센드(&)를 붙여야 한다.

이제 14행과 17행에서 함수 호출 전의 변수 $a 와 $b가 가지고 있던 값이 함수 호출 후 서로 바뀌어 할당된 것을 볼 수 있다. 바로 참조 호출에 의해서 이와 같은 것이 가능한 것이다.

 

클래스(CLASS)

1. 클래스의 정의

클래스는 변수와 그 변수에 관계되는 함수로 이루어진 하나의 변수형으로 다음과 같은 방식으로 정의된다.

 

 

 <?

   class Account {

      var $current_money;

      

      function save($money) {

         $this->current_money += $money;

      }

     

      function withdraw($money) {

         if($this->current_money < $money) {

            echo("잔액이 부족합니다.");

            return true;

         } else {

            $this->current_money -= $money;            

            return true;

         }      

      }

      

      function getCurrent() {

         return $this->current_money;

      }

      

   }

 

 ?>   

 

[예제1.31] 클래스 Account의 정의

 

[예제1.31]은 Account 라는 이름을 갖는 클래스를 정의하고 있으며 이 클래스를 바탕으로 생성된 객체는 현재의 잔액을 나타내는 변수와 현 계좌에 입금과 출금, 잔고 확인이 가능한 함수를 사용할 수 있게 된다.

이 클래스에 대한 객체 변수를 생성하려면 다음과 같이 new 라는 연산자를 사용한다.

 

 $accnt = new Account;

 $accnt -> save(100000);

이제 $accnt 라는 변수는 Account 라는 클래스의 변수 및 함수에 접근할 수 있는 객체 변수로서 정의되며 클래스 내 함수에 접근하여 호출하려면 '->'와 같은 지시 연산자를 사용해야 한다.

 

2. 클래스 생성자(Constructor)

또한 클래스에는 생성자(constructor)라는 함수가 있어서 새로운 클래스 객체가 생성될 때마다 자동으로 호출된다. 즉, new 라는 연산자로 새로운 객체를 생성할 때마다 이 생성자가 호출이 되는데 이 생성자 함수는 생성자임을 표시하기 위해 해당 클래스 이름과 동일한 이름을 갖는다.

 

예를 들면 위 Account 예제의 생성자는 아래와 같이 정의할 수 있다.

 

 function Account($defVal = 10000) {  // 초기값은 지정해주지 않으면

         $this->current_money = $defVal;       // 100000원으로 할당

      }

[예제1.32] 클래스 Account의 생성자 정의

 

1행에서 '$defVal = 10000'은 클래스 객체를 생성할 때 아무런 값을 지정해주지 않으면 디폴트값으로 current-money 변수에 10000이 할당된다는 것을 의미한다. 여기서 this라고 하는 것이 보이는데 이는 new를 통해서 생성된 객체를 의미한다.

 

아래와 같이 Account의 객체 $accnt를 생성했다고 하자.

 

 

 <?

   class Account {

      var $current_money;

      

      function Account($defVal = 10000) {

         $this->current_money = $defVal;

      }

      

      function save($money) {

         $this->current_money += $money;

      }

     

      function withdraw($money) {

         if($this->current_money < $money) {

            echo("잔액이 부족합니다.");

            return true;

         } else {

            $this->current_money -= $money;            

            return true;

         }      

      }

      

      function getCurrent() {

         return $this->current_money;

      }

      

   }

 

   $accnt = new Account(12500);

   $current = $accnt->getCurrent();

   echo("현재 금액은 $current 원 입니다.<br>");

   $accnt->save(100000);

   $accnt->withdraw(70000);

   $current = $accnt->getCurrent();

   echo("현재 금액은 $current 원 입니다.");

   

 ?>   

   

[예제1.33] 클래스 Account 객체의 생성

 

1행에서는 new 연산자를 사용하여 $accnt 라는 하나의 새로운 계좌를 개설했다고 생각하면 된다. 계좌가 개설됨과 동시에 생성자인 Account() 함수가 호출되는데 1행에서 12,500원을 초기 값으로 지정하였으므로 초기 잔고가 12,500원이 된다. 4행에서는 현 계좌에 100,000원을 입금하였고 5행에서는 현 계좌에서 70,000원을 인출하였다. 물론 [예제1.31]에서 잔고가 인출하려는 금액보다 적으면 인출이 이루어지지 않는다. 6행에서 현 계좌의 잔고를 출력하면 물론 42,500원이 남는다. 이제 클래스를 이용한 객체의 생성과 조작에 대한 이해가 되었을 것이다.

 

3. 클래스의 계승(상속)

C++과 같은 객체지향 방식의 프로그래밍에 경험이 있다면 클래스에 계승하여 또 다른 클래스를 만들 수 있다는 것을 알 것이다. PHP에서도 물론 가능한 일이다. [예제1.34]를 보자.

 

   

   class Named_Account extends Account {

      var $owner;

      

      function Named_Account($defVal = 25000) {

         $this->current_money = $defVal;

      }      

      

      function set_owner($username) {

         $this->owner = $username;

      }

      

      function getOwner() {

         return $this->owner;

      }

   }

 

[예제1.34] 클래스의 계승

 

1행을 보면 extends 라는 단어가 보인다. 이 extends라는 키워드가 클래스의 계승을 위한 선언자라고 할 수 있다.

 

1행의 코드는 앞에서 정의한 Account 클래스를 계승하여 새로운 자식 클래스인 Named_Account 클래스를 정의한다. extends의 오른쪽에는 부모 클래스를 왼쪽에는 부모 클래스를 계승하여 정의될 자식 클래스를 적어준다. 부모 클래스로부터 계승된 자식 클래스는 부모 클래스의 모든 변수와 함수를 상속받는다.

 

위 예제에서 Named_Account 클래스는 Account 클래스를 계승하여 정의되었으므로 Account 클래스가 가지고 있는 변수($current_money)와 함수(save(), withdraw(),getCurrent())를 그대로 사용할 수 있게 되며 Named_Account 클래스에만 요구되는 변수($owner)와 함수(set_owner(), getOwner())는 추가적으로 정의해 주기만 하면 된다.

 

 1      $myaccnt = new Named_account;

 2      $myaccnt -> set_owner("이완철");

 3      $current = $myaccnt->getCurrent();

 4      $name = $myaccnt->getOwner();

 5      echo("[$name]님 계좌의 잔고는 현재 ${current}원입니다.");

위 예제의 실행 결과는 다음과 같다.

 

 [이완철]님 계좌의 잔고는 현재 25000원입니다.

이제 클래스가 얼마나 유용하게 사용될 수 있는지 알게 되었으리라 생각된다.

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.