Menu
CoddyTech

Agregasi vs Komposisi

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

Agregasi dan komposisi sama-sama merupakan bentuk hubungan "memiliki", tetapi keduanya berbeda dalam satu aspek penting: kepemilikan dan ketergantungan siklus hidup.

Dalam komposisi, object yang menjadi bagian tidak dapat ada secara terpisah dari wadahnya. Saat wadah dihancurkan, bagian-bagiannya juga ikut hancur. Bayangkan House dan object Room-nya: ruangan tidak ada tanpa rumah:

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 terkandung dapat berdiri sendiri. Container menggunakan object tersebut, tetapi tidak mengendalikan siklus hidupnya. Perhatikan Team dan object Player: 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 kita bangun sistem kursus universitas yang menunjukkan aggregation dan composition. Kamu akan melihat bagaimana Course memiliki object Lecture (composition), sementara Course hanya merujuk pada object Professor yang ada secara independen (aggregation).

Kamu akan menyusun kodemu dalam empat file:

  • Professor.java: Buat class yang merepresentasikan profesor yang dapat ada secara independen dari kursus mana pun. Professor memiliki dua field private: name (String) dan department (String). Sertakan constructor untuk menginisialisasi kedua field dan method getter untuk masing-masing field. Override toString() agar mengembalikan: Prof. [name] ([department])
  • Lecture.java: Buat class yang merepresentasikan kuliah yang hanya masuk akal dalam sebuah 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, aggregation), dan lectures (array berisi object Lecture, composition).

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

    Tambahkan method getInfo() yang mengembalikan String multi-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 independen. Lalu buat Course dengan mengirimkan judul, Professor (aggregation), dan jumlah kuliah (Course akan membuat kuliahnya sendiri secara internal, composition).

    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 di luar dan dikirimkan ke Course (aggregation: Professor dapat mengajar kursus lain atau ada tanpa kursus ini). Lecture dibuat di dalam constructor Course (composition). Lecture hanya dimiliki oleh 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 akan membuat kuliahnya 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