컨스트럭터(개체 지향 프로그래밍)
Constructor (object-oriented programming)비교 프로그래밍 언어 |
---|
|
클래스 기반 객체 지향 프로그래밍에서 컨스트럭터(약어: ctor)는 객체를 생성하기 위해 호출되는 특별한 서브루틴 유형입니다.새 개체를 사용할 수 있도록 준비합니다. 종종 생성자가 필요한 멤버 변수를 설정하는 데 사용하는 인수를 수락합니다.
생성자는 인스턴스 메서드와 유사하지만 명시적인 반환 유형이 없고 암묵적으로 상속되지 않으며 일반적으로 범위 한정자에 대한 규칙이 다르다는 점에서 메서드와 다릅니다.컨스트럭터는 선언 클래스와 이름이 같은 경우가 많습니다.이들은 객체의 데이터 멤버를 초기화하고 클래스의 불변성을 확립하는 작업을 수행하지만 불변성이 유효하지 않으면 실패합니다.적절하게 작성된 생성자는 결과 개체를 유효한 상태로 유지합니다.불변 객체는 생성자에서 초기화해야 합니다.
대부분의 언어에서 생성자를 오버로드할 수 있습니다. 즉, 클래스에 여러 개의 생성자가 있을 수 있으며 매개 변수가 다를 수 있습니다.일부 언어는 특별한 유형의 생성자를 고려합니다.구체적으로 단일 클래스를 사용하여 개체를 만들고 클래스의 새 인스턴스를 반환하는 생성자는 팩토리에 의해 추상화되며, 팩토리는 개체를 만들지만 여러 클래스 또는 개체 풀과 같은 다른 할당 체계를 사용하여 다양한 방법으로 이를 수행할 수 있습니다.
종류들
매개 변수화된 생성자
하나 이상의 인수를 사용할 수 있는 생성자를 매개 변수화된 생성자라고 합니다.매개 변수화된 생성자에서 개체가 선언되면 초기 값이 생성자 함수에 인수로 전달되어야 합니다.오브젝트 선언의 통상의 방법이 기능하지 않을 수 있습니다.생성자는 명시적으로 또는 암묵적으로 호출할 수 있습니다.컨스트럭터를 암묵적으로 호출하는 메서드를 속기 메서드라고도 합니다.
학급 예 { 일반의: 예(); 예(인트 a, 인트 b); // 매개 변수화된 생성자. 사적인: 인트 x_; 인트 y_; }; 예::예() = 체납; 예::예(인트 x, 인트 y) : x_(x), y_(y) {}
예 e = 예(0, 50); // 명시적 콜 예 e2(0, 50); // 암묵적인 콜
기본 컨스트럭터
프로그래머가 인스턴스화 가능한 클래스의 컨스트럭터를 제공하지 않으면 Java 컴파일러가 사용자 대신 기본 컨스트럭터를 코드에 삽입합니다.이 생성자를 기본 생성자라고 합니다.컴파일 중에 코드에 삽입되어 .class 파일에 존재하기 때문에 소스 코드(java 파일)에서는 찾을 수 없습니다.기본 생성자의 동작은 언어에 따라 달라집니다.데이터 멤버를 0 또는 다른 동일한 값으로 초기화하거나 아무것도 수행하지 않을 수 있습니다.Java에서 "기본 생성자"는 클래스에 대해 정의된 생성자가 없거나 프로그래머 정의 생성자가 없는 경우 컴파일러에 의해 자동으로 생성되는 null 생성자를 말합니다(예: Java에서 기본 생성자는 암묵적으로 슈퍼 클래스의 null 생성자를 호출한 다음 빈 본문을 실행합니다).모든 필드는 초기값 0(정수형), 0.0(부동소수점형), false(부울형) 또는 null(참조형)로 유지됩니다.
#실패하다 <iostream> 학급 학생입니다 { 일반의: 학생입니다(인트 a = 0, 인트 b = 0); // 기본 생성자. 인트 a; 인트 b; };
컨스트럭터 복사
C++와 마찬가지로 Java도 "Copy Constructor"를 지원합니다.그러나 C++와 달리 Java는 사용자가 직접 작성하지 않으면 기본 복사 생성자를 만들지 않습니다.복사 생성자는 클래스 개체를 복사할 때 컴파일러가 수행하는 작업을 정의합니다.복사 생성자에는 클래스 유형인 형식 매개 변수가 하나 있습니다( 매개 변수는 개체에 대한 참조일 수 있음).동일한 클래스의 기존 개체의 복사본을 만드는 데 사용됩니다.두 클래스가 동일한 경우에도 변환 생성자로 간주됩니다.보통 copy contor 또는 cctor로 약칭되지만 에서 사용되는 클래스 컨스트럭터와는 관계가 없습니다.같은 약어를 사용하는 NET.
변환 컨스트럭터
변환 컨스트럭터는 컴파일러가 다른 유형의 오브젝트를 기반으로 한 클래스에 속하는 오브젝트를 암묵적으로 작성하는 수단을 제공한다.이러한 생성자는 일반적으로 인수 또는 피연산자를 적절한 유형으로 변환하기 위해 암묵적으로 호출되지만 명시적으로 호출될 수도 있습니다.
컨스트럭터 이동
C++에서 이동 생성자는 클래스의 객체에 대한 Rvalue 참조를 취하며 매개 변수 객체의 리소스에 대한 소유권 이전을 구현하기 위해 사용됩니다.
구문
- Java, C++, C#, ActionScript, PHP 4 및 MATLAB에는 컨스트럭터가 연관된 클래스와 동일한 이름을 갖는 명명 규칙이 있습니다.
- PHP 5에서 컨스트럭터의 권장 이름은 다음과 같습니다.
__construct
하위 호환성을 위해 클래스와 이름이 같은 메서드가 호출됩니다.__construct
메서드를 찾을 수 없습니다.PHP 5.3.3 이후, 이것은 이름 없는 [1]클래스에 대해서만 동작합니다. - PHP 7에서는 항상 생성자의 이름을 다음과 같이 지정해야 합니다.
__construct
. 클래스와 이름이 같은 메서드는 E_DEPRECATED 레벨 [1]오류를 트리거합니다. - Perl에서 컨스트럭터는 관례상 "new"로 명명되며 상당한 양의 객체 생성을 수행해야 합니다.
- Perl용 Moose 객체시스템에서는 컨스트럭터(신규라는 이름)가 자동으로 생성되어 BUILD 메서드를 지정함으로써 확장됩니다.
- [ Visual Basic ]그래서NET, 컨스트럭터는 "라고 불립니다.
New
". - Python에서는 컨스트럭터는 2개의 메서드로 분할됩니다.
__new__
" 및 "__init__
". 그__new__
메서드는 인스턴스에 대한 메모리 할당을 담당하며 클래스를 인수(일반적으로 "라고 함)로 수신합니다.cls
").__init__
메서드(종종 "이니셜라이저"라고 함)는 인수(통상 "라고 함)로 새로 생성된 인스턴스를 전달합니다.self
"[2] ) 。 - 오브젝트 Pascal 컨스트럭터는 키워드로 나타납니다.
constructor
및 사용자 정의 이름을 사용할 수 있습니다(대부분은 "라고 불립니다).Create
"). - Objective-C에서 생성자 방법은 두 가지 방법으로 분할됩니다.
alloc
" 및 "init
"와 함께alloc
클래스 인스턴스용으로 메모리를 확보(설정)하는 메서드 및init
instance 초기화의 대부분을 처리하는 메서드.메서드에 대한 호출"new
"는 양쪽을 호출합니다.alloc
및 그init
메서드, 클래스인스턴스용.
메모리 구성
Java, C# 및 VB의 경우.NET, 컨스트럭터는 "히프"라고 불리는 특별한 메모리 구조에 참조 유형 개체를 만듭니다.값 유형(int, double 등)은 "stack"이라고 하는 순차적 구조로 생성됩니다.VB .NET 및 C#에서는 새로운 연산자를 사용하여 값 유형 개체를 만들 수도 있지만 이러한 값 유형 개체는 연산자의 사용 여부에 관계없이 스택에 생성됩니다.
C++에서는 컨스트럭터가 새로운 연산자 없이 호출될 때 오브젝트가 스택에 생성되고 컨스트럭터가 새로운 연산자와 함께 호출될 때 힙에 생성됩니다.스택 객체는 범위를 벗어나면 암묵적으로 삭제되지만 힙 객체는 소멸자에 의해 암묵적으로 삭제되거나 삭제 연산자를 사용하여 명시적으로 삭제해야 합니다.
언어 상세
C++
C++에서 생성자 이름은 클래스 이름입니다.아무것도 반환되지 않습니다.모든 멤버 함수와 같은 파라미터를 가질 수 있습니다.컨스트럭터 함수는 보통 퍼블릭섹션에서 선언되지만 사용자가 접근을 제한하려는 경우 보호 섹션과 프라이빗섹션에서도 선언할 수 있습니다.
생성자는 두 부분으로 구성됩니다.첫 번째는 파라미터 목록 뒤에 메서드 본문 앞에 있는 이니셜라이저 목록입니다.콜론으로 시작하고 항목은 쉼표로 구분됩니다.이니셜라이저 목록은 필수는 아니지만 데이터 멤버의 값을 제공하고 별도의 할당 문을 사용하지 않도록 할 수 있습니다.initializer 목록은 상수 또는 참조 유형 데이터 멤버 또는 매개 변수 없는 생성자 논리가 없는 멤버가 있는 경우에 필요합니다.데이터 멤버가 선언된 순서에 따라 할당이 이루어집니다(이니셜라이저 목록의 순서가 [3]다른 경우에도).두 번째 부분은 본문입니다.본문은 일반적인 메서드 본문으로, 괄호로 둘러싸여 있습니다.
C++ 에서는, 복수의 컨스트럭터를 사용할 수 있습니다.다른 생성자는 서로 다른 매개 변수를 가져야 합니다.또한 기본값이 지정된 매개 변수를 포함하는 생성자는 모든 매개 변수에 기본값이 부여되지 않는다는 제한을 준수해야 합니다.이것은 디폴트 컨스트럭터가 존재하는 경우에만 문제가 되는 상황입니다.기본 클래스(또는 기본 클래스)의 생성자는 파생 클래스에서 호출할 수도 있습니다.생성자 함수는 상속되지 않으므로 해당 주소를 참조할 수 없습니다.메모리 할당이 필요한 경우 새 연산자와 삭제 연산자가 암묵적으로 호출됩니다.
카피 컨스트럭터는, 예를 들면 벡터(const Vector & rhs)와 같은 타입의 파라미터를 가진다.명시적으로 제공되지 않으면 컴파일러는 각 멤버 변수에 대해 복사 생성자를 사용하거나 원시 유형의 경우 단순히 값을 복사합니다.클래스에 멤버(또는 다른 리소스에 대한 핸들)가 동적으로 할당되어 있는 경우 디폴트 실장은 효율적이지 않습니다.이는 파기 시 삭제 콜이 2회(또는 자원의 더블릴리스)가 발생할 수 있기 때문입니다.
학급 푸바 { 일반의: 푸바(이중으로 하다 r = 1.0, 이중으로 하다 알파 = 0.0) // 생성자, 기본값으로 설정된 매개 변수. : x_(r * 왜냐하면(알파)) // <- 이니셜라이저 리스트 { y_ = r * 죄(알파); // <- 일반 할당 } 사적인: 이중으로 하다 x_; 이중으로 하다 y_; };
호출 예:
푸바 a, b(3), c(5, M_PI/4);
함수에서 개체를 반환하거나 값을 기준으로 개체를 전달할 때 반환 값 최적화가 적용되지 않는 한 개체 복사 생성자가 암묵적으로 호출됩니다.
C++는 프로그래머가 모든 기본 클래스와 모든 멤버 변수에 대해 복사 생성자를 호출하는 기본 복사 생성자를 암묵적으로 생성합니다.단, 복사 생성자를 명시적으로 삭제하거나(복제를 방지하기 위해), 기본 클래스 또는 멤버 변수 복사 생성자 중 하나가 삭제되거나 액세스할 수 없는(프라이빗) 경우를 제외합니다.커스터마이즈된 카피 컨스트럭터(예: 참조 카운트, 포인터의 딥 카피)를 요구하는 대부분의 케이스에서는, 디스트럭터와 카피 할당 연산자의 커스터마이즈도 필요합니다.이것은 일반적으로 3의 법칙이라고 불립니다.
C#
예: C# 컨스트럭터:
일반의 학급 마이클래스 { 사적인 인트 a; 사적인 스트링 b; // 컨스트럭터 일반의 마이클래스() : 이것.(42, "문자열') { } // 생성자 오버로드 일반의 마이클래스(인트 a, 스트링 b) { 이것..a = a; 이것..b = b; } }
// 코드 위치 // 위의 생성자를 사용하여 개체 인스턴스화 마이클래스 c = 신규 마이클래스(42, "문자열');
C# 스태틱컨스트럭터
C#에서 정적 생성자는 정적 데이터 이니셜라이저입니다.정적 생성자는 클래스 생성자라고도 합니다.생성된 실제 메서드는 .cctor라는 이름을 가지고 있기 때문에 종종 "cctors"[4][5]라고도 합니다.
정적 생성자를 사용하면 복잡한 정적 변수 [6]초기화가 가능합니다.정적 생성자는 클래스에 처음 액세스할 때 암묵적으로 호출됩니다.클래스에 대한 콜(스태틱콜 또는 컨스트럭터콜)은 스태틱컨스트럭터 실행을 트리거합니다.스태틱 컨스트럭터는 스레드 세이프이며 싱글톤 패턴을 구현합니다.범용 프로그래밍 클래스에서 사용되는 경우 정적 생성자는 새로운 범용 인스턴스화 때마다 유형별로 하나씩 호출됩니다.정적 변수도 인스턴스화됩니다.
일반의 학급 마이클래스 { 사적인 정적인 인트 _A; // 일반 생성자 정적인 마이클래스() { _A = 32; } // 표준 기본 생성자 일반의 마이클래스() { } }
// 코드 위치 // 위의 생성자를 사용하여 개체 인스턴스화 // 인스턴스화 직전 // 변수 정적 생성자가 실행되고 _A는 32입니다. 마이클래스 c = 신규 마이클래스();
CFML
CFML은 '라는 이름의 메서드를 사용합니다.init
'는 컨스트럭터 메서드로 사용됩니다.
치즈.cfc
요소 { // 속성 소유물 이름.="치즈명"; // 컨스트럭터 기능. 치즈 초기화( 필수의 스트링 치즈명 ) { 변수.치즈명 = 논쟁들.치즈명; 돌아가다 이것.; } }
치즈 인스턴스를 만듭니다.
마이치즈 = 신규 치즈( '체다 );
ColdFusion 10 [7]이후 CFML에서는 컨스트럭터 메서드의 이름 지정도 지원되고 있습니다.
요소 초기화 방법="치즈" { // 속성 소유물 이름.="치즈명"; // 컨스트럭터 기능. 치즈 치즈( 필수의 스트링 치즈명 ) { 변수.치즈명 = 논쟁들.치즈명; 돌아가다 이것.; } }
에펠
에펠에서는 새로운 물체를 초기화하는 절차를 생성 절차라고 합니다.작성 절차에는 다음과 같은 특성이 있습니다.
- 작성 프로시저에는 [a](프로시저의 정의에 의한) 명시적인 반환 타입이 없습니다.
- 작성 순서의 이름이 지정됩니다.
- 작성 프로시저는 클래스 텍스트에서 작성 프로시저로 이름으로 지정됩니다.
- 생성 절차를 명시적으로 호출하여 기존 개체를 다시 초기화할 수 있습니다.
- 모든 효과적인(즉, 구체적이거나 추상적이지 않은) 클래스는 하나 이상의 생성 절차를 지정해야 합니다.
- 생성 프로시저는 새로 초기화된 개체를 클래스 [b]불변성을 충족하는 상태로 유지해야 합니다.
오브젝트 작성에는 몇 가지 [8]하위 항목이 포함되지만 일반적인 선언을 사용하여 Atribute를 작성합니다.x: T
창조지시로 표현된 바와 같이create x.make
는 다음 순서로 구성되어 있습니다.
- 유형의 새 직접 인스턴스 생성
T
를 클릭합니다.[c] - 작성 절차 실행
make
새로 생성된 인스턴스로 이동합니다. - 새로 초기화된 개체를 엔티티에 연결합니다.
x
.
아래 첫 번째 토막에서 class는POINT
정의되어 있습니다.순서make
키워드 뒤에 코드화되어 있습니다.feature
.
키워드create
에 인스턴스 초기화에 사용할 수 있는 절차 목록을 나타냅니다.이 경우 목록에는 다음이 포함됩니다.default_create
클래스에서 상속된 빈 구현이 있는 절차ANY
, 및make
클래스 내에서 코드화된 프로시저.
학급 포인트 만들다 default_create, 만들다 특징 만들다 (a_x_값: 진짜; a_y_값: 진짜) 하다 x := a_x_값 y := a_y_값 끝. x: 진짜 -- X 좌표 y: 진짜 -- Y좌표 ...
두 번째 스니펫에서는 클라이언트의 클래스입니다.POINT
선언이 있다my_point_1
그리고.my_point_2
타입의POINT
.
절차 코드에서my_point_1
는 오리진(0.0, 0.0)으로 작성됩니다.작성절차가 지정되어 있지 않기 때문에,default_create
수업에서 물려받은ANY
사용됩니다.이 라인은 코드화되어 있을 수 있습니다.create my_point_1.default_create
. 생성 절차라고 명명된 절차만 명령에서 사용할 수 있습니다.create
키워드를 지정합니다.다음은 의 작성 순서입니다.my_point_2
의 초기값을 제공합니다.my_point_2
의 좌표입니다.세 번째 명령에서는 일반적인 인스턴스 호출이 이루어집니다.make
접속되어 있는 인스턴스를 재초기화하는 순서my_point_2
다양한 가치관을 가지고 있습니다.
my_point_1: 포인트 my_point_2: 포인트 ... 만들다 my_point_1 만들다 my_point_2.만들다 (3.0, 4.0) my_point_2.만들다 (5.0, 8.0) ...
F#
F#에서 컨스트럭터는 다음을 포함할 수 있습니다.let
또는do
클래스 내에서 정의된 스테이트먼트. let
private 필드를 정의하고,do
문이 코드를 실행합니다.다음 명령어를 사용하여 추가 생성자를 정의할 수 있습니다.new
키워드를 지정합니다.
유형 마이클래스(_a : 인트, _b : 스트링) = 학급 // 기본 생성자 허락하다 a = _a 허락하다 b = _b 하다 인쇄 "a = %i, b = %s" a b // 추가 생성자 신규(_a : 인트) = 마이클래스(_a, "") 그리고나서 인쇄 "정수 매개 변수가 지정됨" 신규(_b : 스트링) = 마이클래스(0, _b) 그리고나서 인쇄 "문자열 매개 변수가 지정됨" 신규() = 마이클래스(0, "") 그리고나서 인쇄 "지정된 매개 변수 없음" 끝.
// 코드 위치 // 주 생성자를 사용하여 개체 인스턴스화 허락하다 c1 = 신규 마이클래스(42, "문자열') // 추가 생성자를 사용하여 개체 인스턴스화 허락하다 c2 = 신규 마이클래스(42) 허락하다 c3 = 신규 마이클래스("문자열') 허락하다 c4 = 마이클래스() // "new" 키워드는 옵션입니다.
자바
Java에서 컨스트럭터는 다음과 같은 점에서 다른 메서드와 다릅니다.
- 생성자에는 명시적인 반환 유형이 없습니다.
- 생성자를 직접 호출할 수 없습니다(키워드 ").
new
" 를 기동합니다). - 생성자에는 액세스 수식자가 없어야 합니다.
Java 컨스트럭터는 다음 작업을 다음 순서로 수행합니다.
- 생성자가 정의되지 않은 경우 슈퍼클래스의 기본 생성자를 호출합니다.
- 멤버 변수를 지정된 값으로 초기화합니다.
- 생성자의 본문을 실행합니다.
Java는 사용자가 다음을 사용하여 다른 생성자의 한 생성자를 호출할 수 있도록 허용합니다.this()
키워드를 지정합니다.그렇지만this()
첫 번째 문이어야 합니다.[9]
학급 예 { 예() // 매개 변수화되지 않은 생성자 { 이것.(1); // 생성자 호출 시스템..나가..인쇄("0-contract-cons"); } 예(인트 a) // 매개 변수화된 생성자 { 시스템..나가..인쇄("1개의 콘센트"); } } 일반의 정적인 무효 주된(스트링[] args) { 예 e = 신규 예(); }
Java는 Superclass의 컨스트럭터에 대한 액세스를 제공합니다.super
키워드를 지정합니다.
일반의 학급 예 { // 생성자의 정의입니다. 일반의 예() { 이것.(1); } // 생성자 오버로드 일반의 예(인트 입력) { 데이터. = 입력; // 이것은 할당입니다. } // 인스턴스 변수 선언입니다. 사적인 인트 데이터.; }
// 다른 곳에 코드 입력 // 위 생성자를 사용하여 개체 인스턴스화 예 e = 신규 예(42);
인수 수를 0으로 하는 생성자를 "no-arguments" 또는 "no-arg"[10] 생성자라고 합니다.
자바스크립트
ES6에서 JavaScript는 다른 많은 프로그래밍 언어처럼 직접 생성자를 가지고 있습니다.그렇게 쓰여 있다
학급 푸바 { 컨스트럭터(바즈) { 이것..바즈 = 바즈 } }
이것은 그렇게 인스턴스화할 수 있다.
컨스턴트 후우 = 신규 푸바('7')
ES6 이전 버전에서는 오브젝트를 인스턴스화하는 함수를 만들었습니다.
기능. 푸바 (바즈) { 이것..바즈 = 바즈; }
이것은 위와 같은 방법으로 인스턴스화 됩니다.
오브젝트 파스칼
Object Pascal에서 생성자는 공장 방법과 유사합니다.통상의 메서드와 구문상의 차이는, 다음의 키워드입니다.constructor
이름 앞에 (를 포함)procedure
또는function
)는 임의의 이름을 가질 수 있습니다.단, 표기법은Create
프리픽스로서(예: in)CreateWithFormatting
. 클래스의 인스턴스를 만드는 것은 클래스의 정적 메서드를 호출하는 것과 같습니다.TPerson.Create('Peter')
.
프로그램. Oop 프로그램; 유형 TPerson = 학급 사적인 FName: 스트링; 일반의 소유물 이름.: 스트링 읽어주세요 FName; 컨스트럭터 만들다(아나메: 스트링); 끝.; 컨스트럭터 TPerson.만들다(아나메: 스트링); 시작한다. FName := 아나메; 끝.; 변화하다 사람인: TPerson; 시작한다. 사람인 := TPerson.만들다('피터'); // TPerson 인스턴스를 할당하고 TPerson을 호출합니다.매개 변수 ANAME = '피터'를 사용하여 생성 끝..
OCaml
OCaml에는 컨스트럭터가 1개 있습니다.파라미터는 클래스 이름 바로 뒤에 정의됩니다.인스턴스 변수를 초기화하는 데 사용할 수 있으며 클래스 전체에서 액세스할 수 있습니다.라는 익명 숨김 메서드initializer
그럼 오브젝트가 작성된 직후에 식을 평가할 수 있습니다.[11]
학급 사람인 이름 성_이름 = 물건 값 full_name = 이름 ^ " " ^ 성_이름 이니셜라이저 print_endline("안녕하세요, 저는" ^ full_name ^ ".") 방법 get_last_name = 성_이름 끝.;; 허락하다 알론조 = 신규 사람인 '알론조' "교회" 에 (*안녕하세요, 저는 알론조 교회입니다.*) print_endline 알론조#get_last_name (*교회*)
PHP
PHP 버전 5 이상에서 생성자는 다음과 같은 이름의 메서드입니다.__construct()
(더블 언더스코어라고 생각됩니다), 키워드는new
는 오브젝트 작성 후 자동으로 호출합니다.일반적으로 속성 초기화 등의 초기화를 자동으로 수행하는 데 사용됩니다.컨스트럭터도 인수를 받아들일 수 있습니다.이 경우 다음과 같은 경우,new
스테이트먼트가 작성되어 파라미터의 [1]컨스트럭터 인수도 송신할 필요가 있습니다.
학급 사람인 { 사적인 스트링 이름; 일반의 기능. __개요(스트링 이름): 무효 { $ this->이름. = 이름; } 일반의 기능. getName(): 스트링 { 돌아가다 $ this->이름.; } }
PHP에서는 클래스가 최대 1개의 컨스트럭터 메서드만 선언할 수 있습니다.정적 메서드, 팩토리 클래스 또는 선택적 생성자 인수는 PHP 클래스의 개체를 만드는 여러 가지 방법을 용이하게 하는 몇 가지 방법입니다.
Perl 5
Perl 프로그래밍 언어 버전 5에서는 기본적으로 컨스트럭터는 공장 메서드, 즉 오브젝트를 만들고 반환하는 메서드입니다.구체적으로는 참조를 생성하여 반환하는 것을 의미합니다.일반적인 개체는 해시에 대한 참조이지만 다른 유형에 대한 참조도 거의 사용되지 않습니다.관례상 유일한 생성자는 new로 명명되지만 다른 이름을 붙일 수도 있고 여러 생성자를 가질 수도 있습니다.예를 들어 Person 클래스에는 new라는 이름의 컨스트럭터, Person 속성 파일을 읽는 컨스트럭터 new_from_file 및 다른 Person 개체를 템플릿으로 사용하는 new_from_person이 있을 수 있습니다.
패키지 사람인; # Perl 컨스트럭터에는 관례에 따라 'new'라는 이름이 붙습니다. 후보선수 신규 { # 클래스명은 암묵적으로 0번째 인수로 전달됩니다. 나의 $클래스 = 교대하다; # 디폴트 속성 값(있는 경우). 나의 %parames(%pause) = ( 후우 => '바' ); # 전달된 기본값과 인수의 조합으로 속성을 초기화합니다. 나의 자기 부담 = { %parames(%pause), @_ }; # 필수 인수, 클래스 불변성 등을 확인합니다. 한다면 ( 것은 아니다. 정의되어 있다 자기 부담->{이름} ) { 죽어버려 "Person->new(): first_name에 필수 속성이 없습니다."; } 한다면 ( 것은 아니다. 정의되어 있다 자기 부담->{성_이름} ) { 죽어버려 "Person->new(): last_name에 필수 속성이 없습니다."; } 한다면 ( 정의되어 있다 자기 부담->{나이} 그리고. 자기 부담->{나이} < > 18 ) { 죽어버려 "개인->new()의 잘못된 속성 값: 18세 미만"; } # Perl은 'bless'를 통해 개체를 클래스에 속하게 합니다. 축복하다 자기 부담, $클래스; 돌아가다 자기 부담; } 1;
무스 포함 Perl 5
Perl용 Moose 오브젝트시스템에서는 이 보일러 플레이트의 대부분은 생략할 수 있습니다.기본값의 신규 작성, 속성 지정 및 설정, 리셋 또는 필수 여부를 지정할 수 있습니다.또한 추가 컨스트럭터 기능을 Moose 생성 컨스트럭터가 인수를 체크한 후 호출하는 빌드 메서드에 포함할 수 있습니다.BUILDARGS 메서드는 hashref / key => 값 형식이 아닌 생성자 인수를 처리하도록 지정할 수 있습니다.
패키지 사람인; # 무스 스타일 객체 구축 활성화 사용하다 무스; # 이름(문자열)은 시공 시에만 설정할 수 있습니다('ro'). 가지다 이름 => (이 => '로', 이사 => '스트레이트', 필수의 => 1); # 성(문자열)은 구성 시에만 설정할 수 있습니다('ro'). 가지다 성_이름 => (이 => '로', 이사 => '스트레이트', 필수의 => 1); 시공 후 경과시간(정수)을 변경할 수 있으며('rw'), 필수는 아닙니다. # 컨스트럭터로 합격합니다.또한 반환되는 'has_age' 메서드를 만듭니다. # 연령이 설정되어 있는 경우 true 가지다 나이 => (이 => 'rw', 이사 => 'Int', 술어 => 'has_age'); # 커스텀 요건 확인 후보선수 빌드 { 나의 자기 부담 = 교대하다; 한다면 (자기 부담->has_age & & 자기 부담->나이 < > 18) { # 18대 미만 없음 죽어버려 "18세 미만 관람 불가"; } } 1;
두 경우 모두 Person 클래스는 다음과 같이 실행됩니다.
사용하다 사람인; 나의 p달러 = 사람인->신규( 이름 => 샘, 성_이름 => '아쉬', 나이 => 42 );
파이썬
Python에서 컨스트럭터는 다음 중 하나 또는 둘 다에 의해 정의됩니다.__new__
그리고.__init__
방법들.클래스가 함수인 것처럼 호출함으로써 새로운 인스턴스가 생성됩니다.이러한 인스턴스는__new__
그리고.__init__
방법들.생성자 메서드가 클래스에 정의되지 않은 경우 클래스의 메서드 해결 순서에 있는 다음 메서드가 [12]호출됩니다.
일반적인 경우,__init__
방법을 정의해야 합니다.(가장 일반적인 예외는 불변 객체에 대한 것입니다).
>>>학급 클래스 예시: ... 방어하다 __new__(클릭, 가치): ... 인쇄물("새 인스턴스를 만드는 중....") ... # 슈퍼클래스 컨스트럭터를 호출하여 인스턴스를 만듭니다. ... 사례 = 잘 하는 군요(클래스 예시, 클릭).__new__(클릭) ... 돌아가다 사례 ... 방어하다 __init__(자신, 가치): ... 인쇄물("인스턴스 초기화 중....") ... 자신.페이로드 = 가치 >>>예 인스턴스 = 클래스 예시(42) 새 인스턴스를 만드는 중... 인스턴스 초기화 중... >>>인쇄물(예 인스턴스.페이로드) 42
클래스는 보통 자신의 새로운 인스턴스의 팩토리로서 기능합니다.즉, 클래스는 콜 가능한 오브젝트(함수 등)이며, 콜이 컨스트럭터이며, 클래스를 호출하면 해당 클래스의 인스턴스가 반환됩니다.하지만, 그__new__
메서드는 특수 목적을 위해 클래스의 인스턴스 이외의 것을 반환할 수 있습니다.이 경우,__init__
는 [13]호출되지 않습니다.
라쿠
Raku에서는 디폴트의 새로운 메서드가 상속되어 속성을 지정할 수 있을 뿐만 아니라 설정, 리셋 또는 필수 여부를 지정할 수 있기 때문에 더 많은 보일러 플레이트를 생략할 수 있습니다.또한 커스텀 초기화를 위해 호출되는 빌드 메서드에 추가 컨스트럭터 기능을 포함할 수 있습니다.TWEAK 메서드는 이미(암시적으로) 초기화된 속성을 후처리하도록 지정할 수 있습니다.
class Person { has Str $.first-name은 필수입니다.# 이름(문자열)은 # 구축 시에만 설정할 수 있습니다(.는 "public"을 의미합니다).has str $.last-name은 필수입니다.# 성(문자열)은 # 구축시에만 설정할 수 있습니다(!는 "프라이빗"을 의미합니다).Int $.age는 rw입니다.# 에이지(정수)는 # 구축 후 변경할 수 있으며('rw'), 오브젝트 인스턴스화 중에는 # 필수가 아닙니다.# 사용자의 전체 이름을 반환하는 '전체 이름' 메서드를 만듭니다.# 이 메서드는 클래스 밖에서 액세스할 수 있습니다.method full-name { $!first-name.tc ~ " ~ $!last-name.tc } # 경과시간이 설정되면 true를 반환하는 'has-age' 메서드를 만듭니다.# 이 메서드는 클래스 내에서만 사용되므로 ! 메서드 앞에 !has-age { self . age . defined } # 사용자 지정 요건 메서드 TWEAK { if self ! has - age & $ !& age < 18 { # No under 18 ; }}로 선언됩니다.
사용자 클래스는 다음과 같이 인스턴스화됩니다.
my $p0 = Person.new ( first name = > 'Sam', 성 = > 'Ashe', 나이 = > 42 ), my $p1 = Person.new ( first name = > 'first name', 성 => 'fl-name'; #Outputput : 호퍼레이스 = > Hopper.
또는 Perl 6의 colon-pair 구문을 사용하여 이름 있는 파라미터를 지정할 수 있습니다.
my $p0 = Person.new ( : first name < Sam > , : last name < )Ashe>, :age(42); my $p1 = Person.new ( : first - name < Grace > , : last - name < )호퍼> );
또한 명명된 파라미터와 동일한 이름으로 변수를 설정한 경우 명명된 파라미터에 변수 이름을 사용하는 바로 가기를 사용할 수 있습니다.
내 $first-name = "Sam", 내 $last-name = "Ashe", 내 $age = 42, 내 $p0 = Person.new(:$first-name,:$last-name,:$age);
루비
Ruby에서 컨스트럭터는 다음과 같은 메서드를 정의함으로써 생성됩니다.initialize
이 메서드는 각 새 인스턴스를 초기화하기 위해 실행됩니다.
irb(메인):001:0>학급 클래스 예시 irb(메인):002:1> 방어하다 초기화하다 irb(메인):003:2 > 놓다 "안녕하세요" irb(메인):004:2 > 끝. irb(메인):005:1>끝. => 없음 irb(메인):006:0 >클래스 예시.신규 저기요, 안녕하세요 => # <예: 클래스: 0x007fb3f4299118>
Visual Basic.그물
[ Visual Basic ]그래서NET, 컨스트럭터는 ""라는 이름의 메서드 선언을 사용합니다.New
".
학급 푸바 사적인 strData ~하듯이 스트링 ' 컨스트럭터 일반의 후보선수 신규(바이밸 일부 패램 ~하듯이 스트링) strData = 일부 패램 끝. 후보선수 끝. 학급
'다른 곳에 있는 코드 위의 생성자를 사용하여 개체를 인스턴스화합니다. 어둡다 후우 ~하듯이 신규 푸바(".NET")
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ a b c 생성자 및 파괴자(PHP 온라인 설명서)
- ^ 데이터 모델, Python 온라인 설명서
- ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order 컨스트럭터
- ^ "Fabulous Adventures in Coding". Eric Lippert. 2013-02-06. Retrieved 2014-04-05.
- ^ Expert .NET 2.0 IL Assembler. APress. 2006-01-01. ISBN 9781430202233. Retrieved 2014-04-05.
- ^ MSDN의 C# 스태틱컨스트럭터
- ^ CFC 컴포넌트
- ^ Epel ISO/ECMA 사양서
- ^ Java 컨스트럭터 상세
- ^ "Providing Constructors for Your Classes". Oracle Corporation. 2013. Retrieved 2013-12-20.
- ^ OCaml 매뉴얼
- ^ 데이터 모델
- ^ 데이터 모델