본문 바로가기
PHP

PHP function

by godfeeling 2020. 7. 2.

함수(function)?

함수(function)란 하나의 특별한 목적의 작업을 수행하도록 설계된 독립적인 블록을 의미합니다.

 

 

 

함수를 사용하는 가장 큰 이유는 반복적인 코드의 작성을 피할 수 있기 때문입니다.

 

프로그램에서 하나의 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 됩니다.

 

그리고서 프로그램이 필요할 때마다 함수를 호출하면 해당 작업을 반복해서 수행할 수 있습니다.

 

 

 

또한, 프로그램을 여러 개의 함수로 나누어 작성하면 모듈화로 인해 전체적인 코드의 가독성이 좋아집니다.

 

그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있습니다.

 

함수의 구조

PHP에서 함수는 function 키워드로 선언되며, 다음과 같은 구성 요소를 가집니다.

 

 

 

1. 함수 이름

 

2. 괄호 안에 쉼표(,)로 구분되는 함수의 매개변수(parameter)

 

3. 중괄호({})로 둘러싸인 PHP 수행 코드

 

 

 

PHP 함수의 구조는 다음과 같습니다.

 

문법

function 함수이름(매개변수1, 매개변수2,...)

 

{

함수가 호출 되었을 때 실행될 코드;

}

 

 

 

함수의 이름(name)은 함수를 구분하는 식별자(identifier)입니다.

 

함수의 매개변수(parameter)란 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있도록 해주는 변수입니다.

 

 

 

함수의 인수(argument)란 함수가 호출될 때 함수로 값을 전달해주는 변수입니다.

 

함수가 호출되면 중괄호({ })안의 코드가 실행됩니다.

 

사용자 정의 함수

사용자 정의 함수(user defined function)

PHP에서는 미리 작성되어 제공되는 많은 내장 함수들이 있습니다.

 

하지만 개발자가 필요로 하는 기능을 가진 함수가 없다면, 직접 함수를 만들 수도 있습니다.

 

이런 함수를 사용자 정의 함수라고 하며, 반복해서 수행해야 하는 작업이 있다면 함수로 만들어서 사용하는 것이 좋습니다.

 

함수의 정의

PHP에서 함수의 정의는 앞서 설명한 함수의 구조대로 정의하면 됩니다.

 

문법

function 함수이름(매개변수1, 매개변수2,...)

 

{

함수가 호출되었을 때 실행될 코드;

}

 

 

 

function 키워드로 함수의 정의를 시작하고, 함수의 이름, 매개변수, 블록({ }) 사이에 들어갈 코드를 명시합니다.

 

 

 

PHP에서 함수의 이름을 작성할 때는 다음 사항을 준수해야 합니다.

 

 

 

1. 함수의 이름은 문자와 숫자, 언더스코어(_)만 사용할 수 있습니다.

 

2. 함수의 이름은 숫자로 시작할 수 없습니다.

 

3. 여러 함수가 같은 이름을 사용할 수는 없습니다.

 

 

 

PHP는 함수 오버로딩을 지원하지 않으므로, 이미 선언된 함수를 다시 선언할 수 없습니다.

 

또한, 함수의 이름은 대소문자를 구분하지 않기 때문에 sum()SUM()은 같은 함수로 취급됩니다.

 

PHP에서 함수 이름은 대소문자를 구별하지 않지만, 선언한 그대로 호출하는 것이 좋습니다.

 

매개변수는 인수로 전달받은 값을 함수에서 사용하기 위해 사용합니다.

 

함수는 여러 개의 매개변수를 가질 수 있으며, 쉼표(,)를 사용하여 구분합니다.

 

함수의 호출

PHP가 미리 정의하여 제공하는 함수는 모든 PHP 스크립트에서 사용할 수 있습니다.

 

하지만 사용자가 직접 정의한 함수는 해당 함수가 정의된 PHP 스크립트에서만 호출할 수 있습니다.

 

 

 

