OOP
OOP(Object-Oriented Programming)?
객체 지향 프로그래밍
Perl에서는 Object-Oriented Perl이라고도 함
객제지향이란
프로그램을 단순한 명령어와 함수라는 개념에서 벗어나 여러 개의 독립 단위를 생성, 객체들의 모임으로 프로그래밍 하는 기법
각각의 객체들은 메시지를 주고 받을 수 있다며, 데이터를 유연하게 처리 할 수 있게 된다.
OOP장점
유연하고 변경이 용이한 코딩
대규모, 소규모 프로젝트에 많이 사용
직관적인 코드 분석
- 개발속도 향상
펄에서 왜 OOP를 사용하는가?
cpan에 올라와 있는 module들은 OOP를 많이 사용함
cpan (http://www.cpan.org)
OOP의 기본 구성 요소
Object |
데이터를 보관, 액세스, 변경, 보호하는 작업의 단위 |
Class |
객체에서 액세스 할 수 있는 데이터가 무엇인지 어떻게 사용 할 수 있는지 기술(데이터 타입) |
Method |
데이터를 액세스, 수정, 처리하기 위한 수단 |
Inheritance |
어떤 객체의 class에 데이터와 method를 추가하여 업그레이드 하는 방법 |
Polymorphism |
같은 데이터에 대하여 서로 다른 객체가 클래스에 따라 다르게 반응하는 것을 의미 함 |
OOP특징
캡슐화(Encapsulation) |
데이터와 Method(함수)를 하나의 단위로 묶은 것.(독립적으로 실행) |
정보 은폐(Information Hiding) |
외부에서 객체상태를 바꾸거나 허가되지 않은 동작으로부터 보호 |
추상화 or 개념화(Abstraction) |
외부에서 사용해야 하는 기능은 공개, 제한해야 하는 기능은 은폐 |
다형성(Polymorphism) |
같은 Method에 대해 클래스에 따라 다른 행위를 하게 되는 특징 |
인스턴스(Instance) |
추상화 개념 또는 클래스 객체, 템플릿 들이 실제로 구현된 것 |
메시지 전달(Massage passing) |
객체가 보내는 데이터를 사용하는 과정에서 다른 객체를 요청 |
상속(Inheritance) |
기존에 있던 클래스를 바탕으로 새로운 클래스를 만들 수 있음 |
요약
특징 |
설명 |
캡슐화 |
묶는다 |
정보 은폐 |
숨긴다 |
추상화 |
표현한다 |
상속 |
재사용한다 |
다형성 |
상황에 따라 달라진다 |
인스턴스 |
객체가 실체화 되어 메모리에 구현됨 |
오브젝트(객체) |
독립성을 가진 부품 |
클래스 |
데이터 타입으로 취급 |
OOP Perl 규칙
Class는 package로 구분
- 서브루틴을 이용하여 Method를 정의
- 레퍼런트(레퍼런스가 될 대상)를 블레스하여 객체를 생성
블레스 : 이름이 없는 레퍼런트에 이름(tag)를 붙여주는 작업
데이터 : 레퍼런트, 주소 : 레퍼런스
저장소에 기능을 부가하는 기능
통장예제
Account.pm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | package Account; use strict; use warnings; sub new{ my ($class,$money) = @_; #인자값으로 저장되어 있음 0요소 class, 1요소 money my $self = { money => $money }; #무명해쉬 생성 bless $self, $class; # 무명해쉬 이름(tag)붙임 return $self; #결과봔한 } sub get_money{ #조회 my ($self) = @_; #객체 불러오기 return $self->{money}; #해당 키에 대한 값 반환 } sub deposit(){ #입금 my ( $self, $money) = @_ ; #객체 불러오기 $self->{money} += $money; } sub withdraw(){ #출금 my ( $self, $money) = @_ ; #객체 불러오기 $self->{money} -= $money; } sub transfer(){ #이체 my ( $self, $money , $taget) = @_ ; #객체 불러오기 $self->withdraw($money); $taget->deposit($money); } | cs |
bank.pl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | use strict; use warnings; use Account; my $account = Account->new(1000); #직접호출 #my $account = new Account(1000); #간접호출 #my #account = Account::new('Account',1000); foreach(1..100){ $account->deposit($_); } print $account->get_money(); foreach(1..100){ $account->withdraw($_); } print $account->get_money(); | cs |