IMCAT.DEV
로그인 가입
PHP 중급 문법

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의 인터페이스와 추상 클래스. 이 주제를 통해 객체지향 프로그래밍의 기초를 다질 수 있습니다.