PHP의 모든 함수와 클래스는 전역 범위(global scope)를 가집니다.

 

따라서 같은 스크립트 내에서는 함수가 내부에서 정의되었더라도 외부에서 호출할 수 있으며, 반대로 외부에서 정의되었어도 내부에서 호출할 수 있습니다.

 

 

 

PHP에서 함수의 호출 방법은 함수의 정의와 같은 형태입니다.

 

)

$sum = sum(1, 2); // 함수 sum()을 호출하면서, 인수로 12를 전달함.

 

// 함수의 호출이 끝난 뒤에는, 반환값을 변수 $sum에 대입함.

 

 

 

위의 예제에서 인수(argument)로 전달된 숫자 12는 함수에서 정의된 매개변수(parameter) xy에 각각 대입됩니다.

 

따라서 호출된 함수의 내부에서는 매개변수 xy로 해당 값을 사용할 수 있습니다.

 

함수의 값 반환

PHP에서 함수는 반환(return)문을 포함할 수도 있고, 포함하지 않을 수도 있습니다.

 

 

 

PHP에서 반환문은 return 키워드를 사용하여 명시할 수 있습니다.

 

이렇게 포함된 반환문은 호출자에게 함수 블록 내에서 실행된 코드의 결과를 반환해 줍니다.

 

반환문은 배열이나 객체를 포함한 PHP에서 사용할 수 있는 모든 타입의 값을 반환할 수 있습니다.

 

)

function sum($x, $y) // 함수의 이름은 sum()이며, 변수 x, y를 매개변수로 가지는 함수를 정의함.

 

{

return $x + $y; // 매개변수 x, y를 더한 값을 반환함.

}

echo sum(1, 2); // sum() 함수에 숫자 12을 인수로 전달하여 호출함.

 

PHP 7부터는 함수의 반환값을 원하는 타입으로 반환받을 수 있도록, 반환값의 타입을 직접 지정할 수 있습니다.

 

 

 

또한, 반환값의 타입을 지정할 때 그 강도도 설정할 수 있습니다.

 

기본값인 약한 강도에서는 타입이 일치하지 않으면, 자동 타입 변환을 통해 명시된 타입으로 변환된 반환값을 반환합니다.

 

하지만 강한 강도에서는 반환값의 타입이 일치하지 않으면, 오류를 발생시킵니다.

 

 

 

다음 예제는 약한 강도로 함수의 반환 타입을 설정하는 예제입니다.

 

)

function sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.

 

{

return $x + $y;

}

 

...

 

var_dump(sum(3 + 4)); // float

 

 

 

위의 예제에서 sum() 함수는 호출 시 정수 2개를 인수로 전달받습니다.

 

하지만 반환 타입이 float 타입으로 설정되어 있으므로, 덧셈 연산의 결과가 int 타입에서 float 타입으로 자동 변환되어 반환됩니다.

 

 

 

다음 예제는 강한 강도로 함수의 반환 타입을 설정하는 예제입니다.

 

)

declare(strict_types = 1); // strict 모드로 설정함.

 

 

 

function sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.

 

{

return $x + $y;

}

 

...

 

var_dump(sum(3 + 4)); // 오류가 발생함.

 

var_dump(sum(3 + 4.5)); // float

 

 

 

위의 예제처럼 declare 문을 사용하여 strict 모드를 설정할 수 있습니다.

 

PHP 7부터 제공되는 strict 모드는 지금까지의 자동 변환으로 느슨하게 처리되던 타입 검사를 엄격하게 수행하도록 변경합니다.

 

strict 모드에서는 해당 위치에 나올 수 있는 적절한 타입 이외의 값이 나올 경우 타입 변환을 하지 않고 오류를 발생시킵니다.

 

 

 

번 라인에서 sum() 함수는 호출 시 정수 2개를 인수로 전달받습니다.

 

하지만 반환 타입이 float 타입으로 설정되어 있으므로, 오류가 발생합니다.

 

