오브젝트 구성

Object composition

컴퓨터 과학에서 객체 구성객체 집계는 객체 또는 데이터 유형을 더 복잡한 것으로 결합하는 밀접하게 관련된 방법입니다.대화에서 구성과 집계의 구별은 종종 [1]무시된다.일반적인 종류의 구성은 객체 지향 프로그래밍, 태그 부착 결합, 집합, 시퀀스다양한 그래프 구조에서 사용되는 객체입니다.객체 구성은 데이터 구조와 관련되지만 데이터 구조와 동일하지는 않습니다.

객체 구성은 정보의 논리적 또는 개념적 구조를 의미하며, 이를 나타내기[citation needed] 위해 사용되는 구현이나 물리적 데이터 구조가 아닙니다.를 들어, 시퀀스는 (특히) 구성 항목의 순서는 전자의 것이 아니라 후자의 것이므로 집합과 다르다.어레이, 링크드 리스트, 해시 테이블 등의 데이터 구조를 사용하여 이들 중 하나를 구현할 수 있습니다.데이터 구조와 복합 재료 모두에 동일한 용어가 사용되는 것은 혼란스러울 수 있습니다.예를 들어, "이진 트리"는 데이터 구조로서 항목의 선형 시퀀스에 액세스하는 수단이며 트리 내의 항목의 실제 위치는 관련이 없습니다(트리는 의미를 변경하지 않고 원하는 대로 내부적으로 재배치할 수 있습니다).그러나 객체 구성으로서 위치는 관련성이 있으며, 위치를 변경하면 의미가 변경됩니다(예:[citation needed] 클래다그램).

프로그래밍 기술

객체 지향 프로그래밍은 데이터와 동작을 캡슐화하는 객체를 기반으로 합니다.기능을 보다 복잡한 기능으로 조립하고 구성하기 위해 서브타이핑과 객체 [2]구성이라는 두 가지 주요 기술을 사용합니다.오브젝트 구성은 복합 오브젝트 내에서 오브젝트를 결합하는 것과 동시에 내부가 보이지 않고 잘 정의된 인터페이스를 사용하여 각 오브젝트의 캡슐화를 보증하는 것입니다.이 점에서 오브젝트 구성은 캡슐화를 강제하지 않는 데이터 구조와는 다릅니다.

오브젝트 구성은 오브젝트 세트나 시퀀스와 같은 여러 관련 오브젝트 그룹에 관한 것일 수도 있습니다.위임을 통해 둘러싸인 복합 객체에 대한 요청 또는 콜을 내부 [3]컴포넌트 중 하나로 전송함으로써 구성을 강화할 수 있습니다.

클래스 베이스 타입형 프로그래밍 언어에서는 타입을 복합 타입과 비복합 타입으로 나눌 수 있으며, 컴포지트 타입의 오브젝트(를 들어 자동차)는 다른 타입의 오브젝트(를 들어 휠)를 가지고 있다.복합 객체에 동일한 유형의 하위 객체가 여러 개 포함된 경우 이름 또는 번호로 구분되는 특정 역할에 할당할 수 있습니다.예를 들어, 점 개체에는 'x', 'y' 및 'z'와 같이 서로 다른 축을 따라 거리를 나타내는 세 개의 숫자가 포함될 수 있습니다.일반적으로 부분-전체 관계에 대한 연구는 단순한 연구이다.

합성은 서브타이핑과 구별되어야 합니다.서브타이핑은 일반적인 데이터 타입에 상세 내용을 추가하여 보다 구체적인 데이터 타입을 작성하는 프로세스입니다.예를 들어, 자동차는 특정한 종류의 차량일 수 있다: 자동차차량이다.서브타이핑은 다른 객체 간의 관계를 설명하는 것이 아니라 한 유형의 객체가 동시에 다른 유형의 객체임을 나타냅니다.그러한 관계에 대한 연구가 존재론이다.

JavaScript와 같은 프로토타입 기반 프로그래밍 언어에서 객체는 인스턴스화 시점의 프로토타입 객체에서 동작을 동적으로 상속할 수 있습니다.구성은 프로토타이핑과 구별되어야 합니다. 새로 인스턴스화된 개체는 프로토타입의 구성을 상속받지만 자체적으로 구성될 수도 있습니다.

복합 객체는 합성 객체의 위치를 같게 하거나 참조를 같게 하거나 여러 가지 방법으로 스토리지에 표시할 수 있습니다.복합 객체 내의 항목은 속성, 필드, 멤버, 속성 또는 기타 이름으로 참조될 수 있으며, 결과적으로 복합 유형, 스토리지 레코드, 구조, 튜플 또는 사용자 정의 유형(UDT)으로 참조될 수 있습니다.상세한 것에 대하여는, 다음의 집약 섹션을 참조해 주세요.

