정상우
hELLO.
정상우
전체 방문자
384,511
오늘
130
어제
1,174
  • hELLO. (121)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (20)
      • 에세이 (4)
      • 개발자스럽게 살기 (14)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • php
  • go
  • 블록체인
  • 포트폴리오
  • 개발
  • 라라벨
  • 프로그래머스
  • Algorithm
  • 코딩테스트
  • 개발 리뷰

최근 댓글

  • 고맙습니다 ~^^
    정상우
  • 오늘 블로그 만들었는데 검색하⋯
    엥뿌삐
  • 좋은 스킨 정말 감사드립니다.⋯
    이태홍
  • 고맙습니다 ㅎㅎ
    정상우
  • 제가 원하던 최고의 스킨입니다⋯
    _HEON

최근 글

  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯
  • [Laravel] 카페24 호스팅에 라⋯
    2022.03.29
    [Laravel] 카페24 호스팅에 라⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/PHP & Laravel

PHP: 추상화 (추상 클래스, 인터페이스, 트레이트)

2020. 4. 18. 16:49

추상화

추상화를 한다는 것은 형식만 선언한 채 구현은 사용자에게 맡기는 것을 이야기합니다. 메서드의 이름, 파라매터, 반환 값 등을 선언만 한 채 상속과 같은 개념을 사용하여 내용을 구현합니다. 추상화를 사용하면 구현에 상관없이 특정한 인터페이스에 맞춰서 메서드를 콜하거나 데이터를 받음으로서 소통할 수 있다는 좋은 점이 있는데, 상속과 함께 이것을 사용하면 확장성이 눈에 띄게 상승합니다.

추상 클래스

추상 클래스는 일부는 구현하지 않고, 일부는 구현한 상태로 제공하며 상속의 형태로 진행하기 때문에 계를 표현하는 용도로 쓰는 것이 좋습니다. 일반적인 클래스와 마찬가지로 메서드와 프로퍼티를 가질 수 있지만 추상 메서드는 private 가시성으로 선언될 수 없습니다.

abstract

추상 클래스는 abstract 키워드를 사용하여 나타냅니다. 추상 메서드는 구현이 포함되어서는 안 되며 일반 메서드처럼 반환값, 파라매터 명시 해줄 수 있습니다. 상속받을 때는 일반 클래스처럼 extends 키워드를 사용하면 됩니다. 한 가지 주요한 특징이 있는데, 추상 클래스는 객체를 생성할 수 없습니다. 이것이 일반 클래스와 추상 클래스가 가지는 큰 차이점 중 하나이기도 합니다.

abstract class A
{
    abstract public function foo();
}

class B extends A
{
    public function foo()
    {
        return __CLASS__;
    }
}
추상 클래스 또한 상속을 사용하고 있으므로 부모 클래스 타입에 자식 클래스 인스턴스를 넘길 수 있습니다.

인터페이스

인터페이스는 상속으로 사용하지 않으며, 자식 클래스가 구현할 떄 implements 라는 별도의 키워드를 사용합니다. 추상 클래스와는 다르게 구현부가 포함될 수 없습니다. 게다가 프로퍼티를 가질 수 없습니다. 인터페이스의 메서드들은 반드시 public 가시성으로 선언되어야 합니다. 인터페이스라는 것은 외부와 소통하기 위한 것이기 때문입니다. 다만 이러한 제약은 언어마다 조금의 차이가 있을 수 있습니다.

 

인터페이스는 상속으로 표현되는 것이 아니기에 인터페이스와 구현체의 관계가 계가 될 필요는 없습니다. 의미를 되새겨보면 인터페이스는 기능적인 측면을 강조하기 때문에 해당 기능만 구현된다면 어떤 구현체가 와도 다 받을 수 있기 때문입니다. PHP: 자료형에서 언급했던 iterator 인터페이스가 하나의 예입니다.

interface