따라서 번 라인과 같이 인수 중 하나를 float 타입으로 전달해야만 덧셈 연산의 결과가 반환 타입인 float 타입의 값으로 정상 반환될 것입니다.

 

매개변수와 인수

매개변수(parameter)와 인수(argument)

함수의 매개변수(parameter)란 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수입니다.

 

또한, 함수의 인수(argument)란 함수가 호출될 때 함수로 값을 전달해주는 변수를 가리킵니다.

 

대부분의 함수는 하나 이상의 매개변수를 가지며, 매개변수가 없는 함수도 존재합니다.

 

매개변수의 전달 방식

함수로 전달된 인수에 저장된 값을 매개변수에 전달할 때는 다음 방식 중 하나를 선택할 수 있습니다.

 

 

 

1. 값 전달 방식

 

2. 참조 전달 방식

 

값 전달(passing by value)

기본적으로 함수의 인수는 값 전달(passing by value) 방식으로 매개변수로 전달됩니다.

 

 

 

인수를 함수에 전달하면, 새롭게 생성된 매개변수에 전달받은 값이 복사되어 저장됩니다.

 

이처럼 매개변수에 저장된 값은 전달받은 데이터의 복사본으로, 함수 안에서 변경되어도 함수 밖의 원본 데이터에는 영향을 주지 않습니다.

 

)

function increment($para)

{

$para++; // $value의 값을 복사하여 increment() 함수에 인수로 전달함.

}

$value = 1;

increment($value);

 

위의 예제에서 매개변수 $para는 함수가 호출될 때 생성되며, 전달받은 값인 12로 증가시킵니다.

 

하지만 함수 밖에 존재하는 변수 $value의 값은 변하지 않습니다.

 

참조 전달(passing by reference)

함수 내부에서 함수 밖의 데이터를 조작하기 위해서는 해당 변수를 전역 변수로 선언할 수도 있습니다.

 

하지만 참조 전달(pass by reference)을 이용하면 더욱 유연한 코드를 작성할 수 있습니다.

 

 

 

참조 전달은 인수로 전달받은 값을 복사하는 것이 아닌, 전달받은 원본 데이터에 대한 참조 변수를 매개변수에 전달합니다.

 

따라서 참조 전달은 원본 데이터의 복사된 값을 가지는 것이 아니라 원본 데이터를 그대로 참조하게 됩니다.

 

그래서 함수 내부에서 값을 변경하면, 함수 밖의 원본 데이터도 같이 바뀌게 됩니다.

 

 

 

참조 전달을 사용하기 위해서는 함수를 선언할 때 매개변수 앞에 '&'기호를 붙여주면 됩니다.

 

)

function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.

{

$para++;

}

$value = 1;

increment($value);

 

위의 예제에서는 참조 전달 방식을 사용하였기 때문에 함수 밖에 존재하는 변수 $value의 값이 같이 변경되었습니다.

 

디폴트 매개변수(default parameter)

디폴트 매개변수란 함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미합니다.

 

함수를 호출할 때 함수의 정의에서 명시된 매개변수의 수만큼 인수가 전달되지 않으면, PHP 파서는 오류를 발생시킵니다.

 

하지만 디폴트 매개변수를 설정하면, 함수 호출 시 전달할 인수의 수를 유연하게 설정할 수 있습니다.

 

 

 

PHP에서 디폴트 매개변수는 매개변수의 이름과 함께 대입 연산자(=)를 이용하여 설정할 수 있습니다.

 

)

function sum($value1, $value2 = 0, $value3 = 0)

 

 

 

위의 예제에서 변수 $value1은 인수로 반드시 전달받아야 하지만, 나머지 두 개의 매개변수는 만약 전달받지 못하면 설정된 기본값을 사용하게 됩니다.

 

 

 

PHP에서 함수를 호출할 때 전달된 인수는 매개변수의 왼쪽부터 차례대로 대입됩니다.

 

