java composition what is composition java
이 Java 컴포지션 튜토리얼은 Java의 컴포지션 및 집계와 그 차이점을 설명합니다.
지난 두 개의 튜토리얼에서 우리는 Java에서의 상속에 대해 자세히 논의했습니다. Java의 상속은 한 개체가 다른 개체의 '일종'임을 나타내는 'IS-A'관계 유형입니다. 예를 들면 자동차는 일종의 차량입니다.
객체 지향 프로그래밍은 'HAS-A'관계라고하는 또 다른 유형의 관계를 제공합니다. 이 자습서에서는 has-a 관계에 대해 자세히 설명합니다.
=> 처음부터 Java를 배우려면 여기를 방문하십시오.
학습 내용 :
자바 구성 튜토리얼
Java에서 'has-a'관계는 구성 . 'has-a'관계 또는 구성을 사용하여 프로그램에서 코드를 재사용 할 수 있습니다.
따라서 프로그램에서 'has-a'관계를 사용하도록함으로써 상속의 경우처럼 다른 클래스에서 '확장'하는 대신 프로그램에서 클래스의 인스턴스를 직접 사용하도록 만드는 것입니다.
아래 다이어그램은 Java의 'is-a'및 'has-a'관계를 모두 보여줍니다.
위의 다이어그램에서 볼 수 있듯이 Car와 Vehicle은 자동차가 자동차이므로 'IS-A'관계를 공유합니다. 따라서 기존 차량 개체에 더 많은 특성을 추가하여 자동차 개체를 만듭니다.
다이어그램에서 Car와 Engine은 'Has-a'관계를 공유합니다. 자동차에는 항상 엔진이 있습니다. 그래서 여기서 우리는 Engine 객체의 속성을 확장하지 않고 Engine 객체를 직접 사용합니다. 이것은 작성을 사용하여 Java에서 수행됩니다.
따라서 캡슐화, 추상화 및 다형성과 함께 상속 및 구성도 객체 지향 프로그래밍 (OOP)의 중요한 기능입니다.
'has-a'관계는 일반적으로 특정 개체에 다른 개체가 있는지 여부를 결정합니다. 그래서 여기서 우리가하는 것은 객체를 재사용하여 코드 중복과 오류를 줄이는 것입니다. 이것은 우리 클래스에서 완전히 개발되고 테스트 된 객체를 사용하기 때문입니다.
구성 및 기타 관계를 도출하는 Java의 'Association'이라는 특수 관계에 대한 설명부터 시작하겠습니다.
자바에서 연결
Java의 연관은 별도의 객체를 사용하여 두 개별 클래스간에 존재하는 관계로 정의 할 수 있습니다. Java의 연관은 다음과 같은 관계를 가질 수 있습니다.
- 1-1: 정확히 하나의 객체와 연관된 하나의 객체입니다.
- 일대 다 : 하나의 개체가 여러 개체와 연결될 수 있습니다.
- 다 대일 : 많은 개체가 하나의 개체와 연결될 수 있습니다.
- 다 대다 : 둘 이상의 다른 객체와 연결된 둘 이상의 객체.
관계가 설정되면 포함 된 개체 (다른 개체를 구성원으로 갖는 개체)는 포함 된 개체와 통신하여 속성과 특성을 재사용합니다. 연결에는 구성과 집계라는 두 가지 형식이 있습니다.
아래 그림은이를 보여줍니다.
위의 다이어그램에서 볼 수 있듯이 Association에는 Composition과 Aggregation이 포함됩니다. 구성은 더 구체적인 용어이고 집계는 구성보다 더 일반적입니다. 이러한 양식은 지원하는 관계 유형을 기반으로합니다.
Composition and Aggregation으로 이동하기 전에 Java로 연결을 시연하는 Java 프로그램을 구현해 보겠습니다.
import java.io.*; // class Account class Account { private String bank_name; private long Account_number; // initialize bank name and account number Account(String bank_name, long Account_number) { this.bank_name = bank_name; this.Account_number = Account_number; } //read bank name public String getBankName() { returnthis.bank_name; } //read account number public long getAccountNumber() { returnthis.Account_number; } } // employee class class Employee { private String emp_name; // initialize employee name Employee(String emp_name) { this.emp_name = emp_name; } //read employee name public String getEmployeeName() { return this.emp_name; } } // Associate both the classes class Main { public static void main (String() args) { Employee emp = new Employee('Andrew'); Account acc = new Account('Citi Bank', 13319); System.out.println(emp.getEmployeeName() + ' has an account with ' + acc.getBankName() + ' with Account Number:' + acc.getAccountNumber()); } }
산출:
위의 프로그램은 Java에서의 연관을 보여줍니다. 여기에는 개인 구성원으로 은행 이름과 계좌 번호가있는 클래스 계정이 있습니다. 다음으로 Employee 클래스가 있습니다. 우리는 모든 직원이 급여 등을 입금하기위한 계좌 번호를 가지고 있다는 것을 알고 있습니다.
따라서 우리가하는 일은 직원의 은행 계좌 세부 정보를 읽을 다른 클래스 나 메서드를 작성하는 대신 기존 Account 클래스를 직접 재사용하는 것입니다. 즉, Account 개체를 Employee와 연결하여 직원의 은행 계좌 세부 정보를 얻습니다. 위의 예는 정확히 이것을합니다.
자바로 구성
구성은 협회의 한 형태입니다. 컴포지션은 한 클래스가 다른 클래스를 포함하고이 포함 된 클래스가 독립적으로 존재할 수없는 방식으로 포함하는 클래스에 종속되는 연관으로 정의 할 수 있습니다.
위에서 has-a 관계의 예를 보았습니다. 여기에는 엔진이있는 자동차 오브젝트가 있습니다. 이것은 구성의 예입니다. 여기서 엔진은 자동차 없이는 독립적으로 존재할 수 없습니다.
집계와 비교할 때 구성이 더 제한됩니다. 컴포지션은 Java 기능이 아닙니다. 주로 디자인 기술로 간주됩니다.
다음 다이어그램은 구성 예를 보여줍니다.
나는 기본 게이트웨이가 없습니다
여기에서 직원은 은행 계좌를 가지고 있습니다. 우리는 계좌 소유자 없이는 은행 계좌가 존재할 수 없다는 것을 알고 있습니다. 계정 소유자가 없으면 휴면 상태가됩니다.
컴포지션을 사용하여 다른 개체를 구성원으로하는 개체를 모델링 할 수 있으며 이러한 개체는 서로간에 'has-a'관계가 있습니다.
컴포지션에서 개체는 다른 개체에 포함되어 있으므로 포함하는 개체가 파괴 될 때입니다. 다른 개체도 파괴됩니다
따라서 작곡 관계를 '전체의 일부'관계로 볼 수 있습니다. 부품 없이는 존재하지 않습니다 전부의 . 따라서 전체가 파괴되면 부분도 삭제됩니다. 이것은 전체가 부분과 더 강한 관계를 가지고 있음을 의미합니다.
자바 구성 예
다음은 구성을 보여주는 프로그램입니다.
여기서 사용한 시스템은 다음과 같습니다.
따라서이 프로그램에는 위에 표시된대로 세 가지 클래스가 있습니다. Honda는 Car이므로 Car 클래스에서 확장됩니다. CarEngine 개체는 Honda 클래스에서 사용됩니다.
프로그램은 다음과 같습니다.
class CarEngine { public void startEngine(){ System.out.println('Car Engine Started.'); } public void stopEngine(){ System.out.println('Car Engine Stopped.'); } } class Car { private String color; private int max_Speed; public void carDetails(){ System.out.println('Car Color= '+color + '; Max Speed= ' + max_Speed); } //set car color public void setColor(String color) { this.color = color; } //set car max_Speed public void setMaxSpeed(int max_Speed) { this.max_Speed = max_Speed; } } class Honda extends Car{ public void HondaStart(){ CarEngine Honda_Engine = new CarEngine(); //composition Honda_Engine.startEngine(); } } public class Main { public static void main(String() args) { Honda HondaCity = new Honda(); HondaCity.setColor('Silver'); HondaCity.setMaxSpeed(180); HondaCity.carDetails(); HondaCity.HondaStart(); } }
산출:
따라서 출력은 Honda 자동차의 속성을 보여줍니다. 또한 컴포지션을 사용하여 Honda 클래스의 멤버로 사용한 CarEngine 클래스의 메서드 출력을 보여줍니다.
이 프로그램은 우리가 자바 프로그램에서 컴포지션을 사용하는 방법을 보여주었습니다.
Java의 집계
집계는 Java의 또 다른 형태의 연결입니다. 그러나 집계의 경우 개체 간의 단방향 관계 만 허용됩니다. 예를 들면 직원이 집 주소를 가지고 있습니다. 하지만 그 반대의 경우, 집 주소에 직원이 있고 잘못된 것 같습니다.
마찬가지로 학생에게는 주소가 있지만 '주소에 학생이 있습니다'는 의미가 없습니다. 구성과 마찬가지로 집계는 'has-a'관계를 나타냅니다. 이것은 클래스에 다른 클래스의 객체가 포함되어 있음을 의미합니다.
아래 다이어그램은 집계 예를 나타냅니다.
위의 예는 대학에 직원과 학생이있는 것으로 해석 될 수 있습니다.
그렇다면 집계를 위해 정확히 언제 가야합니까?
'is-a'관계 나 상속을 사용할 필요가 없을 때 집계를 사용해야합니다. 애플리케이션 또는 객체의 수명 내내 'is-a'관계를 유지할 수 있다면 코드 재사용을위한 상속을 구현할 수 있습니다.
그렇지 않으면 코드 재사용을 위해 집계를 사용하는 것이 가장 좋습니다. 이제 Java로 예제 집계를 구현해 보겠습니다.
우리가 사용한 예제 시스템은 다음과 같습니다.
여기에 '연구소'수업이 있습니다. 연구소는 다양한 부서 또는 지점을 가질 수 있습니다. 차례로 각 지부에는 여러 명의 학생이 있습니다. 이 프로그램에서는 전체 연수회에있는 총 학생 수를 계산합니다. 이를 위해 집계를 사용합니다. Institute 클래스에는 Branch 개체가 포함되어 있습니다.
분기 개체에는 학생 개체가 있습니다. 그래서 Branch 객체를 사용하는 Institute 수업에서는 총 학생 수를 계산합니다. 이를 위해 우리는 연구소의 지점 목록을 사용합니다.
Java 프로그램은 다음과 같습니다.
import java.io.*; import java.util.*; // Class Student class Student { String student_name; int student_id ; String student_dept; //Initialize Student class members Student(String student_name, int student_id, String student_dept) { this.student_name = student_name; this.student_id = student_id; this.student_dept = student_dept; } } //Branch class indiates the branch or department to which the student belongs class Branch { String Branch_name; private List students; //Each branch contain students //Initialize class members Branch(String Branch_name, List students) { this.Branch_name = Branch_name; this.students = students; } //return list of students public List getStudents() { return students; } } //Institure class contains branches which in turn have students class Institute { String instituteName; private List branches; //each institure have various branches //initialize members Institute(String instituteName, List branches) { this.instituteName = instituteName; this.branches = branches; } // count and return number of all students in the institute public int getAllStudentsInInstitute() { int noOfStudents = 0; List students; for(Branch branch : branches) { students = branch.getStudents(); for(Student s : students) { noOfStudents++; } } return noOfStudents; } } //Aggregate all the classes=> Institute (contains) branches (contains) Students class Main { public static void main (String() args) { //declare student objects Student s1 = new Student('Megan', 1, 'CSE'); Student s2 = new Student('Mia', 2, 'CSE'); Student s3 = new Student('John', 1, 'ETC'); Student s4 = new Student('Finn', 2, 'ETC'); // List of CSE Students. List cse_students = new ArrayList(); cse_students.add(s1); cse_students.add(s2); //List of ETC Students List etc_students = new ArrayList(); etc_students.add(s3); etc_students.add(s4); //declare Branch objects Branch CSE = new Branch('CSE', cse_students); Branch ETC = new Branch('ETC', etc_students); //make list of branches List branches = new ArrayList(); branches.add(CSE); branches.add(ETC); // creating an object of Institute. Institute institute = new Institute('NIT', branches); //display total number of students System.out.print('Total students in NIT institute: '); System.out.print(institute.getAllStudentsInInstitute()); } }
산출:
따라서 집계와 구성은 여기서 논의한 두 가지 형태의 연관입니다. 객체 간의 'is-a'관계가 필요하지 않거나 표현할 수없는 경우, 객체 간의 관계를 강화하려면 구성을, 단방향 관계를 원하는 경우 집계를 수행 할 수 있습니다.
집계와 구성 모두 Java에서 코드를 재사용하는 데 도움이됩니다.
버블 정렬 함수 C ++
집계 대 구성의 차이점
구성과 집계는 모두 'has-a'관계를 묘사하는 협회의 일부입니다. 두 기술 모두 Java 기능이 아니며 직접 구현하는 방법이 없지만 Java 코드를 사용하여 구현할 수 있습니다.
작성 및 집계를 통해 코드를 재사용 할 수 있습니다. 코드 재사용 성은 코드의 버그를 줄이고 애플리케이션을 더욱 안정적으로 만듭니다.
아래에 나열된 것은 집계와 구성의 몇 가지 차이점입니다.
집합 | 구성 |
---|---|
집계를 사용하면 자식 개체 또는 포함 된 개체가 독립적으로 존재할 수 있습니다. 예를 들면 학교에 직원이있는 관계에서 학교를 삭제해도 직원은 그대로 유지되고 스스로 기능 할 수 있습니다. | 컴포지션에서 포함 된 개체는 독립적으로 존재할 수 없습니다. 예를 들면 자동차에는 엔진이 있습니다. Car를 삭제하면 Engine 클래스가 자체적으로 작동 할 수 없습니다. |
집계는 'has-a'관계입니다. | 구성은 'has-a'관계의 한 형태이지만 전체의 일부 관계로 간주됩니다. |
집계에는 일대일 연결 만 있습니다. | 구성은 협회에서 제공되는 다른 관계를 허용합니다. |
집계는 개체간에 약한 연관성을 가지고 있습니다. | 컴포지션은 개체간에 강한 연관성을 가지고 있습니다. |
구성 대. 계승
구성 | 계승 |
---|---|
구성은 'Has-A'관계를 묘사합니다. | 상속은 'Is-A'관계를 나타냅니다. |
포함 객체의 구현을 더 쉽게 변경할 수 있습니다. | 한 구현이 변경되면 상속의 전체 계층이 변경됩니다. |
동적 또는 런타임 바인딩이 있습니다. | 정적 또는 컴파일 시간 바인딩이 있습니다. |
프런트 엔드 클래스 인터페이스는 백 엔드 클래스에 영향을주지 않고 쉽게 변경할 수 있습니다. | 메서드 나 프로토 타입의 변경 사항은 모든 클래스에 영향을줍니다. |
컴포지션은 기존 개체에 더 많은 특성이나 기능을 추가 할 필요가 없을 때 사용됩니다. | 상속은 상속 된 클래스에 더 많은 기능이 추가 될 때 사용됩니다. |
자주 묻는 질문
Q # 1) 'IS – A'와 'HAS – A'관계의 차이점은 무엇입니까?
대답: 객체 지향 프로그래밍에서 IS-A 관계는 자식 클래스가 부모 클래스 '일종'인 상속을 나타냅니다. Has-a 관계는 구성 및 집계로 표현되는 '일부-전체'관계입니다. 상속은 정적 바인딩이고 컴포지션은 동적 바인딩입니다.
Q # 2) Java에서 집계 및 구성이란 무엇입니까?
대답: 컴포지션에서 두 개체는 밀접하게 결합되어 있습니다. 즉, 다른 개체 (포함 된 개체)를 소유 한 개체 (포함 개체)가 파괴되면 다른 개체는 자체적으로 독립적으로 작동 할 수 없기 때문에 자동으로 파괴됩니다.
집계에서 포함 및 포함 된 개체는 독립적으로 작동 할 수 있습니다. 이는 집계에서 한 개체가 다른 개체를 사용하기 때문입니다.
Q # 3) Java에서 Composition을 사용하는 이유는 무엇입니까?
대답: 컴포지션을 사용하면 기존 코드를 재사용하여 코드 복잡성을 줄이고 코드의 버그를 줄일 수 있습니다. 컴포지션을 사용하면 객체에서 필요한 것만 재사용하고 가시성을 제어 할 수 있습니다.
Q # 4) Association의 용도는 무엇입니까?
대답: 연관은 Java에서 'has-a'관계를 나타냅니다. Java의 연결은 한 개체가 다른 개체의 기능과 서비스를 사용해야 할 때 사용됩니다. 구성과 집계는 두 가지 형태의 연관입니다.
Q # 5) 구성이 상속보다 나은가요?
대답: 우리가 코딩하는 OOP 시스템에 따라 다릅니다. 응용 프로그램의 수명 동안 IS-A 관계로 개체를 나타낼 수 있다면 상속이 더 나은 옵션입니다. 코드를 재사용하고 싶고 IS-A 관계로 객체 시스템을 표현할 수없는 경우 구성이 더 좋습니다.
또한 백엔드 클래스를 방해하지 않고 프런트 엔드 클래스를 자주 변경하려는 경우 상속의 경우 약간의 변경이 대부분 전체 상속 계층에 영향을 미치기 때문에 구성이 더 좋습니다.
결론
이 자습서에서는 Java의 HAS-A 관계에 대해 설명했습니다. 구성 및 집계는 'HAS-A'관계를 구현하는 형식입니다. 이 두 구현을 비교했습니다.
둘 다 다른 클래스의 객체를 포함하지만, 컴포지션은 객체를 소유하고 집계는 단순히 객체를 사용합니다. 또한 Java의 구성과 상속을 비교했습니다.
=> Java 교육 자습서의 A-Z를 보려면 여기를 확인하십시오.