UML 모델링 기술

A bycicle class represented in UML, with three properties: saddle, wheels and parts, the two last having a multiplicity indicating several objects
UML 속성을 사용하여 객체를 구성하는 객체 구성

UML 모델링에서는 오브젝트는 개념적으로 프로그래밍 언어를 사용한 구현과는 독립적으로 구성될 수 있습니다.UML에는 속성, 연관성, 집계 및 [4]구성의 네 가지 방법이 있습니다.

  • 속성은 클래스의 속성을 나타냅니다.
  • 연관성은 연관된 클래스의 인스턴스 간의 의미 관계를 나타냅니다.어소시에이션의 멤버 엔드는 어소시에이션클래스의 속성에 대응합니다.
  • 애그리게이션은 애그리게이트(전체)와 관련된 컴포넌트(부품) 그룹 간의 부품/전체 관계를 모델링하는 일종의 연관성입니다.
  • 컴포지트 어그리게이션이라고도 불리는 조성은 컴포지트(전체)와 독점적으로 소유되는 부품 그룹 간의 부품/전체 관계를 모델링하는 어그리게이션의 일종입니다.

애그리게이트와 컴포넌트 간의 관계는 약한 "has-a" 관계입니다.구성 요소는 여러 Aggregate의 일부일 수 있으며, Aggregate를 거치지 않고 다른 개체를 통해 액세스할 수 있으며 Aggregate [4]개체보다 오래 지속될 수 있습니다.구성 요소 개체의 상태는 여전히 집계 [citation needed]개체의 일부를 구성합니다.

복합체와 해당 부품 간의 관계는 강력한 "가진" 관계입니다.컴포지트 오브젝트는 "컴포지트 오브젝트의 존재와 저장에 대한 유일한 책임"을 가지며, 컴포지트 오브젝트는 최대 1개의 컴포지트 오브젝트에 속할 수 있습니다.또한 컴포지트 오브젝트가 삭제되면 오브젝트인 모든 부품인스턴스도 함께 삭제됩니다.따라서 UML에서 구성은 일반적인 객체 구성보다 더 좁은 의미를 가집니다.

Association between several bicycles each having one owner; Composition of a bicycle with frame parts which make the bicycle; and aggregation of a bicycle with its wheels, which exist without the bicycle
연관성, 구성 및 집약을 위한 UML 표기법

그래픽 표기법은 다음을 나타냅니다.

  • 동봉된 클래스의 상자에 입력된 요소로서의 속성,
  • 관련 클래스 간의 플레인 라인으로 관련지어집니다.
  • 골재 측면의 채워지지 않은 다이아몬드와 실선으로 응집된 것.
  • 합성 및 실선의 측면에 채워진 다이아몬드로 구성된 조성물.

집약

통합은 소유권을 의미하지 않는다는 점에서 일반적인 구성과 다르다.구성에서는 소유 개체가 파괴되면 포함된 개체도 파괴됩니다.집계에서는 이것이 반드시 맞는 것은 아닙니다.예를 들어, 대학에는 다양한 학과(예: 화학)가 있고 각 학과에는 다수의 교수가 있습니다.대학이 문을 닫으면 학과는 없어지지만 그 학과의 교수들은 계속 존재할 것이다.따라서 대학은 학과들의 구성이라고 볼 수 있는 반면, 학과들은 교수들의 집단을 가지고 있다.또한, 교수 한 명은 한 개 이상의 학과에 근무할 수 있지만, 한 학과는 한 개 이상의 대학에 속할 수 없습니다.

구성은 일반적으로 객체에 다른 객체가 포함되도록 구현됩니다.예를 들어 C++경우:

학급 교수님;  // 다른 곳에 정의  학급 부서 {  일반의:   부서(컨스턴트 표준::스트링& 직함): 제목_(직함) {}   사적인:   // 집약: 교수는 학과보다 오래 살 수 있습니다.   표준::벡터< >표준::약한_ptr< >교수님>> 멤버_;   컨스턴트 표준::스트링 제목_; };   학급 대학. {  일반의:   대학.() = 체납;   사적인:   // 구성:학과는 교직원이 존재하는 한에만 존재합니다.   표준::벡터< >부서> 교수진_ = {       부서("실패"),       부서("실패"),       부서("아트"),   }; }; 