따라서 매개변수 $value3에 값을 전달하려면, 먼저 매개변수 $value1$value2에 값을 전달해야만 합니다.

 

이 때문에 디폴트 매개변수의 설정은 매개변수 리스트의 맨 오른쪽 끝 매개변수부터 시작해야 합니다.

 

 

 

다음 예제는 sum() 함수의 매개변수 중 2개의 매개변수에 디폴트 매개변수를 설정하는 예제입니다.

 

)

function sum($value1, $value2 = 0, $value3 = 0)

{

return $value1 + $value2 + $value3;

}

 

echo sum(1, 2, 3); // 6

echo sum(1, 2); // 3

echo sum(1); // 1

 

//echo sum(); // 오류가 발생함.

 

다음 예제는 sum() 함수의 매개변수 중 2개의 매개변수에 디폴트 매개변수를 설정하는 예제입니다.

 

)

function sum($value1 = 0, $value2, $value3 = 0)

{

return $value1 + $value2 + $value3;

}

 

echo sum(1, 2, 3); // 6

echo sum(1, 2); // 3

 

//echo sum(1); // 오류가 발생함.

 

//echo sum(); // 오류가 발생함.

 

위의 예제는 앞선 예제와는 달리 디폴트 매개변수를 매개변수 리스트의 양 끝의 매개변수만 설정합니다.

 

이렇게 설정하면 번 라인과 같이 3개의 인수를 모두 전달하는 경우와 번 라인과 같이 2개의 인수를 전달하는 경우에만 정상적으로 동작하게 됩니다.

 

번과 번 라인에서는 PHP 파서가 인수로 전달되지 않은 두 번째 매개변수의 값을 특정할 수 없으므로, 오류를 발생시킵니다.

 

가변 길이 인수 목록(variable-length argument list)

가변 길이 인수 목록은 함수를 선언할 때 전달받을 인수의 개수를 미리 정하지 않고, 호출할 때마다 유동적으로 인수를 넘기는 기능입니다.

 

 

 

PHP 5.5 이하에서는 func_num_args(), func_get_arg(), func_get_args() 함수를 사용하여 설정할 수 있었습니다.

 

하지만 PHP 5.6 이상에서는 '...' 토큰을 사용하여 간편하게 설정할 수 있습니다.

 

 

 

다음 예제는 PHP 5.5 이하에서 가변 길이 인수 목록을 설정하는 예제입니다.

 

)

function sum()

 

{

$sum = 0;

foreach(func_get_args() as $n) { // PHP 5.5 이하

$sum += $n;

}

return $sum;

}

 

 

 

위의 예제에서 func_get_args() 함수는 sum() 함수가 호출될 때 전달된 인수들을 배열의 형태로 반환해 줍니다.

 

따라서 sum() 함수 내부에서는 매개변수 대신에 func_get_args() 함수를 통해 인수에 접근할 수 있습니다.

 

그러므로 sum() 함수가 호출될 때 전달되는 인수의 개수에 신경 쓸 필요가 없어집니다.

 

 

 

다음 예제는 PHP 5.6 이상에서 가변 길이 인수 목록을 설정하는 예제입니다.

 

)

function sum(...$num) // PHP 5.6 이상

 

{

$sum = 0;

foreach($num as $n) {

$sum += $n;

}

return $sum;

}

 

 

 

PHP 5.6 이상부터는 위의 예제처럼 '...' 토큰을 사용하여 함수가 호출될 때 전달받은 인수들을 배열 형태로 저장할 수 있습니다.

 

따라서 sum() 함수 내부에서는 배열 $num를 이용하여 전달받은 인수에 접근할 수 있습니다.

 

조건적인 함수(conditional function)

조건적인 함수는 특정 조건을 만족할 때만 선언되는 함수입니다.

 

설정된 조건을 만족하지 못했을 때는 선언 자체가 되지 않으므로, 해당 함수를 호출할 수 없습니다.

 

)

