Perl에서 객체 지향 프로그래밍은 즉시 구현되지 않았습니다 — 원래 언어는 절차적이었습니다. OOP는 해시 및 패키지를 기반으로 한 동적 구조를 도입하여 추가되었습니다. Perl은 대부분의 다른 언어와 달리 내장된 class 키워드를 사용하지 않으며, 패키지와 링크에 대한 blessing을 사용합니다.
Perl OOP의 첫 번째 버전은 단순히 함수를 내보내는 패키지와 bless 함수를 통해 패키지에 귀속된 데이터 구조(일반적으로 해시)입니다. 이후, 메타 클래스, 속성, 역할을 구현하는 Moose/Mouse/Moo과 같은 CPAN 모듈이 등장했습니다.
OOP에 대한 통일된 패턴이 없기 때문에 다양하고 프로젝트 간 OOP 코드의 호환성 문제가 발생합니다. 언어의 동적 성질로 인해 (이름 오류, 조기/늦은 바인딩, 수동으로 bless하는 메서드 조작) 오류가 발생할 수 있습니다.
코드 예제:
package Animal; sub new { my ($class, %args) = @_; bless { %args }, $class; } sub speak { my $self = shift; print "동물이 말합니다. "; } package Cat; our @ISA = ('Animal'); sub speak { my $self = shift; print "고양이가 야옹합니다. "; } my $cat = Cat->new(name => 'Barsik'); $cat->speak; # 고양이가 야옹합니다.
주요 특징:
new에서 bless되지 않은 링크 대신 단순 해시를 반환하면 어떻게 되나요?
bless되지 않은 링크를 반환하면, 이후 메서드를 통해 객체에 접근하려 할 때 패키지와의 연결이 끊어져 필요한 메서드를 찾지 못하고 치명적인 오류가 발생합니다.
Perl은 다중 상속과 메서드 충돌을 어떻게 해결하나요?
Perl은 다중 상속을 허용합니다 — @ISA 배열에 여러 패키지가 있을 수 있습니다. 메서드 탐색은 너비 우선 방식으로, 왼쪽에서 오른쪽으로 모든 부모를 탐색합니다. 충돌이 발생할 경우, 첫 번째로 발견된 메서드가 선택됩니다.
Perl에서 실행 중에 객체를 "재bless"할 수 있나요, 그리고 이는 무엇을 의미하나요?
네, bless를 통해 실행 중에 객체의 패키지를 변경할 수 있습니다. 이는 객체의 "유형"을 변경하는 데 사용할 수 있습니다. 그러나 객체의 내부 내용과 새로운 메서드 간의 불일치 위험이 있습니다.
예:
bless $cat, 'Dog'; # 이제 $cat은 개처럼 행동합니다!
프로젝트에서 초기화되지 않은 배열로 bless를 통해 객체를 만들고, 메서드는 해시 링크를 기대합니다. 프로그램은 모든 메서드를 호출할 때 실패하며, Perl의 구문은 어떤 것이라도 bless할 수 있게 해줍니다.
장점:
단점:
Moose를 사용하고 검증된 생성자를 사용하며, 속성의 강력한 유형 지정, 접근 메서드의 자동 생성 및 객체 간 관계의 간결한 설명.
장점:
단점: