OOP란 무엇입니까?
이 시리즈의 다섯 번째 기사인 이 기사에서 Teodor는 객체 지향 프로그래밍이 무엇인지, 언제 사용하는지, Perl에서 어떻게 작동하는지 설명합니다. 객체 지향 프로그래밍(OOP)은 강력한 프로그래밍 기술이지만 만병통치약은 아닙니다. 좋은 프로그래머는 그것을 사용하는 방법을 이해해야 하며, 언제 보다 전통적인 프로그래밍 기술에 의존해야 하는지 알아야 합니다. Perl에서 OOP를 사용하는 것은 쉽습니다. C 및 Java와 같이 보다 제한적인 OOP 언어와 달리 Perl의 OOP는 프로그래머에게 몇 가지 필수 제약을 부과합니다. OOP는 모든 프로그래머의 도구 상자에 필수적인 추가 기능이며 Perl로 해결할 수 있는 문제의 범위를 확장하는 데 매우 유용한 기술입니다. 객체 지향 프로그래밍(OOP)이란 무엇입니까? OOP는 프로그래밍 접근 방식 또는 문제 해결에 대한 일반적인 접근 방식입니다. 대조적으로, 알고리즘은 특정 문제를 해결하는 데 사용되는 특정 방법입니다. OOP는 본질적으로 강력한 접근 방식입니다. 절차적 프로그래밍 접근 방식과 함수형 프로그래밍 접근 방식을 문제와 덜 관련되게 만드는 경향이 있으며, 절차적 프로그래밍 접근 방식과 함수형 프로그래밍 접근 방식을 혼합하는 것이 매우 유익하지 않는 한 둘 사이에는 잘 어울리는 상호 작용이 없습니다. Perl에서는 이 기능이 다소 감소했지만 여전히 여전히 살아 있습니다. 이 기사에서는 Perl의 OOP와 기능적 및 절차적 프로그래밍의 기본 사항을 논의하고 Perl 프로그램 및 모듈에서 OOP를 사용하는 방법을 보여줍니다. 이 기사는 Perl의 OOP의 모든 측면에 대한 철저한 설명이 아니라 개요라는 점을 명심하십시오. 이러한 자세한 설명을 다루려면 여러 권의 책이 필요하며 여러 번 작성되었습니다. 자세한 내용은 이 문서 뒷부분의 리소스를 참조하세요. OOP란 정확히 무엇인가요? OOP는 객체를 사용하여 문제를 해결하는 기술입니다. 프로그래밍 용어에서 객체는 당면한 문제를 해결하는 데 필요한 속성과 동작을 가진 엔터티입니다. 이 정의는 더 자세해야 하지만 오늘날 컴퓨터 산업의 다양한 OOP 방법은 거의 상상할 수 없기 때문에 그렇게 할 수 없습니다. Perl 프로그래밍 환경에서는 해당 언어를 사용하는 데 OOP가 필요하지 않습니다. Perl 버전 5 이상에서는 OOP 사용을 권장하지만 꼭 필요한 것은 아닙니다. 모든 Perl 라이브러리는 모듈입니다. 즉 최소한 OOP의 기본 부분을 사용한다는 의미입니다. 게다가 대부분의 Perl 라이브러리는 객체로 구현됩니다. 즉, 사용자는 이를 잘 정의된 인터페이스를 통해 특정 동작과 특성을 가진 OOP 엔터티로 사용해야 합니다. 위로 기본 OO 프로그래밍 언어 기능 일반적으로 OOP 프로그래밍 언어에는 세 가지 언어 기능이 필요합니다. 상속, 다형성, 캡슐화가 그것이다. Perl은 상속을 지원합니다. 상속은 한 객체(하위 객체)가 다른 객체를 시작점(상위 객체)으로 사용하고 나중에 필요할 때 해당 속성과 동작을 수정할 때 사용됩니다. 자식-부모 관계는 다른 객체 위에 객체를 구축하는 것을 가능하게 하기 때문에 OOP에 필요합니다. 이러한 재사용은 OOP를 프로그래머의 사랑으로 만드는 이점 중 하나입니다. 상속에는 단일 상속과 다중 상속의 두 가지 유형이 있습니다. 단일 상속은 자식 개체에 부모가 하나만 있어야 하는 반면 다중 상속은 더 자유롭습니다(실제 생활에서 부모가 두 명 이상 있으면 프로그래밍 중에 혼란이 생기고 자식 개체 작업이 어려워질 수 있으므로 다중 상속도 사용하지 마세요). 많이 ). 실제로 두 개 이상의 상위 개체가 드물기는 하지만 Perl은 다중 상속을 지원합니다. 다형성(다형성, "다양한 형태"를 의미하는 그리스어)은 하나의 개체를 다른 개체처럼 보이게 만드는 기술입니다. 좀 복잡하니 예를 들어보겠습니다. 양 네 마리(Ovis)가 있는 양 목장이 있는데 방금 염소 두 마리(Capra)와 독일 셰퍼드(Canis) 한 마리를 구입했다고 가정해 보겠습니다. 당신의 집에는 몇 마리의 동물이 있나요? 양, 염소, 개를 모두 더하면 7이 됩니다. 실제로 계산을 위해 세 가지 다른 종류의 동물을 하나의 공통 유형("동물")으로 처리하는 다형성을 적용했습니다.
양, 염소, 개를 포유류로 생각한다면 그것은 단순한 믿음의 도약입니다. 생물학자들은 매일 이런 방식으로 다형성을 사용하고, 프로그래머들은 다른 과학 분야의 좋은 아이디어를 "훔치는"(내 말은 "재사용"을 뜻함) 것으로 알려져 있습니다. Perl은 다형성을 완벽하게 지원합니다. 그러나 Perl 프로그래머는 일반적인 동작을 수정하기 위해 상속된 동작을 수정하는 것보다 객체 속성을 사용하는 것을 선호하는 것 같기 때문에 자주 사용되지는 않습니다. 즉, 3개의 IO::Socket::INET 객체(포트 234에서 UDP 패킷을 수신 및 전송하는 객체 하나, 포트 80에서 TCP 패킷을 수신하는 객체 하나, TCP 패킷 전송을 위한 객체 하나)를 생성하는 코드를 볼 가능성이 더 높다는 의미입니다. 포트 1024에서는 첫 번째 경우에 IO::Socket::INET::UDPTransceiver를 사용하고, 두 번째 경우에 IO::Socket::INET::TCPReceiver를 사용하고, IO를 사용하는 것을 볼 수 없습니다. :Socket::INET::TCPReceiver는 IO::Socket::TCPTransmitter를 사용하는 세 번째 사례입니다. 이는 생물학적 용어로 개와 염소는 모두 포유류인데 염소는 카프라속에 속하고 개는 카니스속에 속한다고 말하는 것과 같습니다. OOP 순수주의자는 모든 것이 올바르게 분류되어야 한다고 믿지만 Perl 프로그래머는 전혀 순수주의자가 아닙니다. 그들은 OOP 규칙의 제약을 덜 받는 경향이 있어 OOP 순수주의자보다 파티에서 더 행복해집니다. 캡슐화는 개체 작성자가 허용하지 않는 한 사용자가 개체의 동작과 속성에 액세스할 수 없도록 개체 동작과 속성을 포함하는 것을 의미합니다. 이러한 방식으로 주체 사용자는 허용되지 않은 작업을 수행할 수 없으며, 액세스가 허용되지 않은 데이터에 액세스할 수 없으며 종종 유해한 데이터에 액세스할 수 없습니다. Perl은 일반적으로 캡슐화에 대해 완화된 접근 방식을 사용합니다. 목록 1을 참조하세요. 위로 OOP가 강력한 접근 방식인 이유는 무엇입니까? OOP가 어떻게 강력한 접근 방식인지에 대한 원래 주제로 돌아가서 이제 OOP는 절차적 프로그래밍과 함수형 프로그래밍(PP 및 FP) 사용을 혼합하기 어렵게 만드는 몇 가지 주요 개념을 결합한다는 것을 알 수 있습니다. 첫째, PP와 FP에는 클래스가 전혀 없기 때문에 PP와 FP 모두 상속 개념이나 클래스 다형성 개념이 없습니다. 캡슐화는 PP와 FP에 존재하지만 절차 수준에서만 존재하며 클래스나 객체 속성으로는 존재하지 않습니다. 프로그래머는 이러한 기본 OOP 도구를 사용하는 데 어려움을 겪기 때문에 일반적으로 프로그래머는 호환되지 않는 방법을 혼합하기보다는 전체 프로젝트에 OOP를 사용할 가능성이 더 높습니다. 모든 프로그램은 궁극적으로 명령의 절차적 실행으로 귀결된다고 주장할 수 있습니다. 따라서 OOP 프로그램이 아무리 순수하게 구현되어 있더라도 모든 OOP 프로그램은 해당 기능(메서드라고도 함)과 해당 작업을 수행하는 첫 번째 객체 생성으로 시작됩니다. . 나머지 작업)에는 절차적 코드가 포함되어 있습니다. Java만큼 "순수한" OOP에 가까운 언어라도 필연적으로 main() 함수가 필요합니다. 따라서 OOP는 단지 PP의 하위 집합인 것 같습니다. 그러나 OOP를 순차 명령어로 줄이는 것은 각 작업에 대해 실행되는 실제 어셈블러 명령어보다 시스템 설계자나 프로그래머에게 더 이상 관심이 되지 않습니다. OOP는 끝이 아니라 그 자체로 방법이라는 것을 기억하세요. OOP는 객체에 초점을 맞추기 때문에 절차적 프로그래밍 방식과 잘 작동하지 않습니다. 반면 절차적 프로그래밍은 프로시저를 기반으로 합니다. (우리는 대략적으로 프로시저를 OOP 기술을 사용하지 않고 얻을 수 있는 함수로 정의하고, 메서드를 객체에서만 얻을 수 있는 함수로 정의합니다.) ). )에서만 얻을 수 있는 기능입니다. 메소드와 마찬가지로 프로시저도 사용자가 호출하는 함수일 뿐이지만 둘 사이에는 몇 가지 차이점이 있습니다. 프로시저는 개체 데이터를 사용하지 않습니다. 인수 목록의 데이터를 전달해야 하거나 해당 범위의 데이터를 사용해야 합니다. 프로시저는 호출 시 전달된 모든 데이터, 심지어 전체 프로그램에 대한 전역 데이터에도 액세스할 수 있습니다. 메소드는 해당 객체의 데이터에만 액세스해야 합니다. 실제로 메소드의 함수 범위는 일반적으로 메소드를 포함하는 객체입니다.
프로세스가 전역 데이터를 사용하는 경우가 종종 있지만 이는 꼭 필요한 경우에만 수행되어야 합니다. 전역 데이터를 사용하는 메서드는 가능한 한 빨리 다시 작성해야 합니다. 프로시저는 일반적으로 여러 매개변수를 사용하여 다른 프로시저를 호출합니다. 메서드에는 몇 개의 매개변수만 있어야 하며 다른 프로시저보다 다른 메서드를 더 많이 호출해야 합니다. 함수형 프로그래밍(FP)이 OOP와 잘 작동하지 않는 데에는 몇 가지 이유가 있습니다. 가장 중요한 이유는 FP가 문제 해결을 위해 세부적인 기능적 방법을 기반으로 하는 반면 OOP는 객체를 사용하여 개념을 표현하며, 이를 포함하는 객체 내에서만 사용할 수 있는 OOP 방법과 달리 FP 절차는 모든 곳에서 사용된다는 점입니다. 요약하면 이제 Perl이 OOP, FP 및 PP 접근 방식을 혼합하는 데 가장 적합한 언어 중 하나인 이유를 설명할 수 있습니다. 위로 Perl은 어떻게 OOP를 절차적 및 함수형 프로그래밍과 결합합니까? Perl은 느슨한 언어입니다. 프로그래머가 원하는 것은 무엇이든 편리하다고 생각하는 방식으로 수행할 수 있도록 노력합니다. 이는 Java나 C와 같은 언어와는 매우 다릅니다. 예를 들어, Perl은 프로그래머가 처음에 변수를 선언하지 않은 경우 자동으로 변수를 생성할 수 있도록 허용합니다(비록 이는 권장되지 않으며 적극 권장되는 "use strict" pragma를 사용하여 방지할 수 있음). 만약 당신이 자신의 발에 총을 쏜다면 Perl은 당신에게 총알 10개와 레이저 조준경을 주고 옆에 서서 당신을 격려할 것입니다. 결과적으로 Perl은 메소드 남용에 매우 취약한 언어입니다. 두려워하지 마십시오. 그것은 중요하지 않습니다. 예를 들어, 내부 개체 데이터에 대한 액세스, 클래스에 대한 실시간 변경, 메서드의 실시간 재정의가 모두 허용됩니다. Perl 방식은 프로그래머가 코딩, 디버깅 및 실행 효율성을 위해 규칙을 어길 수 있도록 하는 것입니다. 일을 끝내는 데 도움이 된다면 괜찮습니다. 따라서 Perl 자체가 프로그래머의 가장 친한 친구가 될 수도 있고 최악의 적이 될 수도 있습니다. OOP, FP 및 PP를 혼합하는 것이 규칙 위반을 의미한다면 왜 OOP, FP 및 PP를 혼합하려고 합니까? 돌아가서 이것에 대해 생각해 봅시다. OOP, FP, PP란 무엇인가요? 이는 단순히 프로그래밍 팀에 도움이 되는 기존 프로그래밍 방법, 개념 집합 및 규칙입니다. OOP, FP 및 PP는 도구이며 모든 프로그래머의 첫 번째 임무는 도구를 이해하는 것입니다. 프로그래머가 해시를 정렬할 때 FP의 Schwartzian 변환을 사용할 수 없고 대신 자신만의 Sort::Hashtable을 작성하거나 Sys::Hostname 모듈을 재사용할 수 없고 대신 시스템 호스트 이름을 얻기 위한 절차 코드를 작성했다면 이 프로그래머는 시간을 낭비하게 됩니다. , 노력, 비용으로 인해 코드 품질과 신뢰성이 저하됩니다. 프로그래밍 팀은 자신이 가장 잘 아는 도구에 안주할 수 있으며, 이는 그들에게 일어날 수 있는 최악의 상황이 될 수 있습니다. 컴퓨터 프로그래밍만큼 흥미롭고 혁신적인 업계에서 사용할 수 있는 도구 중 일부만 사용하는 팀은 몇 년 후에는 쓸모 없게 될 것입니다. 프로그래머는 작업을 더욱 효율적으로 만들고, 코드를 개선하며, 팀을 더욱 혁신적으로 만드는 모든 것을 통합할 수 있어야 합니다. Perl은 이러한 태도를 인식하고 장려합니다. 위로 OOP의 이점 여기에 나열하기에는 OOP의 이점이 너무 많습니다. 앞서 말씀드렸듯이 이 주제에 관한 책은 많습니다. 이러한 이점 중 일부는 코드 재사용 용이성, 코드 품질 개선, 일관된 인터페이스 및 적응성입니다. OOP는 클래스와 객체를 기반으로 구축되었기 때문에 OO 코드를 재사용한다는 것은 필요할 때 클래스를 가져오기만 하면 된다는 의미입니다. 코드 재사용은 OOP를 사용하는 가장 큰 이유이며 오늘날 업계에서 OOP의 중요성과 인기가 높아지고 있는 이유입니다. 여기에는 몇 가지 함정이 있습니다. 예를 들어, 현재 상황에서 이전 문제에 대한 해결책은 차선책일 수 있으며 라이브러리 문서화 수준이 너무 낮기 때문에 문서화 수준이 낮은 라이브러리를 이해하고 사용하는 데에는 라이브러리를 다시 작성하는 데 오랜 시간이 걸릴 수 있습니다. 이러한 함정을 확인하고 피하는 것이 시스템 설계자의 임무입니다.
OOP를 사용하면 캡슐화로 인해 데이터 손상("친근한 화재")이 줄어들고 상속과 다형성으로 작성해야 하는 새 코드의 양과 복잡성이 줄어들기 때문에 코드 품질이 향상됩니다. 코드 품질과 프로그래밍 혁신 사이에는 미묘한 균형이 있으며, 이는 전적으로 팀의 구성과 목적에 달려 있기 때문에 팀에서 발견하는 것이 가장 좋습니다. OOP 상속 및 재사용을 통해 코드에서 일관된 인터페이스를 쉽게 구현할 수 있지만 모든 OO 코드가 일관된 인터페이스를 가지고 있다고 말할 수는 없습니다. 프로그래머는 여전히 공통 아키텍처를 따라야 합니다. 예를 들어, 팀은 오류 로깅을 위한 형식과 인터페이스에 동의해야 하며, 가급적이면 향후 확장을 허용하고 사용하기 매우 쉬운 데모 모듈 인터페이스를 통해 이루어져야 합니다. 그래야만 모든 프로그래머가 무작정 인쇄 문 대신 해당 인터페이스를 사용하겠다고 약속할 수 있습니다. 왜냐하면 다음 오류 로깅 기능이 나올 때 인터페이스를 배우려는 노력이 헛되지 않을 것임을 깨닫기 때문입니다. 적응성은 프로그래밍에서 다소 모호한 개념입니다. 나는 그것을 환경과 사용의 변화에 대한 수용과 기대라고 정의하고 싶다. 모든 소프트웨어는 외부 세계와 함께 발전해야 하기 때문에 잘 작성된 소프트웨어에는 적응성이 중요합니다. 잘 작성된 소프트웨어는 발전하기 쉬워야 합니다. OOP는 모듈식 설계, 향상된 코드 품질 및 일관된 인터페이스를 통해 새로운 운영 체제나 새로운 보고 형식으로 인해 아키텍처 핵심에 대한 근본적인 변경이 필요하지 않도록 보장함으로써 소프트웨어 발전을 돕습니다. 위로 Perl에서 OOP를 사용하는 방법 믿거나 말거나, Perl의 OOP는 초보자와 중급 사용자에게 어렵지 않으며 고급 사용자에게도 그다지 복잡하지 않습니다. OOP가 작동하는 복잡한 방식에 대해 지금까지 논의한 내용에 따르면 그렇게 생각하지 않을 수도 있습니다. 그러나 Perl은 프로그래머에게 가능한 한 적은 제한을 가하는 것을 기쁘게 생각합니다. Perl OOP는 바비큐와 같습니다(비유적인 표현은 죄송합니다). 다들 고기를 직접 가져와서 원하는 방식으로 굽습니다. 바비큐의 팀 정신도 이렇듯, 관련 없는 사물들 간에도 데이터를 쉽게 공유할 수 있는 것처럼 말이다. 우리가 취해야 할 첫 번째 단계는 Perl 패키지를 이해하는 것입니다. 패키지는 C의 네임스페이스 및 Java의 라이브러리와 유사합니다. 즉, 데이터를 특정 영역으로 제한하는 데 사용되는 울타리와 같습니다. 그러나 Perl 패키지는 프로그래머를 위한 제안만 제공합니다. 기본적으로 Perl은 패키지 간 데이터 교환을 제한하지 않습니다(프로그래머는 어휘 변수를 통해 그렇게 할 수 있음).
목록 1. 패키지 이름, 패키지 전환, 패키지 간 데이터 공유 및 패키지 변수 #!/usr/bin/perl # 참고: 다음 코드는 -w 스위치를 사용하면 경고를 생성하며 # "use를 사용하여 컴파일하지도 않습니다. strict". # 패키지와 어휘 변수를 보여주기 위한 것입니다. 항상 "use strict"를 사용해야 합니다. # 모든 줄에 주의하세요! # 이것은 전역 패키지 변수입니다. "use strict"를 사용하면 # 변수가 없어야 합니다. 암시적으로 "main"이라는 패키지에 있습니다. $global_sound = " "; package Cow; # Cow 패키지는 여기서 시작됩니다. # 이것은 $Cow::sound $sound = " moo"로 다른 패키지에서 액세스할 수 있는 패키지 변수입니다. 이것은 이 파일의 어느 곳에서나 액세스할 수 있는 어휘 변수입니다. my $extra_sound = "stampede"; package Pig; # Pig 패키지가 시작되고 Cow ends # 이것은 $Pig: :sound $Pig로 다른 패키지에서 액세스할 수 있는 패키지 변수입니다. : :sound = "oink"; $::global_sound = "pigs do it better"; # 또 다른 "메인" 패키지 변수 # 기본(메인) 패키지로 돌아갑니다. print "Cows go : ", $ Cow::sound; # "moo" print "\nPigs go: ", $Pig::sound; # "oink" 인쇄 print "\nExtra sound: ", $extra_sound; # 인쇄 "stampede" print "\n이것은 무엇입니까? 들립니다: ", $sound; # $main::sound는 정의되지 않았습니다! print "\nEveryone say: ", $global_sound; # prints "pigs do it better" 이 작업은 세 가지 모두에서 수행될 수 있습니다. 패키지("main", "Pig" 및 "Cow")의 어휘 변수 $extra_sound는 이 예에서 동일한 파일에 정의되어 있기 때문입니다. 일반적으로 각 패키지는 어휘 변수가 해당 패키지에 비공개인지 확인하기 위해 자체 파일 내에 정의됩니다. 이렇게 하면 캡슐화가 가능해집니다. (자세한 내용을 보려면 "perldoc perlmod"를 실행하십시오.) 다음으로 패키지를 클래스와 연결하려고 합니다.
Perl에 관한 한 클래스는 단지 멋진 패키지일 뿐입니다(반대로 객체는 bless() 함수에 의해 특별히 생성됩니다). 마찬가지로 Perl은 프로그래머가 OOP 규칙에 얽매이지 않도록 느슨하게 OOP 규칙을 시행합니다. new() 메소드는 클래스 생성자의 관용적 이름입니다(Perl의 일반적인 느슨한 방식에서는 어떤 이름이든 사용할 수 있습니다). 클래스가 객체로 인스턴스화될 때마다 호출됩니다. 목록 2. barebones class #!/usr/bin/perl -w package Barebones; use strict; # 이 클래스는 생성자 매개변수를 사용하지 않습니다. sub new { my $classname = Shift; # 익명 해시를 축복합니다. } 1; 임의의 디렉토리에 있는 Barebones.pm이라는 파일에 코드를 배치한 후 해당 디렉토리에서 다음 명령을 실행하여 목록 2의 코드를 테스트할 수 있습니다. 즉, "라이브러리에 현재 항목을 포함합니다. 경로의 디렉토리에서 Barebones 모듈을 사용하고 새 Barebones 객체를 생성합니다."): perl -I. -MBarebones -e 'my $b = Barebones-gt;new()' 예를 들어, 새 Barebones 객체에서 이 작업을 수행할 수 있습니다. () 메소드 $classname 변수가 무엇을 담고 있는지 볼 수 있도록 print 문을 넣습니다. Barebones-gt;new() 대신 Barebones::new() 를 호출하면 클래스 이름이 new() 로 전달되지 않습니다. 즉, new()는 생성자 역할을 하지 않고 단지 일반 함수 역할을 합니다. 당신은 질문할 수 있습니다: 왜 $classname 을 전달해야 합니까? bless {}, "Barebones"를 사용하면 어떨까요? 상속 때문에 이 생성자는 Barebones에서 상속되지만 Barebones라는 이름이 아닌 클래스에 의해 호출될 수 있습니다. 잘못된 이름으로 인해 잘못된 일이 발생할 수 있으며 OOP에서는 이는 나쁜 생각입니다. new() 외에도 모든 클래스에는 멤버 데이터와 메서드가 필요합니다. 이를 정의하는 것은 몇 가지 프로시저를 작성하는 것만큼 간단합니다. 목록 3. 멤버 데이터와 메소드가 있는 클래스 #!/usr/bin/perl -w package Barebones; use strict; my $count = 0; # 이 클래스는 생성자 매개변수를 사용하지 않습니다. sub new { my $classname = Shift; 우리의 클래스 이름 $count; # 얼마나 많은 객체가 {}, $classname;을 축복하는지 기억합니다. } sub count { my $self = Shift; 다음을 사용하는 코드: perl -I. -MBarebones -e 'my $b = Barebones-gt;new(); print $b-gt;count' 이 결과는 다음과 같습니다.
생성자는 두 번 호출되며 각 Barebones 객체의 범위가 아닌 Barebones 패키지의 범위로 제한되는 어휘 변수($count)를 수정합니다. 객체 범위 내의 데이터는 객체 자체에 저장되어야 합니다. Barebones 예에서 객체로 공유되는 것은 익명 해시입니다. 객체에 대한 참조가 해당 메소드에 전달되는 첫 번째 인수이기 때문에 메소드가 호출될 때마다 객체에 어떻게 액세스할 수 있는지 주목하세요. Perl이 특정 조건에서 자동으로 호출하는 DESTROY() 및 AUTOLOAD()와 같은 몇 가지 특수 메서드가 있습니다. AUTOLOAD()는 동적 메서드 이름을 허용하는 데 사용되는 포괄적인 메서드입니다. DESTROY()는 객체 소멸자이지만 실제로 필요한 경우가 아니면 사용해서는 안 됩니다. Perl에서 소멸자를 사용하는 것은 일반적으로 여러분이 여전히 C/C 프로그래머처럼 생각하고 있음을 나타냅니다. 상속을 살펴보겠습니다. @ISA 변수를 변경하여 Perl에서 이를 수행하십시오. 변수에 클래스 이름 목록을 할당하기만 하면 됩니다. 그게 다야. @ISA에는 무엇이든 넣을 수 있습니다. 당신의 클래스를 사탄의 하위 클래스로 만들 수 있습니다. Perl은 신경쓰지 않습니다(목사, 목사, 이맘, 유대인 학자 등은 아마도 신경쓰겠지만). 목록 4. 상속 #!/usr/bin/perl -w package Barebones; # 다른 코드나 변수 선언이 Animal을 요구하기 전에 # 이 줄을 모듈의 시작 부분에 추가합니다. # 상위 클래스 @ISA = qw(Animal); 우리는 Animal의 자식입니다. @ISA는 전역 기본 변수로 남아 있고 선언 뒤에 "use # strict"가 옵니다. 이것이 가장 쉬운 방법입니다. use Carp; ) 메소드는 다음과 같습니다: sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = $class-gt; () 메소드 bless ($self, $class); # $self(동물)를 Barebones로 축복합니다. } 1 이것은 Perl의 OOP에 대한 가장 기본적인 지식입니다. Perl 언어에는 여러분이 탐구해야 할 더 많은 것들이 있습니다. 이 주제에 관해 많은 책이 저술되었습니다. 읽고 싶으시면 자료를 참고하세요. 위로 h2xs: 새로운 가장 친한 친구 Perl 클래스를 작성하고, 문서(POD) 프레임워크도 작성하고, 일반적으로 이러한 작업을 올바르게 수행하여 생활을 좀 더 쉽게 만들어 줄 수 있는 도구를 갖고 싶지 않으십니까? Perl에는 h2xs라는 도구가 함께 제공됩니다. "-A -n Module"과 같은 몇 가지 중요한 플래그를 사용하는 것을 잊지 마십시오. 이러한 플래그를 사용하여 h2xs는 유용한 파일로 채워진 "Module"이라는 프레임워크 디렉터리를 생성합니다. 이러한 파일은 다음과 같습니다: Module.pm, 모듈 자체, 프레임워크 문서가 이미 작성되어 있습니다.
Module.xs - 모듈을 C 코드와 연결하는 데 사용됩니다. (자세한 내용은 "perldoc perlxs"를 실행하세요.) MANIFEST, 패키징할 파일 목록입니다. test.pl, 프레임워크 테스트 스크립트. Changes - 이 모듈에 적용된 변경 사항에 대한 로그입니다. Makefile.PL, makefile 생성기(" perl Makefile.PL "로 실행) 이러한 파일을 모두 사용할 필요는 없지만 필요할 때 해당 파일이 있다는 것을 알아 두는 것이 좋습니다.