Perl에는 두 가지 다른 객체 지향 프로그래밍 구현이 있습니다.
하나는 익명 해시 테이블 방법을 기반으로 합니다. 각 개체 인스턴스의 본질은 익명 해시 테이블을 가리키는 참조입니다. 이 익명 해시 테이블에는 모든 인스턴스 속성이 저장됩니다.
두 번째는 배열 기반 방법으로, 클래스를 정의할 때 각 인스턴스 속성에 대한 배열을 생성하며, 각 개체 인스턴스의 본질은 이러한 배열의 행 인덱스를 가리키는 참조입니다. 이러한 배열에는 모든 인스턴스 속성이 저장됩니다.
객체지향에는 많은 기본 개념이 있는데 여기서는 객체, 클래스, 메소드라는 세 가지 개념을 받아들입니다.
객체(Object) : 객체는 클래스의 데이터 항목에 대한 참조입니다. .
클래스 : 클래스는 객체 메소드를 제공하는 클래스를 포함하는 Perl 패키지입니다.
메소드 : 메소드는 Perl 서브루틴이며 클래스 이름은 첫 번째 매개변수입니다.
Perl은 bless() 함수를 제공하여 객체를 생성합니다. Bless는 참조를 클래스 이름과 연결하고 참조를 반환하여 객체를 생성합니다.
클래스는 단순한 패키지일 뿐입니다.
패키지를 클래스로 사용할 수 있고, 패키지의 함수를 클래스의 메서드로 사용할 수 있습니다.
Perl의 패키지는 독립적인 네임스페이스를 제공하므로 다른 패키지의 메서드 및 변수 이름이 충돌하지 않습니다.
Perl 클래스의 파일 확장자는 .pm입니다.
다음으로 Person 클래스를 만듭니다.
패키지 사람;
클래스의 코드 범위는 스크립트 파일의 마지막 줄이나 다음 패키지 키워드 앞에 도달합니다.
클래스의 인스턴스(객체)를 생성하려면 생성자를 정의해야 합니다. 대부분의 프로그램은 클래스 이름을 생성자로 사용하지만 Perl에서는 어떤 이름이든 사용할 수 있습니다.
다양한 Perl 변수를 Perl 개체로 사용할 수 있습니다. 대부분의 경우 참조 배열이나 해시를 사용합니다.
다음으로 Perl의 해시 참조를 사용하여 Person 클래스의 생성자를 만듭니다.
객체를 생성할 때 객체에 대한 참조를 반환하는 서브루틴인 생성자를 제공해야 합니다.
예는 다음과 같습니다:
다음으로 객체를 생성합니다.
$object = new Person( "샤오밍", "왕", 23234345);
Perl 클래스의 메소드는 일반적으로 멤버 함수로 알려진 Perl 서브루틴일 뿐입니다.
객체 지향 Perl에서 Perl의 메소드 정의는 특별한 구문을 제공하지 않지만 메소드의 첫 번째 매개변수가 객체 또는 객체가 참조하는 패키지라고 규정합니다.
Perl은 개인 변수를 제공하지 않지만 보조 메소드를 통해 객체 데이터를 관리할 수 있습니다.
다음으로 이름을 가져오는 메서드를 정의합니다.
하위 getFirstName { return $self->{_firstName};}
다음과 같이 작성할 수도 있습니다.
sub setFirstName { my ( $self, $firstName ) = @_; $self->{_firstName} = 정의된 경우 $firstName($firstName); return $self->{_firstName};}
다음으로 Person.pm 파일의 코드를 다음과 같이 수정합니다.
Employee.pl 스크립트 코드는 다음과 같습니다.
위 프로그램을 실행한 후의 출력 결과는 다음과 같습니다.
$ perl Employee.pl 이름: Xiao Ming 성: Wang 번호: 23234345 설정 전 이름: Xiao Ming 설정 후 이름: Xiao Qiang
Perl의 클래스 메소드는 @ISA 배열을 통해 상속됩니다. 이 배열에는 다른 패키지(클래스)의 이름이 포함되어 있습니다. 변수 상속은 명시적으로 설정되어야 합니다.
다중 상속은 @ISA 배열에 여러 클래스(패키지) 이름이 포함되어 있음을 의미합니다.
@ISA를 통해 메소드만 상속할 수 있으며 데이터는 상속할 수 없습니다.
다음으로 Person 클래스를 상속하는 Employee 클래스를 만듭니다.
Employee.pm 파일 코드는 다음과 같습니다.
이제 Employee 클래스에는 Person 클래스의 모든 메서드와 속성이 포함되어 있습니다. main.pl 파일에 다음 코드를 입력하고 실행합니다.
위 프로그램을 실행한 후의 출력 결과는 다음과 같습니다.
$ perl main.pl 이름: Xiao Ming 성: Wang 번호: 23234345 설정 전 이름: Xiao Ming 설정 후 이름: Xiao Qiang
위의 예에서 Employee 클래스는 Person 클래스를 상속하지만 Person 클래스의 메서드가 요구 사항을 충족할 수 없는 경우 해당 메서드를 다시 작성해야 합니다.
다음으로 Employee 클래스에 몇 가지 새로운 메서드를 추가하고 Person 클래스의 메서드를 재정의합니다.
main.pl 파일에 다음 코드를 입력하고 실행합니다.
위 프로그램을 실행한 후의 출력 결과는 다음과 같습니다.
$ perl main.pl 이름: Xiao Ming 성: Wang 번호: 23234345 설정 전 하위 클래스 함수 이름: Xiao Ming 설정 후 하위 클래스 함수 이름: Xiaoqiang
요청한 메서드가 현재 클래스, 현재 클래스의 모든 기본 클래스, UNIVERSAL 클래스에 없으면 AUTOLOAD()라는 메서드를 다시 검색합니다. AUTOLOAD가 발견되면 호출되고 전역 변수 $AUTOLOAD가 누락된 메서드의 정규화된 이름으로 설정됩니다.
작동하지 않으면 Perl은 오류와 함께 실패합니다.
기본 클래스의 AUTOLOAD를 상속하지 않으려면 매우 간단합니다. 단 한 문장이면 됩니다.
하위 자동 로드;
객체에 대한 마지막 참조가 해제되면 객체가 자동으로 삭제됩니다.
소멸 중에 작업을 수행하려면 클래스에 "DESTROY"라는 메서드를 정의할 수 있습니다. 적절한 시간에 자동으로 호출되어 원하는 대로 추가 정리 작업을 수행합니다.
package MyClass;...sub DESTROY{ print "MyClass::DESTROY 호출됨n";}
Perl은 객체 참조를 DESTROY의 유일한 매개변수로 전달합니다. 이 참조는 읽기 전용이므로 $_[0]에 액세스하여 수정할 수 없습니다. (번역자 주: perlsub 참조) 그러나 객체 자체(예: "${$_[0]" 또는 "@{$_[0]}" 및 "%{$_[0]}" 등)는 아직 작성 중입니다.
소멸자가 반환되기 전에 개체 참조를 다시 축복하면 Perl은 소멸자가 반환된 후에 다시 축복한 개체의 DESTROY 메서드를 호출합니다. 이를 통해 기본 클래스 또는 지정한 다른 클래스의 소멸자를 호출할 수 있습니다. DESTROY는 수동으로 호출할 수도 있지만 일반적으로 그렇게 할 필요는 없습니다.
현재 개체가 해제되면 현재 개체에 포함된 다른 개체도 자동으로 해제됩니다.
다음 예를 통해 Perl의 객체 지향 적용을 더 자세히 이해할 수 있습니다.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
MyClass 메서드 호출: MyClass::new 호출::MyMethod 호출: MySubClass::new 호출:MyClass::MyMethod 호출: MyClass::new 호출::DESTROY 호출 MyClass::new 객체 생성 호출MyClass::DESTROY 호출 스크립트 실행 종료...MyClass::DESTROY 호출 CalledMySubClass::DESTROY 호출됨