๐Ÿฆ‰ Perl์˜ Moose: ํ˜„๋Œ€์  ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ ์„ธ๊ณ„ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿฆ‰ Perl์˜ Moose: ํ˜„๋Œ€์  ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ ์„ธ๊ณ„ ๐Ÿš€

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ํ•  ๊ฑฐ์•ผ. ๋ฐ”๋กœ Perl์˜ Moose๋ผ๋Š” ๋†€๋ผ์šด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑฐ๊ฑฐ๋“ . ๐ŸŽ‰ ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ?

๋จผ์ €, Perl์ด ๋ญ”์ง€ ๋ชจ๋ฅด๋Š” ์นœ๊ตฌ๋“ค์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. Perl์€ ์‹ค์šฉ์ ์ธ ์ถ”์ถœ ๋ฐ ๋ณด๊ณ  ์–ธ์–ด(Practical Extraction and Report Language)์˜ ์•ฝ์ž๋กœ, 1987๋…„์— ๋ž˜๋ฆฌ ์›”์ด ๋งŒ๋“  ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์•ผ. ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋˜์–ด ์žˆ๊ณ , ์œ ์—ฐ์„ฑ์ด ๋›ฐ์–ด๋‚˜์„œ "์Šค์œ„์Šค ๊ตฐ์šฉ ์นผ"์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋Œ€. ๊ทผ๋ฐ ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘์ ์œผ๋กœ ๋ณผ ๊ฑด Perl์˜ Moose๋ผ๋Š” ํŠน๋ณ„ํ•œ ๋…€์„์ด์•ผ.

Moose๋Š” Perl์— ํ˜„๋Œ€์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ํ™•์žฅ ๋ชจ๋“ˆ์ด์•ผ. ๋งˆ์น˜ Perl์— ์Šคํ…Œ๋กœ์ด๋“œ๋ฅผ ์ฃผ์‚ฌํ•œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ ๋‚˜ ํ• ๊นŒ? ๐Ÿ˜„ Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ Moose์˜ ์„ธ๊ณ„๋กœ ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณผ ํ…๋ฐ, ์ค€๋น„๋์ง€?

๐ŸŒŸ ์žฌ๋Šฅ๋„ท ํŒ: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ Perl ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ? ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊นŠ์ด ์žˆ๋Š” ์ดํ•ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ!

๐ŸฆŒ Moose๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ๐Ÿค”

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Moose์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. Moose๋ผ๋Š” ์ด๋ฆ„์ด ์™œ ๋ถ™์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š์•„? Moose๋Š” ์˜์–ด๋กœ 'ํฐ ์‚ฌ์Šด'์„ ์˜๋ฏธํ•ด. ์™œ ํ•˜ํ•„ ์‚ฌ์Šด์ด๋ƒ๊ณ ? ๊ธ€์Ž„, ์•„๋งˆ๋„ Moose๊ฐ€ Perl์˜ ์„ธ๊ณ„์—์„œ ํฌ๊ณ  ๊ฐ•๋ ฅํ•œ ์กด์žฌ๋ผ๋Š” ๊ฑธ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‚˜ ๋ด. ๐ŸฆŒ

Moose๋Š” Perl 5์— ํ˜„๋Œ€์ ์ด๊ณ  ์„ ์–ธ์ ์ธ ๊ฐ์ฒด ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•˜๋Š” ํฌ์ŠคํŠธ๋ชจ๋˜ ๊ฐ์ฒด ์‹œ์Šคํ…œ์ด์•ผ. ๋ญ” ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ!

์ผ๋‹จ Moose๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:

  • ํด๋ž˜์Šค์™€ ์—ญํ• (role) ์„ ์–ธ์„ ์œ„ํ•œ ์„ ์–ธ์  ๊ตฌ๋ฌธ
  • ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ
  • ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ
  • ์ƒ์†๊ณผ ๋‹ค์ค‘ ์ƒ์† ์ง€์›
  • ์ž๋™ ์ƒ์„ฑ์ž์™€ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ
  • ์†์„ฑ ์œ„์ž„

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•๋ถ„์— Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋“ฏ์ด ๊ฐ์ฒด ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ.

