Menu
CoddyTech

Agregasi vs Komposisi

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 48 dari 87.

Baik agregasi maupun komposisi adalah bentuk hubungan "memiliki", tetapi keduanya berbeda dalam satu aspek penting: kepemilikan dan ketergantungan siklus hidup.

Dalam komposisi, object yang terkandung tidak dapat berdiri sendiri tanpa container. Saat container dihancurkan, bagian-bagiannya juga ikut hancur. Bayangkan sebuah House dan object Room-nya: room tidak ada tanpa house:

class House {
    private Room[] rooms;
    
    public House(int numRooms) {
        rooms = new Room[numRooms];
        for (int i = 0; i < numRooms; i++) {
            rooms[i] = new Room();  // House membuat dan memiliki rooms
        }
    }
}

Dalam agregasi, object yang menjadi bagian dapat berdiri sendiri. Container menggunakan object tersebut, tetapi tidak mengendalikan siklus hidupnya. Perhatikan Team dan object Player-nya: para pemain tetap ada meskipun tidak memiliki tim:

class Team {
    private List<Player> players;
    
    public Team() {
        players = new ArrayList<>();
    }
    
    public void addPlayer(Player player) {
        players.add(player);  // Team menggunakan pemain yang sudah ada
    }
}

Perbedaan utamanya: dalam komposisi, container membuat bagian-bagiannya secara internal. Dalam agregasi, object diberikan dari luar. Saat Team dihapus, object Player tetap ada. Saat House dihapus, object Room di dalamnya juga ikut hilang.

challenge icon

Tantangan

Mudah

Mari buat sistem kursus universitas yang menunjukkan agregasi dan komposisi. Kamu akan melihat bagaimana Course memiliki object Lecture (komposisi), sedangkan Course hanya merujuk ke object Professor yang ada secara mandiri (agregasi).

Kamu akan mengatur kodemu dalam empat file:

  • Professor.java: Buat class yang merepresentasikan profesor yang dapat ada secara mandiri, terlepas dari kursus mana pun. Professor memiliki dua field private: name (String) dan department (String). Sertakan constructor untuk menginisialisasi kedua field dan getter untuk masing-masing field. Override toString() agar mengembalikan: Prof. [name] ([department])
  • Lecture.java: Buat class yang merepresentasikan kuliah yang hanya bermakna sebagai bagian dari kursus. Lecture memiliki dua field private: topic (String) dan durationMinutes (int). Sertakan constructor dan getter. Override toString() agar mengembalikan: Lecture: [topic] ([durationMinutes] min)
  • Course.java: Di sinilah kamu akan menunjukkan kedua hubungan tersebut! Course memiliki tiga field private: title (String), professor (Professor, agregasi), dan lectures (array berisi object Lecture, komposisi).

    Constructor menerima judul kursus, object Professor (diberikan dari luar, agregasi), dan jumlah kuliah. Di dalam constructor, buat array Lecture dan isi dengan object Lecture baru. Untuk setiap kuliah pada indeks i, buat dengan topik "Topic " + (i + 1) dan durasi 45 menit. Pembuatan di dalam ini menunjukkan komposisi.

    Tambahkan method getInfo() yang mengembalikan String beberapa baris:

    Course: [title]
    Instructor: [professor.toString()]
    Lectures: [number of lectures]

    Tambahkan juga method listLectures() yang mengembalikan String dengan toString() setiap kuliah pada barisnya sendiri.

  • Main.java: Satukan semuanya! Kamu akan menerima empat input: nama profesor (String), departemen profesor (String), judul kursus (String), dan jumlah kuliah (int).

    Pertama, buat Professor dengan nama dan departemen yang diberikan. Professor ini ada secara mandiri. Lalu buat Course dengan memberikan judul, Professor (agregasi), dan jumlah kuliah (Course akan membuat kuliahnya sendiri di dalamnya, komposisi).

    Cetak hasil getInfo(), lalu cetak satu baris kosong, kemudian cetak hasil listLectures().

Kamu akan menerima empat input secara berurutan: nama profesor, departemen, judul kursus, dan jumlah kuliah.

Perhatikan perbedaan utamanya: Professor dibuat dari luar lalu diberikan ke Course (agregasi: profesor tersebut dapat mengajar kursus lain atau ada tanpa kursus ini). Lecture dibuat di dalam constructor Course (komposisi). Lecture hanya menjadi bagian dari kursus ini dan tidak akan ada tanpanya.

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Baca input
        String professorName = scanner.nextLine();
        String department = scanner.nextLine();
        String courseTitle = scanner.nextLine();
        int numberOfLectures = scanner.nextInt();
        
        // TODO: Buat object Professor (dapat berdiri sendiri, agregasi)
        
        // TODO: Buat object Course dengan meneruskan professor (agregasi)
        // Kursus ini akan membuat lectures sendiri secara internal (komposisi)
        
        // TODO: Cetak hasil getInfo()
        
        // TODO: Cetak baris kosong
        
        // TODO: Cetak hasil listLectures()
        
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online