블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2008.06.02 17:23

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

 -----

 Perl 에서 OOP라면 고개를 갸우뚱 거리실 분들이 많으실 겁니다. 그 이전에 Perl 에서 고개를 갸우뚱 하실 분들도 계실지도 모르겠습니다. orz..

 저 역시도 OOP, Perl 에서의 OOP라면 고개를 갸우뚱 하는 사람 중에 하나 입니다. 서브루틴들을 싹 긁어모아서, package Blah; ~ 1; 안에다가 넣고 어쩌구 저쩌고 하는 게 다였거든요. 그러다 보면 코드는 중복이고, 비슷비슷한 기능하는 것들이 너무나도 많고, 네이밍 센스가 하도 저질이라서 뭘 그렇게 find 하는 것 많고 set 하는 거 많고 write 하는 거 많은 지 모를 정도이죠.

 이렇게 1000줄, 2000줄 넘어가다가 보면 결국은 맥을 놔버립니다. (전 맥을 사용합니다 :-))
 에러나면 부랴부랴 코드보고 대충대충 디버그 해놓으면 나중에는 결국 더 심각한 버그가 쌓이고 쌓이고...
 처음부터 제대로 기반을 만들지 못했으니, GIGO의 예제들을 책으로 내면 그 자체가 GIGO의 바이블이 될 정도로 허접하고 사이비한 코드들이 태반입니다. OOP는 둘째치고 감각적인 코드를 만들어내지 못했던 것이죠. 그냥 평범한 스크립트 작업에 그렇게 기합을 넣고 할 필요가 없다는 것도 제 지론(?)이기도 했습니다.

 그런 지론을 좀 바꿔볼까하며 Perl OOP에 대한 이야기를 시작해보려고 합니다.
package Whitecat;
use strict;
use warnings;

sub new {
  my ($class, $args) = @_;

  return bless {
      name => $args->{name},
      age    => $args->{age},
   }, $class;
}

sub name {
 return shift->{name};
}

sub age {
 return shift->{age};
}

1;

my $who = Whitecat->new({
    name => 'haak_cat',
    age  => '30',
});

print $who->name; # haak_cat 이 찍힙니다.

 이것이 간단한 Perl OOP의 예제입니다.

 package Whitecat;
 (blahblahblah...)
 1;

 까지가 Class 를 정의한 것입니다. Whitecat 이라는 것은 클래스이름이죠.

 이건 왜 넣어야 되는가? 궁금하시면 IRC로 오세요. #perl-kr@irc.freenode.org

use strict;
use warnings;

 이것은 생성자(Constructor)입니다. 여기서 클래스를 초기화해주겠죠?

sub new {
  my ($class, $args) = @_;

  return bless {
      name => $args->{name},
      age    => $args->{age},
   }, $class;
}

 이것들은 접근자(Accessor) 입니다.

sub name {
 return shift->{name};
}

sub age {
 return shift->{age};
}

 그리고 이렇게 정의된 클래스를 한번 사용해 봅니다.

my $whitecat = Whitecat->new({
    name => 'haak_cat',
    age  => '30',
});

print $whitecat->name; # haak_cat 이 찍힙니다.

 대충 감을 잡으셨나요? 어때요? 참 쉽죠?
 근데 Perl OOP 이정도면 누구나 다 아는 사실 입니다. 사실 누구나 펄 스크립트 짤 때 이런 식으로 쉽게 한다는 것이죠.
 요즘 Perl 계에서 붐이 불고 있는 하나의 모듈이 있습니다.

사용자 삽입 이미지

간지폭발 Mooooooooose


말그대로 A Postmodern Object System 인데요. 그럼 왜 이게 Postmodern 한지 한번 보도록 하죠.

package Whitecat;
use Moose;

has name => (is => 'ro');
has age  => (is => 'ro');

1;

my $whitecat = Whitecat->new(
    name => "haak_cat",
    age  => 30,
);

print $whitecat->name;

 위의 장황하던 코드가 이렇게 깔끔하게 바뀌었습니다.

 이 부분은 바뀐 것이 없습니다.
 package Whitecat;
 (blahblahblah...)
 1;

 use Moose; 함으로써 ust strict; use warnings; 를 해줄 필요가 없어집니다. 
use Moose;

 접근자는 이렇게 간단하게 만들 수 있습니다. 
has name => (is => 'ro');
has age  => (is => 'ro');

 그리고 이렇게 정의된 클래스를 어떻게 사용하느냐면...

my $whitecat = Whitecat->new(
    name => "haak_cat",
    age  => 30,
);

print $whitecat->name;

 사용법은 같습니다. 생성자(new) 를 정의하지 않아도 Moose 가 알아서 해주죠. 이 부분은 걱정해주지 않으셔도 됩니다. 이름찍으면 역시 이름이, 나이를 찍으면 나이가 나옵니다.
 
 Moo~~~se. 어떤가요? 보다 가독성 있고, 간결한 코드를 만들어버릴 수 있을 것 같지 않나요?
 일단은 첫번째 이야기는 이정도에서 그치겠습니다. 저도 좀 더 봐둬야 되겠고,
 보면서 기존의 IRC BOT 스크립트를 Moose 로 바꿔볼까 하고 생각하고 있습니다.


신고
TOTAL 473,916 TODAY 94

티스토리 툴바