๐Ÿฏ ๊ฟ€ํŒ: Moose๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ์ข€ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ! ์กฐ๊ธˆ๋งŒ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ •๋ง ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ผ๋Š” ๊ฑธ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์ฒ˜์Œ ์ž์ „๊ฑฐ ํƒ€๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ๋•Œ์ฒ˜๋Ÿผ, ์ฒ˜์Œ์—” ์–ด๋ ต์ง€๋งŒ ํ•œ๋ฒˆ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ •๋ง ์ฆ๊ฑฐ์›Œ์งˆ ๊ฑฐ์•ผ!

Moose๋Š” Perl ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์—„์ฒญ๋‚œ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ์–ด. ์™œ ๊ทธ๋Ÿด๊นŒ? ๋ฐ”๋กœ Moose๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค ๋•Œ๋ฌธ์ด์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด, ํƒ€์ž… ์ฒดํ‚น, ์ž๋™ ์ƒ์„ฑ์ž, ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ถ์„ ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ฑฐ๋“ .

Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ผ. ์ด๊ฑด ํŠนํžˆ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ •๋ง ์ค‘์š”ํ•œ ์žฅ์ ์ด์•ผ. ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ณ  ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์œผ๋ฉด, ๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๊ฑฐ๋“ .

Moose์˜ ์ฃผ์š” ํŠน์ง• Moose ํด๋ž˜์Šค์™€ ์—ญํ•  ํƒ€์ž… ์‹œ์Šคํ…œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒ์† ์ž๋™ ์ƒ์„ฑ์ž ์†์„ฑ ์œ„์ž„

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Moose์˜ ์ฃผ์š” ํŠน์ง•๋“ค์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ง€? ์ด ํŠน์ง•๋“ค์ด ๋ฐ”๋กœ Moose๋ฅผ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ๋กœ ๋งŒ๋“œ๋Š” ์š”์†Œ๋“ค์ด์•ผ. ์ด์ œ ์ด ํŠน์ง•๋“ค์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐Ÿ—๏ธ Moose๋กœ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

์ž, ์ด์ œ Moose๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹ค์ œ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์•ผ. ๊ฑฑ์ • ๋งˆ, ์–ด๋ ต์ง€ ์•Š์•„! ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ์„ ๊ฑฐ์•ผ. ๐Ÿ˜Š

๋จผ์ €, Moose๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Perl ์Šคํฌ๋ฆฝํŠธ์˜ ๋งจ ์œ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด:

use Moose;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Moose์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ. ๊ฐ„๋‹จํ•˜์ง€?

์ด์ œ ์‹ค์ œ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, '๋™๋ฌผ'์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

package Animal;
use Moose;

has 'name' => (is => 'rw', isa => 'Str');
has 'age'  => (is => 'rw', isa => 'Int');

sub make_sound {
    my $self = shift;
    print $self->name . " makes a sound.\n";
}

1;

์šฐ์™€, ์ด๊ฒŒ ๋ญ˜๊นŒ? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • package Animal;: ์ด๊ฑด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด์•ผ.
  • use Moose;: Moose๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฑฐ์•ผ.
  • has 'name' => (is => 'rw', isa => 'Str');: ์ด๊ฑด 'name'์ด๋ผ๋Š” ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. 'rw'๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๊ณ , 'Str'์€ ๋ฌธ์ž์—ด ํƒ€์ž…์ด๋ผ๋Š” ๋œป์ด์•ผ.
  • has 'age' => (is => 'rw', isa => 'Int');: ์ด๊ฑด 'age'๋ผ๋Š” ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ. 'Int'๋Š” ์ •์ˆ˜ ํƒ€์ž…์ด๋ผ๋Š” ๋œป์ด์ง€.
  • sub make_sound { ... }: ์ด๊ฑด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด์•ผ. ๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์–ด.
  • 1;: ์ด๊ฑด Perl ๋ชจ๋“ˆ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ด€๋ก€์ ์ธ ํ‘œํ˜„์ด์•ผ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'Animal' ํด๋ž˜์Šค๊ฐ€ ์™„์„ฑ๋œ ๊ฑฐ์•ผ! ์ •๋ง ๊ฐ„๋‹จํ•˜์ง€? Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

๐ŸŒฑ ์ดˆ๋ณด์ž ํŒ: ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์†์„ฑ(๋ฐ์ดํ„ฐ)์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š”์ง€, ์–ด๋–ค ํ–‰๋™(๋ฉ”์„œ๋“œ)์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•ด๋ณด๋Š” ๊ฒŒ ์ข‹์•„. ๋งˆ์น˜ ์บ๋ฆญํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ์ž„์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ์žฌ๋ฏธ์žˆ์„ ๊ฑฐ์•ผ!