$makefunc = true;

//func(); // 이 부분은 func() 함수가 선언되기 전이므로, 함수를 호출할 수 없습니다.

 

if($makefunc) {

function func()

{

echo "이제 함수를 사용할 수 있습니다";

}

 

func(); // 이 부분은 func() 함수가 선언되었으므로, 함수를 호출할 수 있습니다.

}

 

위의 예제처럼 함수가 선언되기 전에 먼저 호출되면, PHP는 오류를 발생시킵니다.

 

함수안의 함수(function within function)

PHP에서는 함수 안에 또 다른 함수를 선언할 수 있습니다.

 

PHP에서 모든 함수는 전역 함수이므로, 함수 내부에서 선언된 함수라도 해당 함수 외부에서 호출할 수 있습니다.

 

)

function out()

{

function in()

{

echo "이제 함수를 사용할 수 있습니다";

}

}

 

//in(); // 이 부분은 in() 함수가 선언되기 전이므로, 함수를 호출할 수 없습니다.

out();

 

in(); // 이 부분은 in() 함수가 선언되었으므로, 함수를 호출할 수 있습니다.

 

위의 예제에서 in() 함수는 out() 함수 내부에서 정의됩니다.

 

따라서 번 라인에서는 아직 단 한 번도 out() 함수가 호출되지 않았으므로, in() 함수가 정의되어 있지 않습니다.

 

번 라인에서 out() 함수가 호출되면서 비로소 in() 함수도 같이 정의됩니다.

 

따라서 번 라인에서는 정의된 in() 함수를 호출할 수 있게 됩니다.

 

재귀 함수(recursive function)

재귀 함수(recursive function)란 함수 내부에서 함수가 자기 자신을 또다시 호출하는 함수를 의미합니다.

 

이러한 재귀 함수는 자기가 자신을 계속해서 호출하므로, 끝없이 반복될 것입니다.

 

따라서 함수 내에 재귀 호출을 중단하도록 조건이 변경될 명령문을 반드시 포함해야 합니다.

 

 

 

프로그래밍을 처음 접하는 사람들은 이러한 재귀 함수가 왜 필요한가에 대해 이해하기 힘들 수도 있습니다.

 

하지만 재귀 함수는 알고리즘이나 자료 구조론에서는 매우 중요한 개념 중 하나입니다.

 

또한, 재귀 함수를 사용하면 복잡한 문제도 매우 간단하게 논리적으로 접근하여 표현할 수 있습니다.

 

)

function factorial($num)

{

if($num > 1) // 1이 될 때까지

return $num * factorial($num - 1); // 1씩 감소시킨 값을 전달하여 자기 자신을 계속 호출함.

else

return 1;

}

echo factorial(4);

100번 이상의 재귀 호출은 스택의 한계에 도달하여 스크립트가 중단될 수 있으므로, 될 수 있으면 사용하지 않는 것이 좋습니다.

 

가변 함수(variable function)

가변 함수(variable function)란 변수를 사용하여 함수를 호출하는 것을 의미합니다.

 

PHP에서는 변수 이름에 괄호(())를 붙이면, 해당 변수의 값과 같은 이름을 가지는 함수를 호출합니다.

 

따라서 변수에 함수의 이름을 별도로 지정할 수 있습니다.

 

)

function first()

 

{

echo "first() 함수입니다.<br><br>";

}

function second($para)

 

{

echo "second() 함수입니다.<br>";

 

echo "함수 호출 시 전달받은 인수의 값은 {$para}입니다.";

}

$func = "first";

$func(); // first() 함수를 호출함.

$func = "second"

$func(20); // second() 함수를 호출함.

'PHP' 카테고리의 다른 글

PHP regular expression  (0) 2020.07.02
PHP 내장함수  (0) 2020.07.02
PHP array  (0) 2020.07.02
PHP expressions  (0) 2020.07.02
PHP operator  (0) 2020.07.02

댓글