학습
PHP 제네릭과 타입 힌트
PHP 제네릭과 타입 힌트 — 중급
제네릭과 타입 힌트
1. 도입 (왜 배워야 하는가)
PHP는 동적 타이핑 언어로, 변수의 타입을 명시하지 않고도 사용할 수 있습니다. 하지만 이는 때로 코드의 가독성과 유지보수성을 떨어뜨릴 수 있습니다. 제네릭과 타입 힌트를 사용하면, 함수나 메서드에서 사용할 데이터의 타입을 명확히 정의할 수 있어, 코드의 안정성을 높이고 실수를 줄일 수 있습니다.
예를 들어, 쇼핑몰에서 장바구니에 담을 수 있는 상품의 타입을 정의하는 과정에서 어떤 타입도 받을 수 있는 코드와, 특정 타입만 받는 코드의 차이는 명확합니다. 타입을 명시하지 않은 경우, 예를 들어 상품 아이디 대신 문자열이 들어가면, 이후에 발생할 수 있는 오류를 사전에 방지할 수 없게 됩니다.
2. 핵심 개념 설명
제네릭 (Generics)
제네릭은 특정 타입에 종속되지 않고, 클래스나 메서드가 다양한 타입을 처리할 수 있도록 하는 프로그래밍 기법입니다. 예를 들어, 다양한 종류의 데이터 리스트를 다루는 클래스에서 제네릭을 사용하면, 각 데이터 타입에 따라 별도의 클래스를 만들 필요 없이 하나의 클래스로 처리할 수 있습니다.
타입 힌트 (Type Hinting)
타입 힌트는 함수의 인자나 반환 값에 대해 미리 타입을 정의하는 기능입니다. 이는 코드의 가독성을 높이고, 잘못된 타입이 전달될 경우 즉시 오류를 발생시켜 개발자가 문제를 빠르게 인식할 수 있도록 도와줍니다.
| 용어 | 설명 |
|---|---|
| 제네릭 | 특정 타입에 종속되지 않는 프로그래밍 기법 |
| 타입 힌트 | 함수 인자나 반환 값의 타입을 미리 정의하는 기능 |
3. 기본 코드 예제
function sum(array $numbers): int {
$total = 0;
foreach ($numbers as $number) {
$total += $number;
}
return $total;
}
// 함수 호출
$result = sum([1, 2, 3, 4, 5]);
echo $result; // 15
실행 결과: 15
function sum(array $numbers): int:sum이라는 함수를 정의하고, 인자로array타입의$numbers를 받고, 반환 타입을int로 정의합니다.$total = 0;: 합계를 저장할 변수를 초기화합니다.foreach ($numbers as $number): 전달받은 배열의 각 요소를 하나씩 반복합니다.$total += $number;: 현재 요소를 총합에 더합니다.return $total;: 최종 합계를 반환합니다.
4. 실전 활용 예제
예제 1: 장바구니 클래스
class Cart {
private array $items = [];
public function addItem(string $item): void {
$this->items[] = $item;
}
public function getItems(): array {
return $this->items;
}
}
$cart = new Cart();
$cart->addItem("상품1");
$cart->addItem("상품2");
print_r($cart->getItems());
상황 설명: 쇼핑몰에서 장바구니를 구현할 때, Cart 클래스에 아이템을 추가하고 조회하는 기능을 제공합니다.
예제 2: 제네릭 리스트 클래스
class GenericList {
private array $items = [];
public function add($item): void {
$this->items[] = $item;
}
public function getAll(): array {
return $this->items;
}
}
$list = new GenericList();
$list->add(1);
$list->add("문자열");
print_r($list->getAll());
상황 설명: 다양한 타입의 데이터를 저장할 수 있는 제네릭 리스트를 생성할 때 사용합니다.
5. 흔한 실수와 주의사항
실수 1: 타입 힌트 누락
function multiply($a, $b) {
return $a * $b;
}
$result = multiply(5, "10"); // 문자열을 곱하는 경우
올바른 코드:
function multiply(int $a, int $b): int {
return $a * $b;
}
이렇게 하면 타입 오류를 미리 방지할 수 있습니다.
실수 2: 잘못된 제네릭 사용
제네릭을 사용할 때, 특정 타입만을 허용하는 경우 주의해야 합니다.
class Box {
private array $items = [];
public function addItem($item) {
// 모든 타입 허용
}
}
올바른 코드:
class Box {
private array $items = [];
public function addItem(string $item): void {
$this->items[] = $item;
}
}
문자열만 허용하도록 설정하여 안전성을 높일 수 있습니다.
6. 정리
다음에 학습하면 좋은 주제: PHP의 인터페이스와 추상 클래스. 이 주제를 통해 객체지향 프로그래밍의 기초를 다질 수 있습니다.