์ด์ œ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์–ด:

my $dog = Animal->new(name => 'Buddy', age => 5);
$dog->make_sound();  # ์ถœ๋ ฅ: Buddy makes a sound.

์™€! ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์–ด. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„?

Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด. ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์†์„ฑ์„ ์ •์˜ํ•˜๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ์ •๋ง ์‰ฝ์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ Moose์˜ ๋งค๋ ฅ์ด์•ผ!

Animal ํด๋ž˜์Šค ๊ตฌ์กฐ Animal ํด๋ž˜์Šค ์†์„ฑ: - name (Str) - age (Int) ๋ฉ”์„œ๋“œ: - make_sound()

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Animal ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. ํด๋ž˜์Šค๋Š” ์†์„ฑ(๋ฐ์ดํ„ฐ)๊ณผ ๋ฉ”์„œ๋“œ(ํ–‰๋™)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€. ์ด๋ ‡๊ฒŒ ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ.

Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ํด๋ž˜์Šค ์„ค๊ณ„๋ฅผ ์ •๋ง ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ž˜์„œ ๋งŽ์€ Perl ๊ฐœ๋ฐœ์ž๋“ค์ด Moose๋ฅผ ์‚ฌ๋ž‘ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€!

๐Ÿš€ ๋„์ „ ๊ณผ์ œ: ๋ฐฉ๊ธˆ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ 'Car' ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๋ž˜? 'brand', 'model', 'year' ์†์„ฑ์„ ๊ฐ€์ง€๊ณ , 'start_engine'์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

์ž, ์ด์ œ Moose๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์•ผ. Moose๋Š” ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Moose์˜ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐Ÿงฌ Moose์˜ ์ƒ์†๊ณผ ๋‹ค์ค‘ ์ƒ์†

์ž, ์ด์ œ Moose์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ ์ƒ์†์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ƒ์†์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ, ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿ˜Š

์ƒ์†์€ ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ๋งˆ์น˜ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์œ ์ „์ž๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๊ธฐ์กด ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ตฌ์กฐ๋ฅผ ๋” ์ฒด๊ณ„์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

Moose์—์„œ๋Š” ์ƒ์†์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ๋งŒ๋“  'Animal' ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ 'Dog' ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ?

package Dog;
use Moose;

extends 'Animal';

has 'breed' => (is => 'rw', isa => 'Str');

override 'make_sound' => sub {
    my $self = shift;
    print $self->name . " barks: Woof! Woof!\n";
};

1;

์šฐ์™€, ์ด๊ฒŒ ๋ญ˜๊นŒ? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • extends 'Animal';: ์ด ๋ถ€๋ถ„์ด ๋ฐ”๋กœ 'Animal' ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค๋Š” ๋œป์ด์•ผ.
  • has 'breed' => (is => 'rw', isa => 'Str');: 'Dog' ํด๋ž˜์Šค์—๋งŒ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์–ด.
  • override 'make_sound' => sub { ... };: ์ด๊ฑด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ 'make_sound' ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ(์žฌ์ •์˜)ํ•˜๋Š” ๊ฑฐ์•ผ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'Dog' ํด๋ž˜์Šค๋Š” 'Animal' ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํŠน์„ฑ์„ ๋ฌผ๋ ค๋ฐ›์œผ๋ฉด์„œ๋„, ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด. ๋ฉ‹์ง€์ง€ ์•Š์•„?

๐Ÿพ ๊ฐœ๋… ์ •๋ฆฌ: ์ƒ์†์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ '์ž์‹ ํด๋ž˜์Šค' ๋˜๋Š” '์„œ๋ธŒ ํด๋ž˜์Šค'๋ผ๊ณ  ํ•ด. ์ƒ์†์„ ํ•ด์ค€ ์›๋ž˜ ํด๋ž˜์Šค๋Š” '๋ถ€๋ชจ ํด๋ž˜์Šค' ๋˜๋Š” '์Šˆํผ ํด๋ž˜์Šค'๋ผ๊ณ  ๋ถˆ๋Ÿฌ. ์šฐ๋ฆฌ ์˜ˆ์ œ์—์„œ๋Š” 'Dog'๊ฐ€ ์ž์‹ ํด๋ž˜์Šค, 'Animal'์ด ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ ๊ฑฐ์ง€!

์ด์ œ ์ด 'Dog' ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ?

my $buddy = Dog->new(name => 'Buddy', age => 5, breed => 'Golden Retriever');
$buddy->make_sound();  # ์ถœ๋ ฅ: Buddy barks: Woof! Woof!

์™€! 'Dog' ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์–ด. 'Animal' ํด๋ž˜์Šค์˜ ์†์„ฑ(name, age)๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , 'Dog' ํด๋ž˜์Šค๋งŒ์˜ ์†์„ฑ(breed)๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๊ฒŒ๋‹ค๊ฐ€ 'make_sound' ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„?

ํ•˜์ง€๋งŒ Moose์˜ ์ƒ์† ๊ธฐ๋Šฅ์€ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์•ผ. Moose๋Š” ๋‹ค์ค‘ ์ƒ์†๋„ ์ง€์›ํ•ด! ๋‹ค์ค‘ ์ƒ์†์ด ๋ญ๋ƒ๊ณ ? ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ๋™์‹œ์— ์ƒ์†๋ฐ›๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ:

package SuperDog;
use Moose;

extends 'Dog', 'SuperPower';

1;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'SuperDog' ํด๋ž˜์Šค๋Š” 'Dog'์™€ 'SuperPower' ๋‘ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ๋ชจ๋‘ ๋ฌผ๋ ค๋ฐ›๊ฒŒ ๋ผ. ๋งˆ์น˜ ์Šˆํผํžˆ์–ด๋กœ ๊ฐœ๋ฅผ ๋งŒ๋“  ๊ฒƒ ๊ฐ™์ง€ ์•Š์•„? ๐Ÿ˜„

ํด๋ž˜์Šค ์ƒ์† ๊ตฌ์กฐ Animal Dog SuperPower SuperDog

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. 'Animal'์€ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๊ณ , 'Dog'์™€ 'SuperPower'๋Š” ๊ฐ๊ฐ 'Animal'์„ ์ƒ์†๋ฐ›์•˜์–ด. ๊ทธ๋ฆฌ๊ณ  'SuperDog'๋Š” 'Dog'์™€ 'SuperPower' ๋‘ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์ƒ์†๋ฐ›์•˜์ง€. ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ๊ด€๊ณ„๋„ Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด!

ํ•˜์ง€๋งŒ ๋‹ค์ค‘ ์ƒ์†์€ ์กฐ์‹ฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ์—ฌ๋Ÿฌ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ '๋‹ค์ด์•„๋ชฌ๋“œ ๋ฌธ์ œ'๋ผ๊ณ  ๋ถˆ๋Ÿฌ. Moose๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹จ์ผ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

๐ŸŽ“ ๊ณ ๊ธ‰ ํŒ: ๋‹ค์ค‘ ์ƒ์† ๋Œ€์‹  Moose์˜ 'Role' ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. Role์€ ๋‹ค์ค‘ ์ƒ์†์˜ ์žฅ์ ์€ ์‚ด๋ฆฌ๋ฉด์„œ ๋‹จ์ ์€ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด์ง€. ๋‚˜์ค‘์— ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ!

์ž, ์ด์ œ Moose์˜ ์ƒ์†์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์ƒ์† ๊ตฌ์กฐ๋Š” ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•ด.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Moose์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ 'ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด'์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐ŸŽญ Moose์˜ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด๋ฒˆ์—๋Š” Moose์˜ ์ •๋ง ๋ฉ‹์ง„ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ 'ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด'์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ด๊ฒŒ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿ˜Š

ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์€ ํด๋ž˜์Šค์˜ ์†์„ฑ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์ด์•ผ. ์‰ฝ๊ฒŒ ๋งํ•ด, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์†์„ฑ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์ ธ.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  'Dog' ํด๋ž˜์Šค๋ฅผ ์กฐ๊ธˆ ์ˆ˜์ •ํ•ด๋ณผ๊ฒŒ:

package Dog;
use Moose;
use Moose::Util::TypeConstraints;

extends 'Animal';

has 'breed' => (is => 'rw', isa => 'Str');
has 'age'   => (is => 'rw', isa => 'Int', where => sub { $_ > 0 });
has 'toys'  => (is => 'rw', isa => 'ArrayRef[Str]');

enum 'DogSize' => qw(small medium large);
has 'size' => (is => 'rw', isa => 'DogSize');

1;

์šฐ์™€, ๋งŽ์ด ๋‹ฌ๋ผ์กŒ์ง€? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • use Moose::Util::TypeConstraints;: ์ด๊ฑด ์ถ”๊ฐ€์ ์ธ ํƒ€์ž… ์ œ์•ฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฑฐ์•ผ.
  • has 'breed' => (is => 'rw', isa => 'Str');: 'breed'๋Š” ๋ฌธ์ž์—ด(Str)์ด์–ด์•ผ ํ•ด.
  • has 'age' => (is => 'rw', isa => 'Int', where => sub { $_ > 0 });: 'age'๋Š” ์ •์ˆ˜(Int)์—ฌ์•ผ ํ•˜๊ณ , 0๋ณด๋‹ค ์ปค์•ผ ํ•ด.
  • has 'toys' => (is => 'rw', isa => 'ArrayRef[Str]');: 'toys'๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ด์–ด์•ผ ํ•ด.
  • enum 'DogSize' => qw(small medium large);: 'DogSize'๋ผ๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ์–ด. ์ด ํƒ€์ž…์€ 'small', 'medium', 'large' ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด.
  • has 'size' => (is => 'rw', isa => 'DogSize');: 'size'๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  'DogSize' ํƒ€์ž…์ด์–ด์•ผ ํ•ด.

์ด๋ ‡๊ฒŒ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์†์„ฑ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด. ๋งŒ์•ฝ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด Moose๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์ค˜. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€ ์•Š์•„?

๐Ÿงช ์‹คํ—˜ํ•ด๋ณด๊ธฐ: ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? my $dog = Dog->new(name => 'Buddy', age => -5, size => 'huge'); ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฑฐ์•ผ! ์™œ๋ƒํ•˜๋ฉด ๋‚˜์ด๋Š” 0๋ณด๋‹ค ์ปค์•ผ ํ•˜๊ณ , ํฌ๊ธฐ๋Š” 'small', 'medium', 'large' ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•˜๋‹ˆ๊นŒ.

Moose์˜ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์€ ์ •๋ง ๊ฐ•๋ ฅํ•ด. ๊ธฐ๋ณธ ํƒ€์ž…(Str, Int, ArrayRef ๋“ฑ) ์™ธ์—๋„ ๋ณต์žกํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋‚˜ ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹์„ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ์ง€:

subtype 'Email',
    as 'Str',
    where => sub { $_ =~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/ },
    message => "Invalid email address";

has 'email' => (is => 'rw', isa => 'Email');

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'email' ์†์„ฑ์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด. ๋ฉ‹์ง€์ง€ ์•Š์•„?

Dog ํด๋ž˜์Šค์˜ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด Dog ํด๋ž˜์Šค ์†์„ฑ: - breed (Str) - age (Int > 0) - toys (ArrayRef[Str]) - size (DogSize: small|medium|large)

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด 'Dog' ํด๋ž˜์Šค์˜ ๊ฐ ์†์„ฑ์— ์–ด๋–ค ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์ด ๊ฑธ๋ ค์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ.

ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ผ. ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ๋ง‰์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜์ง€. ๊ฒŒ๋‹ค๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋„ ๊ฐ ์†์„ฑ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์–ด.

๐Ÿš€ ๋„์ „ ๊ณผ์ œ: 'Person' ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๋ž˜? 'name'(๋ฌธ์ž์—ด), 'age'(0๋ณด๋‹ค ํฐ ์ •์ˆ˜), 'email'(์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹), 'hobbies'(๋ฌธ์ž์—ด ๋ฐฐ์—ด) ์†์„ฑ์„ ๊ฐ€์ง€๋„๋ก ํ•ด๋ด. ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•ด!

์ž, ์ด์ œ Moose์˜ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ด ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋” ์•ˆ์ „ํ•˜๊ณ  ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์ œ์•ฝ ์กฐ๊ฑด์€ ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Moose์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ '๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐Ÿง™โ€โ™‚๏ธ Moose์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋งˆ๋ฒ•

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ๋Š” Moose์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ '๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ, ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿ˜Š

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ž๊ธฐ ์ž์‹ ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ธฐ์ˆ ์ด์•ผ. ์‰ฝ๊ฒŒ ๋งํ•ด, ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฑฐ์ง€. ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ฃผ๋ฌธ์„ ์™ธ์›Œ ์ƒˆ๋กœ์šด ๋งˆ๋ฒ•์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿง™โ€โ™‚๏ธโœจ

Moose๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ ์ค‘์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„?

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  'Dog' ํด๋ž˜์Šค์— ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ์šฉํ•ด๋ณด์ž:

package Dog;
use Moose;

extends 'Animal';

has 'breed' => (is => 'rw', isa => 'Str');

# ๋ฉ”ํƒ€ํด๋ž˜์Šค ์ ‘๊ทผ
my $meta = __PACKAGE__->meta;

# ์ƒˆ๋กœ์šด ์†์„ฑ ๋™์  ์ถ”๊ฐ€
$meta->add_attribute('favorite_toy' => (
    is  => 'rw',
    isa => 'Str',
));

# ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ๋™์  ์ถ”๊ฐ€
$meta->add_method('play' => sub {
    my $self = shift;
    print $self->name . " is playing with " . $self->favorite_toy . "!\n";
});

1;

์šฐ์™€, ์ด๊ฒŒ ๋ญ˜๊นŒ? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • my $meta = __PACKAGE__->meta;: ์ด๊ฑด ํ˜„์žฌ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑฐ์•ผ. ๋ฉ”ํƒ€๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด.
  • $meta->add_attribute('favorite_toy' => ...);: ์ด๊ฑด 'favorite_toy'๋ผ๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑฐ์•ผ.
  • $meta->add_method('play' => sub { ... });: ์ด๊ฑด 'play'๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑฐ์•ผ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ์ค‘์— ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์•„? ์ด์ œ 'Dog' ํด๋ž˜์Šค๋Š” 'favorite_toy' ์†์„ฑ๊ณผ 'play' ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋์–ด!

๐ŸŽฉ ๋งˆ๋ฒ•์‚ฌ์˜ ํŒ: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋‚จ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„!

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์„ค์ • ํŒŒ์ผ์— ๋”ฐ๋ผ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€.

Moose์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์•ผ. ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ˆœํšŒํ•˜๊ฑฐ๋‚˜, ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์‹ฌ์ง€์–ด ์ „์ฒด ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜๋„ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ž์‹ ์˜ ๋งˆ๋ฒ•์ฑ…์„ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„!

Moose ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ Moose ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ถ„์„ ๋™์  ์†์„ฑ ์ถ”๊ฐ€ ๋™์  ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ

์œ„ ๊ทธ๋ฆผ์€ Moose์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์ƒˆ๋กœ์šด ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์‹ฌ์ง€์–ด ์ „์ฒด ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์ง€. ์ด๋Ÿฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์ด Moose๋ฅผ ์ •๋ง ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์•ผ.

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ๋‹น์‹ ์€ ์ง„์ •ํ•œ Perl ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด! ํ•˜์ง€๋งŒ ํฐ ํž˜์—๋Š” ํฐ ์ฑ…์ž„์ด ๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ๋‚จ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๊ฑฐ๋“ .

๐Ÿง  ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ค์ • ํŒŒ์ผ์— ๋”ฐ๋ผ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด?

์ž, ์ด์ œ Moose์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ์œ ์—ฐํ•˜๊ณ  ๋™์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฑด, ๋ณต์žก์„ฑ๊ณผ ์œ ์—ฐ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์ž˜ ๋งž์ถ”๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑฐ์•ผ.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Moose์˜ 'Role' ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. Role์€ ๋‹ค์ค‘ ์ƒ์†์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด์ง€. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐ŸŽญ Moose์˜ Role: ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ๋Š” Moose์˜ ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ธ 'Role'์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. Role์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ, ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿ˜Š

Role์€ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์˜ ์ง‘ํ•ฉ์œผ๋กœ, ํด๋ž˜์Šค์— 'ํ˜ผํ•ฉ(mix in)'๋  ์ˆ˜ ์žˆ์–ด. ์‰ฝ๊ฒŒ ๋งํ•ด, Role์€ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด๋‚˜ ์ฑ…์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ๋ฐฐ์šฐ๊ฐ€ ์—ฐ๊ทน์—์„œ ์—ฌ๋Ÿฌ ์—ญํ• ์„ ๋งก๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐ŸŽญ

Role์€ ๋‹ค์ค‘ ์ƒ์†์˜ ๋ฌธ์ œ์ (์˜ˆ: ๋‹ค์ด์•„๋ชฌ๋“œ ๋ฌธ์ œ)์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค˜. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„?

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. 'Swimmer'์™€ 'Runner' Role์„ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ 'Athlete' ํด๋ž˜์Šค์— ์ ์šฉํ•ด๋ณด์ž:

package Swimmer;
use Moose::Role;

has 'swimming_speed' => (is => 'rw', isa => 'Int');

sub swim {
    my $self = shift;
    print "Swimming at speed " . $self->swimming_speed . "!\n";
}

package Runner;
use Moose::Role;

has 'running_speed' => (is => 'rw', isa => 'Int');

sub run {
    my $self = shift;
    print "Running at speed " . $self->running_speed . "!\n";
}

package Athlete;
use Moose;

with 'Swimmer', 'Runner';

has 'name' => (is => 'rw', isa => 'Str');

1;

์šฐ์™€, ์ด๊ฒŒ ๋ญ˜๊นŒ? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • use Moose::Role;: ์ด๊ฑด Role์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด.
  • with 'Swimmer', 'Runner';: ์ด๊ฑด 'Athlete' ํด๋ž˜์Šค์— 'Swimmer'์™€ 'Runner' Role์„ ์ ์šฉํ•˜๋Š” ๊ฑฐ์•ผ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'Athlete' ํด๋ž˜์Šค๋Š” 'Swimmer'์™€ 'Runner' Role์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋ผ. ์ฆ‰, 'Athlete' ๊ฐ์ฒด๋Š” 'swim'๊ณผ 'run' ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!

๐ŸŠโ€โ™‚๏ธ๐Ÿƒโ€โ™‚๏ธ ์šด๋™์„ ์ˆ˜์˜ ํŒ: Role์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, 'Swimmer' Role์ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ํด๋ž˜์Šค(์˜ˆ: 'Lifeguard')์—๋„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€!

Role์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์•ผ. ๋งŒ์•ฝ ๋‘ ๊ฐœ์˜ Role์ด ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, Moose๋Š” ์ปดํŒŒ์ผ ์‹œ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด.

Role์€ ์ถ”์ƒ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋” ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•ด. Role์€ ๊ตฌํ˜„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ .

Moose Role ๊ตฌ์กฐ Swimmer Role Runner Role Athlete Class with with

์œ„ ๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Role๊ณผ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. 'Swimmer'์™€ 'Runner' Role์ด 'Athlete' ํด๋ž˜์Šค์— ์ ์šฉ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์ง€. ์ด๋ ‡๊ฒŒ Role์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

Role์„ ์‚ฌ์šฉํ•˜๋ฉด "๋‹ค์ค‘ ์ƒ์†"์˜ ์žฅ์ ์€ ์‚ด๋ฆฌ๋ฉด์„œ ๋‹จ์ ์€ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด. ๊ฒŒ๋‹ค๊ฐ€ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ง€. ๊ฐ Role์€ ํŠน์ •ํ•œ ๋Šฅ๋ ฅ์ด๋‚˜ ์ฑ…์ž„์„ ๋‚˜ํƒ€๋‚ด๋‹ˆ๊นŒ, ํด๋ž˜์Šค์˜ ์„ค๊ณ„๊ฐ€ ๋” ์ง๊ด€์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ.

๐Ÿง  ์ƒ๊ฐํ•ด๋ณด๊ธฐ: Role์„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋ฉด? ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด?

์ž, ์ด์ œ Moose์˜ Role์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. Role์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๋ชจ๋“ˆํ™”ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฑด, ์ ์ ˆํ•œ ๊ณณ์— ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑฐ์•ผ.

์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ Moose์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ดค์–ด. ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์ƒ์„ฑ, ์ƒ์†, ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด, ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๊ทธ๋ฆฌ๊ณ  Role๊นŒ์ง€. ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์ด Moose๋ฅผ ์ •๋ง ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์•ผ.

Moose๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ๋‹น์‹ ์€ Perl๋กœ ์ •๋ง ๋ฉ‹์ง„ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๋ณต์žกํ•œ ์‹œ์Šคํ…œ๋„ ๊น”๋”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ธฐ์ˆ ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ฐฐ์šธ ๋•Œ๋„ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ.

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ Moose ์—ฌํ–‰์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. ๋งˆ์ง€๋ง‰์œผ๋กœ, Moose๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž!

๐ŸŽ“ Moose ๋งˆ์Šคํ„ฐํ•˜๊ธฐ: ์‹ค์ „ ํŒ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์šฐ๋ฆฌ์˜ Moose ์—ฌํ–‰์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. ์ด์ œ Moose๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ. ์ด๊ฑด ์ •๋ง ์ค‘์š”ํ•˜๋‹ˆ๊นŒ ์ž˜ ๋“ค์–ด๋ด! ๐Ÿ˜Š

๐Ÿš€ Moose ํ™œ์šฉ ํŒ

  1. ๋ชจ๋“ˆํ™”๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜์„ธ์š”: Role์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ ธ์š”.
  2. ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜์„ธ์š”: ๊ฐ€๋Šฅํ•œ ํ•œ ๋ชจ๋“  ์†์„ฑ์— ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ์„ธ์š”. ์ด๋Š” ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์ค˜์š”.
  3. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
  4. ๋ฌธ์„œํ™”๋ฅผ ์ž˜ ํ•˜์„ธ์š”: Moose๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ํด๋ž˜์Šค์™€ Role์˜ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ๋ช…ํ™•ํžˆ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

  • ์„ฑ๋Šฅ์— ์ฃผ์˜ํ•˜์„ธ์š”: Moose๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์—์„œ๋Š” ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.
  • ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋ฅผ ํ”ผํ•˜์„ธ์š”: Moose์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์— ๋งค๋ฃŒ๋˜์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”. ๊ฐ„๋‹จํ•จ์ด ์ตœ๊ณ ์˜ˆ์š”!
  • ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜์„ธ์š”: Moose์™€ ๊ทธ ์˜์กด์„ฑ ๋ชจ๋“ˆ๋“ค์˜ ๋ฒ„์ „์„ ์ž˜ ๊ด€๋ฆฌํ•˜์„ธ์š”. ๋ฒ„์ „ ์ฐจ์ด๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ’ก ํ”„๋กœ ํŒ: Moose๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ธฐ์กด์˜ ์ž˜ ์„ค๊ณ„๋œ Moose ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋“ค์„ ๋ถ„์„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฒฝํ—˜์—์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

Moose๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋ชจ๋“  ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์—์š”. ์ž‘์€ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๊ณผ๋„ํ•  ์ˆ˜ ์žˆ์ฃ . ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ์„ ๊ณ ๋ คํ•ด์„œ Moose ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜์„ธ์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ, Moose ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? CPAN(Comprehensive Perl Archive Network)์—๋Š” ์ˆ˜๋งŽ์€ Moose ๊ด€๋ จ ๋ชจ๋“ˆ๋“ค์ด ์žˆ์–ด์š”. ์ด๋“ค์„ ํƒํ—˜ํ•˜๊ณ , ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ธฐ์—ฌํ•ด๋ณด์„ธ์š”. ์˜คํ”ˆ ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ’์ง„ ๊ฒฝํ—˜์ด ๋  ๊ฑฐ์˜ˆ์š”!

Moose ๋งˆ์Šคํ„ฐ ๋กœ๋“œ๋งต Moose ๋งˆ์Šคํ„ฐ ๋กœ๋“œ๋งต ๊ธฐ๋ณธ ๊ฐœ๋… ํ•™์Šต ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ ์šฉ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํƒํ—˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฐธ์—ฌ

์œ„ ๊ทธ๋ฆผ์€ Moose ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๋กœ๋“œ๋งต์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด์š”. ๊ธฐ๋ณธ ๊ฐœ๋…์„ ํ•™์Šตํ•˜๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๊ณ , ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํƒํ—˜ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ๋ผ์š”. ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋„์ „๊ณผ ๋ฐฐ์›€์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

Moose๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ์—ฌ์ •์€ ๋์ด ์—†์–ด์š”. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ , ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด, ์ฝ”๋”ฉ์„ ์ฆ๊ธฐ๋Š” ๊ฑฐ์˜ˆ์š”! Moose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฌธ์ œ๋„ ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ Moose์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ๋ฐฐ์› ์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Perl๋กœ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”. ๋‚จ์€ ๊ฑด ์‹ค์ „ ๊ฒฝํ—˜๋ฟ์ด์—์š”. ์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”!

Moose์™€ ํ•จ๊ป˜ํ•˜๋Š” ์—ฌ์ •์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ฆ๊ฒ๊ณ  ์œ ์ตํ–ˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ์š”. ์•ž์œผ๋กœ Perl๋กœ ์ฝ”๋”ฉํ•  ๋•Œ Moose๊ฐ€ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์„ธ์š”. ํ™”์ดํŒ…! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป