Perl 객체는 표준 데이터 구조(배열, 해시, 스칼라)의 참조를 "blessing" 함으로써 구현됩니다. 역사적으로 Perl의 OOP는 해시를 통해 이루어지며, 여기서 키는 속성의 이름이고, 값은 실제 데이터입니다. 이러한 접근 방식은 유연성을 제공하지만 규율이 필요합니다: 언어는 엄격한 캡슐화 및 접근 제어자를 구현하지 않으며, 모든 것이 합의에 기반합니다.
문제: 명시적 제한 없이 속성에 대한 접근이 모든 코드에서 가능하여, 객체의 불변성이 쉽게 깨질 수 있고, 네임스페이스가 혼동될 수 있으며, 상속에서 오류가 발생할 수 있습니다.
해결책 — 합의를 철저히 준수해야 합니다: 내부 데이터를 합의에 따라 숨기고(예: 밑줄을 사용), 가능하면 accessor 메서드를 사용하며, 복잡한 작업을 위해 표준 모듈인 Moose, Moo, Class::Accessor 등을 적용하십시오.
코드 예:
package Animal; sub new { my $class = shift; my $self = { _name => shift }; bless $self, $class; return $self; } sub get_name { $_[0]->{_name} } package Dog; use parent 'Animal'; sub bark { print "Woof! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
주요 특징:
bless 없이 Perl 객체를 생성할 수 있습니까?
답변: 아니요, 오직 bless만이 일반 참조를 객체로 변환하여 '->' 메서드에 의해 인식됩니다.
base/parent의 필요성과 @ISA와의 차이는 무엇입니까?
답변: @ISA는 기본 클래스에 대한 배열입니다. base/parent는 @ISA 작업을 자동화하고 모듈 상속을 더 안전하게 만들어 중복 상속을 방지하고 추가 검사를 수행합니다.
자식 클래스가 부모 클래스의 동일 이름 메서드를 덮어쓸 수 있습니까?
답변: 예, 자식 클래스에서 동일 이름의 메서드가 정의되어 있다면, '->'는 이를 우선적으로 선택합니다 — 전형적인 "메서드 오버라이딩"이 작동합니다.
Animal 모듈에서 데이터는 공개 속성에 저장되어 있으며, 이에 대한 직접 접근이 가능합니다. 누군가 무의식적으로 외부에서 속성 값을 변경하면 객체가 비일관된 상태로 변할 수 있습니다.
장점:
단점:
모듈은 accessor를 사용하며, 모든 내부 필드는 _로 시작하고, 명확한 사양이 있으며 — 데이터 작업은 오직 get/set 메서드를 통해 이루어지고 set에 검증이 포함됩니다.
장점:
단점: