# **Praktikum: Relasi Antar Kelas (Agregasi, Komposisi, dan Asosiasi)** ## Pendahuluan Relasi antar kelas adalah konsep fundamental dalam pemrograman berorientasi objek (PBO) yang menggambarkan bagaimana kelas-kelas saling berhubungan. Terdapat tiga jenis relasi utama: 1. **Agregasi:** Relasi "has-a" yang menunjukkan hubungan longgar antara kelas. 2. **Komposisi:** Relasi "contains-a" yang menunjukkan hubungan yang lebih kuat, di mana objek yang dimiliki tidak dapat berdiri sendiri. 3. **Asosiasi:** Relasi umum yang menunjukkan koneksi antar kelas tanpa kepemilikan. Pada pertemuan ini, kita akan mengimplementasikan jenis-jenis relasi ini menggunakan studi kasus Dosen dan Mata Kuliah. ## Tujuan 1. Memahami perbedaan antara agregasi, komposisi, dan asosiasi. 2. Mengimplementasikan relasi antar kelas menggunakan Python. 3. Menganalisis hubungan antar kelas dengan studi kasus. ## Teori Singkat 1. **Agregasi** Sebuah objek dapat dimiliki oleh banyak objek lain. Hubungan tidak eksklusif dan objek yang dimiliki dapat eksis tanpa induknya. 2. **Komposisi** Objek yang dimiliki hanya eksis jika induknya ada. Hubungan ini lebih erat dibandingkan agregasi. 3. **Asosiasi** Hubungan antar kelas tanpa kepemilikan, hanya koneksi. ## **Kode Program** ```python # Asosiasi: Dosen mengajar Mata Kuliah class MataKuliah: def __init__(self, nama, kode): self.nama = nama self.kode = kode class Dosen: def __init__(self, nama): self.nama = nama self.mata_kuliah = [] def tambah_mata_kuliah(self, mata_kuliah): self.mata_kuliah.append(mata_kuliah) def tampilkan_mata_kuliah(self): print(f"Dosen {self.nama} mengajar mata kuliah:") for mk in self.mata_kuliah: print(f"- {mk.nama} ({mk.kode})") # Komposisi: Mata Kuliah memiliki Modul class Modul: def __init__(self, judul): self.judul = judul class MataKuliahKomposisi: def __init__(self, nama, kode): self.nama = nama self.kode = kode self.modul = [] def tambah_modul(self, judul): modul = Modul(judul) self.modul.append(modul) def tampilkan_modul(self): print(f"Mata Kuliah {self.nama} memiliki modul:") for modul in self.modul: print(f"- {modul.judul}") # Agregasi: Daftar Mata Kuliah yang dimiliki oleh Dosen class DaftarMataKuliah: def __init__(self): self.mata_kuliah = [] def tambah_mata_kuliah(self, mata_kuliah): self.mata_kuliah.append(mata_kuliah) # Implementasi Praktik # Asosiasi mk1 = MataKuliah("Pemrograman Berorientasi Objek", "PBO101") mk2 = MataKuliah("Struktur Data", "SD102") dosen = Dosen("Dr. Ahmad") dosen.tambah_mata_kuliah(mk1) dosen.tambah_mata_kuliah(mk2) dosen.tampilkan_mata_kuliah() # Komposisi mk_komposisi = MataKuliahKomposisi("Algoritma", "ALG103") mk_komposisi.tambah_modul("Pendahuluan") mk_komposisi.tambah_modul("Sorting dan Searching") mk_komposisi.tampilkan_modul() # Agregasi daftar_mk = DaftarMataKuliah() daftar_mk.tambah_mata_kuliah(mk1) daftar_mk.tambah_mata_kuliah(mk2) print("\nDaftar Mata Kuliah dalam Agregasi:") for mk in daftar_mk.mata_kuliah: print(f"- {mk.nama} ({mk.kode})") ``` ## **Analisis Kode** 1. **Asosiasi** - Dosen memiliki hubungan dengan Mata Kuliah melalui daftar `mata_kuliah`. - Relasi ini tidak eksklusif, sehingga Mata Kuliah dapat dihubungkan ke objek Dosen lain. 2. **Komposisi** - Mata Kuliah memiliki daftar Modul, dan modul tidak dapat eksis tanpa objek Mata Kuliah. - Objek `Modul` diciptakan dalam metode `tambah_modul` dan menjadi bagian integral dari `MataKuliahKomposisi`. 3. **Agregasi** - `DaftarMataKuliah` menyimpan referensi ke objek Mata Kuliah yang eksis secara independen. - Relasi ini menunjukkan kepemilikan longgar. ## Tugas 1. Modifikasi program sehingga setiap Mata Kuliah memiliki jumlah SKS. 2. Tambahkan metode untuk menghitung total SKS yang diajar oleh seorang dosen. 3. Implementasikan konsep polimorfisme untuk menampilkan informasi Mata Kuliah dengan format berbeda (misalnya: detail lengkap untuk komposisi).