블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.06.03 14:08

[ Perl ] Perl 로 OOP 하지 않겠나(요)? - Moose #2 - 상속

사용자 삽입 이미지

 요즘은 미국 쇠고기 사태로 세상이 시끄럽습니다. 그래서 예제도 이 현실에 맞춰서 해볼까 합니다.

package Cow;
use Moose;

has name => (is => 'ro');
has age  => (is => 'ro', isa => 'Int', required => 1);

sub cry {
  my $self = shift;
  warn "Umme~";
}

sub walk {
  my $self = shift;
  warn "ummmme~ I'm walking";
}

sub eat {
    my $self = shift;
    warn "umme~ I'm eating!";
}

 Cow 라는 놈을 만들어봤습니다. 나름대로 누렁이, 흰둥이라는 이름(name)을 가질 것이고, 몇 개월짜리 인지 나이(age)를 가지게 됩니다. 이름은 속일 수 있어도, 나이는 속여서는 안된다는 신념하에서 Int 형의 값을 받기를 원하고, 나이는 반드시 넣어줘야 하는 그런 소망을 넣어봤습니다.
 기본적으로 소는 울고(cry), 걷고(walk), 먹는(eat) 행동을 하게 됩니다.

 자, 그리고 위의 Cow를 상속받아서 MadCow 를 만듭니다.

package Madcow;
use Moose;

has 'feed' => (is => 'rw', isa => 'Str', default => 'Animal Feed' );

extends 'Cow';   # Moose 는 다중상속이 가능합니다.
                        # 그럴 때는 extends 'Cow', 'Dog', 'Chicken'; 같이 씁니다.

1;

 자.. 이렇게 만들었습니다.

my $mc = Madcow->new(
    name => 'Downer',
    age => 30,
);

 그리고 30 개월령, Downer씨를 만들어 냅니다.
$mc->cry;   # Umme~
$mc->walk;  # ummmme~ I'm walking
$mc->feed;
$mc->eat;    # umme~ I'm eating!

 Cow 의 모든 속성과 행동을 물려받은 MadCow, Downer 씨는 이렇게 평범한 삶을 살고 있었습니다. 울면(cry) Umme~ 하고 울고, 걸으면(walk) 계속 걸을 수 있었고, 먹으면(eat) 잘먹고 살고 있었다 이거죠.
 하지만 Downer 씨가 먹고 있던 것은 무엇이었을까요?
 
 has 'feed' => (is => 'rw', isa => 'Str', default => 'Animal Feed' );

 맙소사! 먹이('feed') 를 동물성 사료('Animal Feed') 를 먹고 있었던 것이죠. 이렇게 속성 값은 생성자 호출시에 정해줄 수도 있고, 기본값(default) 으로 정해줄 수도 있습니다.

 아무튼 이렇게 동물성 사료만 먹고, 별탈 없던 Downer 씨에게 어느날 PD 수첩이 와서 심층취재를 했습니다.

override 'cry' => sub {
    my $self = shift;
    if ($self->age >= 30 || $self->feed eq 'Animal Feed') {
        warn "BowWow";
    } else {
        super();
    }
};

 우선 PD 수첩 관계자는 Downer 씨가 우는 것에 대해서 진상규명을 했습니다. Downer 씨는 30개월령에다가, 이제껏 먹고 있던 먹이는 동물성 사료였다는 것이죠. 그리고 자기가 우는 소리도 모르고 있었습니다. "Umme~" 가 아니라 "BowWow" 하면서 짖고 있었던 것이었죠! 맙소사! 조금만 더 어리거나, Downer 씨 주인님께서 동물성 사료만 안먹였어도 이런일은 없었을 텐데 말이죠.
after 'walk' => sub {
    my $self = shift;
    if ($self->age >= 30 || $self->feed eq 'Animal Feed') {
        warn "BowWow! I'm down";
    } else {
        warn "Umme~ keep going!";
    }
};

 그리고 언젠가부터 걷고 나서는 계속 쓰러지고는 했습니다. "BowWow"라고 짖으면서 말이죠. 역시나 마찬가지로 조금 더 어렸거나, 동물성 사료만 안먹어도 이런 일은 없었을 텐데 말이죠!
 
 PD수첩 관계자들이 모두 떠나간 뒤로.. Downer 씨는 절망에 빠졌습니다. 내가 뭣땜에 이렇게 변했나 하구요.

before 'eat' => sub {
    my $self = shift;
    if ($self->feed eq 'Animal Feed') {
        warn "Oops.. What is this?";
    } else {
        warn "I washed my hands";
    }
};

 그리고 Downer 씨는 이제부터라도 주의를 기울이기 시작했습니다. 주인이 동물성 사료를 주고, Downer씨는 "이게 뭐냐"고 주인에게 따지기 시작했습니다. 하지만 먹을 수 밖에 없었죠. 이때마다 주인에 대한 불만은 쌓여만 갔습니다. "동물성 사료만 아니었어도..."라고 그는 항상 생각하는 듯 합니다.

...
...
후기..;; 결국 Downer 씨는 조용히 쓰러져 앉아있다가 생을 마감하려고 했는데, 주인은 그런 Downer 씨를 도축해서 <금싸라기 쇠고기 수입국> 한국으로 수출되는 배에 선적했습니다.

 전체코드입니다(Downer 씨가 도축되기 전)

{
package Cow;
use Moose;

has name => (is => 'ro');
has age  => (is => 'ro', isa => 'Int', required => 1); # 나이는 속일 수 없다!

sub cry {
  my $self = shift;
  warn "Umme~";
}

sub walk {
  my $self = shift;
  warn "ummmme~ I'm walking";
}

sub eat {
    my $self = shift;
    warn "I'm eating!";
}

}

{
package Madcow;
use Moose;

has 'feed' => (is => 'rw', isa => 'Str', default => "Animal Feed");
 # 기본적으로 동물성 사료를 제공하고 있지만, 먹이는 바꿀수 있습니다(is => 'rw')

extends 'Cow'; # Cow 를 상속

# 오버라이드
override 'cry' => sub {
    my $self = shift;
    if ($self->age >= 30 || $self->feed eq 'Animal Feed') {
        warn "BowWow";
    } else {
        super(); # Umme~
    }
};

# super() 를 호출한 뒤의 이벤트
after 'walk' => sub {
    my $self = shift;
    if ($self->age >= 30 || $self->feed eq 'Animal Feed') {
        warn "BowWow! I'm down";
    } else {
        warn "Umme~ keep going!";
    }
};

# super() 를 호출하기 전의 이벤트
before 'eat' => sub {
    my $self = shift;
    if ($self->feed eq 'Animal Feed') {
        warn "Oops.. What is this?";
    } else {
        warn "I washed my hands";
    }
};
}

1;

my $mc = Madcow->new(
    name => 'Downer',
    age => 30,
);

$mc->cry; #BowWow

$mc->walk; # BowWow! I'm down

$mc->eat; # Oops.. What is this?
                 # I'm eating

$mc->feed("Grasses");  # Grasses 를 사료로 제공

$mc->eat; # I washed my hands
                 # I'm eating

 Downer 씨, 고인의 명복을 빕니다. 또다른 Downer 씨가 사회에 나오지 않도록, 전세계 축산농가들은...

$mc->feed("Grasses");

 했으면 좋겠습니다.  (_ _)

 현실세태를 반영, Moose 를 이용한 "상속" 에 대해서 알아보았습니다.

 물론 여기에서 언급한 내용에 대한 사실 여부는 전 모르며, 이 내용은 팩션일지도 모릅니다. :-)
신고
TOTAL 473,556 TODAY 15

티스토리 툴바