글
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에 대한 이야기를 시작해보려고 합니다.
이것이 간단한 Perl OOP의 예제입니다.
까지가 Class 를 정의한 것입니다. Whitecat 이라는 것은 클래스이름이죠.
이건 왜 넣어야 되는가? 궁금하시면 IRC로 오세요. #perl-kr@irc.freenode.org
이것은 생성자(Constructor)입니다. 여기서 클래스를 초기화해주겠죠?
이것들은 접근자(Accessor) 입니다.
그리고 이렇게 정의된 클래스를 한번 사용해 봅니다.
대충 감을 잡으셨나요? 어때요? 참 쉽죠?
근데 Perl OOP 이정도면 누구나 다 아는 사실 입니다. 사실 누구나 펄 스크립트 짤 때 이런 식으로 쉽게 한다는 것이죠.
요즘 Perl 계에서 붐이 불고 있는 하나의 모듈이 있습니다.

말그대로 A Postmodern Object System 인데요. 그럼 왜 이게 Postmodern 한지 한번 보도록 하죠.
위의 장황하던 코드가 이렇게 깔끔하게 바뀌었습니다.
이 부분은 바뀐 것이 없습니다.
use Moose; 함으로써 ust strict; use warnings; 를 해줄 필요가 없어집니다.
접근자는 이렇게 간단하게 만들 수 있습니다.
그리고 이렇게 정의된 클래스를 어떻게 사용하느냐면...
사용법은 같습니다. 생성자(new) 를 정의하지 않아도 Moose 가 알아서 해주죠. 이 부분은 걱정해주지 않으셔도 됩니다. 이름찍으면 역시 이름이, 나이를 찍으면 나이가 나옵니다.
Moo~~~se. 어떤가요? 보다 가독성 있고, 간결한 코드를 만들어버릴 수 있을 것 같지 않나요?
일단은 첫번째 이야기는 이정도에서 그치겠습니다. 저도 좀 더 봐둬야 되겠고,
보면서 기존의 IRC BOT 스크립트를 Moose 로 바꿔볼까 하고 생각하고 있습니다.
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 이 찍힙니다.
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;
(blahblahblah...)
1;
까지가 Class 를 정의한 것입니다. Whitecat 이라는 것은 클래스이름이죠.
이건 왜 넣어야 되는가? 궁금하시면 IRC로 오세요. #perl-kr@irc.freenode.org
use strict;
use warnings;
use warnings;
이것은 생성자(Constructor)입니다. 여기서 클래스를 초기화해주겠죠?
sub new {
my ($class, $args) = @_;
return bless {
name => $args->{name},
age => $args->{age},
}, $class;
}
my ($class, $args) = @_;
return bless {
name => $args->{name},
age => $args->{age},
}, $class;
}
이것들은 접근자(Accessor) 입니다.
sub name {
return shift->{name};
}
sub age {
return shift->{age};
}
return shift->{name};
}
sub age {
return shift->{age};
}
그리고 이렇게 정의된 클래스를 한번 사용해 봅니다.
my $whitecat = Whitecat->new({
name => 'haak_cat',
age => '30',
});
print $whitecat->name; # haak_cat 이 찍힙니다.
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;
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;
(blahblahblah...)
1;
use Moose; 함으로써 ust strict; use warnings; 를 해줄 필요가 없어집니다.
use Moose;
접근자는 이렇게 간단하게 만들 수 있습니다.
has name => (is => 'ro');
has age => (is => 'ro');
has age => (is => 'ro');
그리고 이렇게 정의된 클래스를 어떻게 사용하느냐면...
my $whitecat = Whitecat->new(
name => "haak_cat",
age => 30,
);
print $whitecat->name;
name => "haak_cat",
age => 30,
);
print $whitecat->name;
사용법은 같습니다. 생성자(new) 를 정의하지 않아도 Moose 가 알아서 해주죠. 이 부분은 걱정해주지 않으셔도 됩니다. 이름찍으면 역시 이름이, 나이를 찍으면 나이가 나옵니다.
Moo~~~se. 어떤가요? 보다 가독성 있고, 간결한 코드를 만들어버릴 수 있을 것 같지 않나요?
일단은 첫번째 이야기는 이정도에서 그치겠습니다. 저도 좀 더 봐둬야 되겠고,
보면서 기존의 IRC BOT 스크립트를 Moose 로 바꿔볼까 하고 생각하고 있습니다.
'IT > Perl' 카테고리의 다른 글
| [ Perl ] Perl 로 OOP 하지 않겠나(요)? - Moose #번외편 (0) | 2008/06/02 |
|---|---|
| [ Perl ] Perl 로 OOP 하지 않겠나(요)? - Moose #1 (2) | 2008/06/02 |
| [ Perl ] IRC BOT을 만들어봅시다 :-) #6 (2) | 2008/05/29 |
| [ Perl ] IRC BOT을 만들어봅시다 :-) #5 (0) | 2008/05/27 |
RECENT COMMENT