집약에서 오브젝트는 오브젝트에 대한 참조 또는 포인터만 포함할 수 있습니다(이러한 오브젝트에 대한 평생 책임은 지지 않습니다.

일반적인 구성과 통합의 구분이 중요하지 않은 경우 통합을 구성이라고 한다.

위의 코드는 다음 UML 클래스 다이어그램으로 변환됩니다.

Aggregation-Composition3.png

COM에서의 집약

COM에서의 집약

Microsoft의 Component Object Model에서 집약은 개체가 소유하는 다른 개체의 하나 또는 여러 인터페이스를 소유자인 것처럼 내보내는 것을 의미합니다.형식적으로는 집약이라기보다는 구성 또는 캡슐화에 가깝습니다.단, 소유 객체의 인터페이스를 호출하여 내보낸 인터페이스를 구현하는 대신 소유 객체 자체의 인터페이스를 내보냅니다.소유 오브젝트는 이러한 인터페이스의 메서드가 에서 상속되도록 해야 합니다.IUnknown은 실제로 소유자의 대응하는 메서드를 호출합니다.이는 소유자의 참조 카운트가 올바르고 내보내기된 인터페이스를 통해 소유자의 모든 인터페이스에 액세스할 수 있으며 소유자의 다른 (프라이빗) 인터페이스에는 액세스할 [5]수 없음을 보증하기 위한 것입니다.

특수 양식

콘테인먼트

합성된 데이터 유형의 여러 인스턴스를 저장하는 데 사용되는 구성을 Containment라고 합니다.이러한 컨테이너의 예로는 배열, 연관 배열, 이진 트리 및 연결된 목록이 있습니다.

UML에서 격납은 0의 배수로 표현된다.* 또는 1..*: 컴포지트 객체가 컴포지트클래스의 알 수 없는 인스턴스 수로 구성되어 있음을 나타냅니다.

재귀적 구성

오브젝트는 재귀적으로 구성될 수 있으며 그 유형을 재귀 유형이라고 합니다.예를 들어 다양한 종류의 트리, DAG그래프가 있습니다.트리의 각 노드는 분기 또는 리프일 수 있습니다.즉, 다른 트리에 속해 있는 경우 각 노드는 동시에 트리입니다.

UML에서 재귀적 구성은 클래스 자체의 연관성, 집계 또는 구성과 함께 묘사된다.

복합 패턴

복합 설계 패턴은 복합 유형을 기반으로 하는 객체 지향 설계로, 복잡한 부품-전체 계층 구조를 구현하기 위해 재귀적 구성과 격납을 결합합니다.

C의 복합형

이것은 C에서의 구성 예시입니다.

구조 사람인 {   인트 나이;    이름.[20];   열거하다 {구직., 전문적인, 프로페셔널하지 않다, 은퇴한, 학생입니다} 고용.; }; 

예에서는 int, enum {job_seeking, professional, non_professional, requested, student} 및 복합 어레이 타입 char[]가 조합되어 복합 구조 Person을 형성하고 있습니다. 사용자 구조에는 "연령, 이름 및 고용 유형이 있습니다.

다양한 언어의 작문 연표

C는 레코드를 구조체 또는 구조체라고 부릅니다.Java, Smalltalk, C++ 등의 객체 지향 언어는 레코드를 객체(클래스 인스턴스) 에 숨깁니다.ML 패밀리의 언어에서는 레코드를 레코드라고 부릅니다.COBOL은 레코드를 [6]직접 지원하는 최초의 광범위한 프로그래밍 언어이며, ALGOL 68은 COBOL로부터, 파스칼은 다소 간접적으로 ALGOL 68로부터 얻었다.Common Lisp는 구조 및 클래스를 제공합니다(Common Lisp Object System[citation needed]통한 구조 및 클래스).

1959 – COBOL
      01  고객 기록.         03  고객 번호     그림 9(8) 컴포넌트.         03  고객명.           05  명명된 이름       그림 x(15).           05  이니셜 2         그림 x.           05             그림 x(15).         03  고객 주소.           05  거리.             07  거리의 이름     그림 x(15).               09  가옥 번호  그림 999 컴포넌트.           05  도시              그림 x(10).           05  국가 코드      그림 x(3).           05  우편번호          그림 x(8).         03  양적        그림 9(8) 컴포넌트. 
1960 – ALGOL 60

어레이는 Algol 60의 유일한 복합 데이터 유형입니다.

1964 – PL/I
dcl 1 뉴티펫 기반(P); 2(a, b, c) 고정 빈(31), 2(i, j, k) 플로트, 2r ptr; 뉴티펫 할당;
1968 – ALGOL 68
int max = 99, mode newtypet = [0..9] [0 . max ]syslog ( long real a , b , c , short int i , j , k , ref real r ) ; newtypet newarrayt = ( 1, 2, 3, 4, 5, 6, 힙 real : = 7 )

예를 들어 링크된 목록은 다음과 같이 선언될 수 있습니다.

모드 노드 = 결합(리얼, int, conf, 문자열), 목록 = 구조(노드 값, 참조 목록 다음);

ALGOL 68의 경우 유형 이름만 등호 왼쪽에 표시되며, 가장 주목할 만한 것은 우선순위에 관계없이 구조가 왼쪽에서 오른쪽으로 작성되고 읽을 수 있다는 것입니다.

1970 – 파스칼
유형  a = 배열 [1..10]  정수;  b = 기록.   a, b, c: 진짜;   i, j, k: 정수;  끝.; 
1972 – K&R C
#최고치 99 구조 펫토 {   이중으로 하다 a, b, c;   흘러가다 r;   짧다 i, j, k; } 새로운 어레이[10] [맥스. + 1]; 
1977 – FORTRAN 77

Fortran 77에는 어레이가 있지만 공식적인 기록/구조 정의는 없었습니다.일반적으로 복합 구조는 EQUARENCE 또는 COMMON 문구를 사용하여 구축되었습니다.

       성격이름.*32, 주소*32, 전화*16        진짜빚지고 있다        흔한 /고객/이름., 주소, 전화, 빚지고 있다 
1983 – 아다
유형 고객   기록.   이름.  : Name_Type(이름_타입);   주소  : Addr_Type(Addr_Type);   전화 : Phone_Type(전화기_타입);   빚이 있다 : 정수 범위 1..999999;  종료 레코드; 

Ada 95는 태그 부착 유형(C++ 등급에 상당)을 통해 OOP 개념을 도입하였으며, Ada 2012는 클래스 전체 계약을 통한 대체 검증 지원을 추가하였다.

1983 – C++
컨스턴트 인트 맥스. = 99; 학급 {   일반의:   이중으로 하다 a, b, c;   흘러가다 &r;   짧다 i, j, k; }펫토[10] [맥스. + 1]; 
1991 – Python
맥스. = 99 학급 New Type T:     방어하다 __init__(자신):         자신.a = 자신.b = 자신.c = 0         자신.i = 자신.j = 자신.k = 0.0 # 이 클래스의 예시 배열을 초기화합니다. 새로운 어레이 = [[New Type T() 위해서 i  범위(맥스. + 1)] 위해서 j  범위(10)] 
1992 – FORTRAN 90

어레이와 문자열은 FORTRAN 77에서 상속되었으며 새로운 예약 단어 type이 도입되었습니다.

유형펫토  2배 정밀도a, b, c  정수*2 i, j, k * 아니요. 포인터 타입참조 진짜R  엔드 타입  유형 (펫토) t(10, 100) 

FORTRAN 90은 NAMELIST라고 불리는 FORTRAN IV의 개념을 업데이트하고 포함시켰습니다.

정수 ::  = 1, 2월 = 2, 마르다 = 3, 에이프릴 = 4 네임 / 일주일 / , 2월, 마르다, 에이프릴 
1994 – ANSI 공통 리스프

Common Lisp는 구조를 제공하며 ANSI Common Lisp 표준에 CLOS 클래스가 추가되었습니다.

(디클래스 어떤 급의 ()   ((f : 타입 흘러가다)    (i : 타입 정수)    (a : 타입 (배열 정수 (10))))) 

C/C++에서의 구성에 대한 자세한 내용은 복합 유형을 참조하십시오.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Yaiser, Michelle. "Object-oriented programming concepts: Composition and aggregation". Archived from the original on April 8, 2015. There is a closely related concept to composition called aggregation. In conversation the differences between composition and aggregation are often ignored.
  2. ^ Design patterns : elements of reusable object-oriented software. Gamma, Erich., Helm, Richard (Computer scientist), Johnson, Ralph E., 1955-, Vlissides, John. Reading, Mass.: Addison-Wesley. 1995. ISBN 0-201-63361-2. OCLC 31171684.{{cite book}}: CS1 유지보수: 기타 (링크)
  3. ^ Ostermann, Klaus; Mezini, Mira (October 1, 2001). "Object-oriented composition untangled". ACM SIGPLAN Notices. 36 (11): 283–299. doi:10.1145/504311.504303. ISSN 0362-1340.
  4. ^ a b OMG (2017). "Unified Modeling Language Specification Version 2.5.1". www.omg.org. p. 109-110,197-201. Retrieved October 4, 2020.
  5. ^ "Aggregation". Platform SDK for Windows XP SP2. Microsoft. Retrieved November 4, 2007.
  6. ^ Sebesta, Robert W. Concepts of Programming Languages (Third ed.). Addison-Wesley Publishing Company, Inc. p. 218. ISBN 0-8053-7133-8.

외부 링크