인터페이스를 정의할 때는 interface 키워드를 사용하고, 위에서 이야기한 제약처럼 오직 구현되지 않은 public 메서드만 선언합니다. 추상 클래스처럼 abstract 를 붙일 필요는 없습니다. 또한 인터페이스에 포함된 모든 메서드를 구현해야 합니다. 인터페이스 끼리는 extends 키워드를 사용하여 확장을 할 수도 있습니다.

interface A
{
    public function foo();
}

class B implements A
{
    public function foo()
    {
        return __CLASS__;
    }
}
인터페이스의 타입을 받는 함수나 메서드라면 해당 인터페이스를 구현한 클래스를 모두 매개변수로써 받을 수 있습니다.

트레이트

트레이트는 PHP 에서 제공하는 특이한 형태의 기능입니다. 클래스도 아니고, 인터페이스도 아니며, 다중 상속 대신에 사용하는 것이기도 합니다. 예를 들어 사람의 뇌에서는 여러가지 연산을 할 수 있는데 인공지능이 사람의 뇌를 모방하여 진행한다고 가정했을 때 연산 기능에 대한 특징만을 제공받는 것입니다. 상속으로 표현하기에도, 인터페이스를 사용하기에도 애매한 경우 트레이트를 사용하면 가능합니다.

trait

트레이트는 클래스 내부에서 use 키워드를 사용하여 나타낼 수 있고, 클래스의 일부를 표현한 것이라고 봐도 상관없습니다. 따라서 프로퍼티와 메서드를 둘 다 가질 수 있고, 추상 메서드 또한 가질 수 있습니다.

trait A
{
    public $message = 'Hello, world';

    public function hello()
    {
        return $this->foo();
    }

    abstract public function foo();
}

다중 트레이트

하나의 클래스에서 여러개의 트레이트를 사용할 때 메서드의 충돌이 있을 수 있는데, insteadof 키워드를 사용하면 처리할 수 있고, as 키워드를 사용하면 새로운 가시성과 별칭을 부여할 수 있습니다.

trait AA
{
    public function hello()
    {
        return __TRAIT__;
    }
}

trait AAA
{
    use A, AA {
        A::hello insteadof AA;
        A::hello as protected h;
    }
}

class B
{
    use AAA;

    public function foo()
    {
        return $this->message;
    }
}

상속 vs 트레이트 vs 재정의

같은 메서드에 대해 상속, 트레이트, 재정의를 함께 사용했을 경우 우선 순위는 어떨까요? 결론부터 이야기하자면, 재정의 > 트레이트 > 상속 순서입니다. 사실 클래스를 그냥 읽을 때도 보면 상속이 제일 먼저 되어 있기에 덮어질 것이라는 것은 대강 짐작할 수 있을 것입니다.

class C
{
    private $message = 'Hello, world';

    public function hello()
    {
        return $this->message;
    }
}

trait D
{
    public function hello()
    {
        return __TRAIT__;
    }
}

class E extends C
{
    use D;

    public function hello()
    {
        return __CLASS__;
    }
}

$e = new E();
var_dump($e->hello()); // -> E

더 읽을거리

PHP: 매직 메서드

https://www.inflearn.com/course/php7-reboot

https://www.inflearn.com/course/php7-oop

PHP 카테고리 목차 및 문서 정리

2020년, PHP 언어가 가지는 의미

https://www.php.net/manual/en/

    '언어 & 프레임워크/PHP & Laravel' 카테고리의 다른 글
    • PHP: 네임스페이스
    • PHP: 매직 메서드
    • PHP: 상속 (생성자, 가시성, Final)
    • PHP: Static (정적 변수, 정적 메서드, 늦은 정적 바인딩)
    php, 인터페이스, 추상 클래스, 추상화, 트레이트
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    다음 글
    PHP: 매직 메서드
    이전 글
    PHP: 상속 (생성자, 가시성, Final)
    • 이전
    • 1
    • ···
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • ···
    • 121
    • 다음

    티스토리툴바