Perl에서 객체는 일반적으로 해시의 참조이며, "슬롯"(slots)은 객체 데이터를 저장하는 해시의 개별 필드입니다. 코드 절약과 동적 메서드 생성을 위해 종종 마법의 메서드 AUTOLOAD를 사용합니다.
AUTOLOAD는 존재하지 않는 메서드 호출을 가로채고 이를 동적으로 "즉석에서" 구현할 수 있게 해줍니다. 예를 들어, 게터 및 세터 메서드를 자동으로 생성할 수 있습니다:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "해당 슬롯 $field 없음" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
위험 요소:
AUTOLOAD는 메서드를 직접 정의하는 것과 어떻게 다른가요? 클래스의 모든 접근자에 대해 AUTOLOAD를 사용하는 것의 단점은 무엇인가요?
답변: AUTOLOAD는 실행 단계에서 작동하며, 명시적 메서드와는 다릅니다. 일반적으로 잘못된 메서드 이름과 관련된 오류는 실행 시에만 발생하고 컴파일 단계에서는 발생하지 않아 디버깅이 어렵습니다. 잘못된 사용 예:
$obj->fop; # foo 대신 — 컴파일 오류가 발생하지 않고 AUTOLOAD에 들어갑니다.
가능한 한 eval을 통해 명시적으로 메서드를 생성하는 것이 좋습니다.
이야기
이야기
이야기
객체 직렬화 라이브러리에서 AUTOLOAD를 통해 자동으로 메서드를 생성했지만, 특별한 DESTROY 메서드를 구현하는 것을 잊어버려, 객체 삭제 시 AUTOLOAD가 작동하고 DESTROY 메서드가 없다는 오류가 발생하며 메모리 누수가 발생했습니다.