Object Oriented Programming | Week 5: Implementasi Sifat Object - Membuat Sistem FRS
Pada pertemuan minggu kelima, dibahas mengenai 4 pilar OOP:
- Encapsulation: Menggabungkan data (atribut) dan metode (fungsi) yang berinteraksi dengan data tersebut menjadi satu unit tunggal, yaitu sebuah objek atau kelas.
- Abstraction:Menyembunyikan kompleksitas detail implementasi yang tidak perlu dan hanya menampilkan fungsionalitas yang esensial kepada pengguna.
- Inheritance: Memungkinkan kelas baru (kelas anak/subkelas) untuk mewarisi atau menyalurkan atribut dan metode dari kelas yang sudah ada (kelas induk/superkelas).
- Polymorphism: Kemampuan sebuah objek untuk memiliki banyak bentuk atau perilaku yang berbeda tergantung pada konteksnya.

- Penjelasan Class:
Saya membuat 6 class:
- Dosen: Berisi informasi data diri dosen seperti NIP, kode, nama, serta list dari matkul yang diajar.
- Matakuliah: Berisi informasi seperti kode matkul, nama, kapasitas, sks, jadwal, kelas, dosen pengampu, serta list mahasiswa yang mengambil matkul bersangkutan.
- Mahasiswa: Berisi data diri mahasiswa seperti NRP, nama, dan dosen wali, serta list mata kuliah yang diambil.
- FRS: Class yang mengatur alur pengambilan mata kuliah oleh mahasiswa.
- Jadwal: Class tambahan yang digunakan untuk jadwal pada class Matakuliah.
- Main: Class utama dimana semua proses FRS dijalankan.
- Code:
/**
* Write a description of class Dosen here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Dosen
{
private String nip;
private String kode;
private String nama;
private List<Matakuliah> list_matkul_diajar = new ArrayList<>();
Dosen(String nip, String kode, String nama) {
this.nip = nip;
this.kode = kode;
this.nama = nama;
}
public String getNip() { return nip; }
public String getKode() { return kode; }
public String getNama() { return nama; }
public List<Matakuliah> getMatkulDiajar() { return Collections.unmodifiableList(list_matkul_diajar); }
public void setMatkulDiajar(Matakuliah m) {
if (!list_matkul_diajar.contains(m)) {
list_matkul_diajar.add(m);
m.setDosen(this);
}
}
}
/**
* Write a description of class Mahasiswa here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
class Jadwal
{
private String hari;
private String jamMulai;
private String jamSelesai;
public Jadwal(String hari, String jamMulai, String jamSelesai) {
this.hari = hari;
this.jamMulai = jamMulai;
this.jamSelesai = jamSelesai;
}
public String getHari() { return hari; }
public String getJamMulai() { return jamMulai; }
public String getJamSelesai() { return jamSelesai; }
@Override
public String toString() {
return hari + " " + jamMulai + "-" + jamSelesai;
}
}
/**
* Write a description of class Mahasiswa here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Mahasiswa
{
private String nrp;
private String nama;
private List<Matakuliah> matkul_diambil = new ArrayList<>();
private Dosen dosen_wali;
Mahasiswa(String nrp, String nama, Dosen dosen_wali) {
this.nrp = nrp;
this.nama = nama;
this.dosen_wali = dosen_wali;
}
public String getNrp() { return nrp; }
public String getNama() { return nama; }
public Dosen getDosenWali() { return dosen_wali; }
public List<Matakuliah> getMatkulDiambil() { return Collections.unmodifiableList(matkul_diambil); }
public boolean ambilMatkul(Matakuliah matkul) {
if (this.matkul_diambil.contains(matkul)) return false;
boolean ditambah = matkul.tambahMahasiswa(this);
if (ditambah) this.matkul_diambil.add(matkul);
return ditambah;
}
public boolean dropMatkul(Matakuliah matkul) {
if (!this.matkul_diambil.contains(matkul)) return false;
boolean dihapus = matkul.hapusMahasiswa(this);
if (dihapus) this.matkul_diambil.remove(matkul);
return dihapus;
}
public byte getTotalSks() {
byte sum = 0;
for (Matakuliah matkul : matkul_diambil) sum += matkul.getSks();
return sum;
}
}
/**
* Write a description of class MataKuliah here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
import java.util.ArrayList;
import java.util.List;
public class Matakuliah
{
private String kode;
private String nama;
private short kapasitas;
private byte sks;
private Jadwal jadwal;
private String kelas;
private Dosen dosen;
private List<Mahasiswa> list_mahasiswa = new ArrayList<>();
Matakuliah(String kode, String nama, short kapasitas, byte sks, String jadwal_hari, String jadwal_mulai, String jadwal_akhir, String kelas, Dosen dosen) {
this.kode = kode;
this.nama = nama;
this.kapasitas = kapasitas;
this.sks = sks;
this.jadwal = new Jadwal(jadwal_hari, jadwal_mulai, jadwal_akhir);
this.kelas = kelas;
this.dosen = dosen;
}
public String getKode() { return kode; }
public String getNama() { return nama; }
public short getKapasitas() { return kapasitas; }
public byte getSks() { return sks; }
public String getKelas() { return kelas; }
public Dosen getDosen() { return dosen; }
public Jadwal getJadwal() { return jadwal; }
public boolean tambahMahasiswa(Mahasiswa mahasiswa) {
if (this.list_mahasiswa.size() >= kapasitas) {
System.out.println("Error: kelas [" + kode + "] " + nama + " penuh.");
return false;
}
if (this.list_mahasiswa.contains(mahasiswa)) return false;
this.list_mahasiswa.add(mahasiswa);
return true;
}
public boolean hapusMahasiswa(Mahasiswa mahasiswa) {
return this.list_mahasiswa.remove(mahasiswa);
}
public void setDosen(Dosen dosen) {
this.dosen = dosen;
if (dosen != null && !dosen.getMatkulDiajar().contains(this)) {
dosen.setMatkulDiajar(this);
}
}
}
/**
* Write a description of class FRS here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
import java.util.ArrayList;
import java.util.List;
public class FRS
{
private List<Matakuliah> list_matkul = new ArrayList<>();
private Mahasiswa mahasiswa;
private byte semester;
private boolean disetujui;
FRS(Mahasiswa mahasiswa, byte semester) {
this.mahasiswa = mahasiswa;
this.semester = semester;
}
public byte getSemester() { return semester; }
public byte getTotalSksSemester() {
byte sum = 0;
for (Matakuliah matkul : list_matkul) sum += matkul.getSks();
return sum;
}
public boolean ambilMatkul(Matakuliah matkul) {
if (disetujui) {
System.out.println("FRS sudah disetujui, tidak bisa menambah mata kuliah.");
return false;
}
if (!this.list_matkul.contains(matkul)) {
list_matkul.add(matkul);
mahasiswa.ambilMatkul(matkul);
return true;
}
return false;
}
public void validasi(Dosen dosenWali) {
if (mahasiswa.getDosenWali() == null || !mahasiswa.getDosenWali().equals(dosenWali)) {
System.out.println("Validasi gagal: dosen bukan wali dari mahasiswa ini.");
return;
}
if (getTotalSksSemester() <= 24) {
disetujui = true;
System.out.println("FRS " + mahasiswa.getNama() + " semester " + semester + " DISETUJUI oleh " + dosenWali.getNama());
} else {
System.out.println("FRS " + mahasiswa.getNama() + " DITOLAK.");
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* Write a description of class Main here.
*
* @author Muhammad Zaky Zein
* @version 29.09.2025
*/
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Dosen dosen1 = new Dosen("000000000000000000", "NS", "Prof. Dr. Eng. Nanik Suciati, S.Kom., M.Kom.");
Dosen dosen2 = new Dosen("000000000000000001", "FB", "Fajar Baskoro, S.Kom., MT.");
Dosen dosen3 = new Dosen("000000000000000002", "IS", "Misbakhul Munir Irfan Subakti, S.Kom., M.Sc.");
Dosen dosen4 = new Dosen("000000000000000003", "AW", "Arya Yudhi Wijaya, S.Kom, M.Kom.");
Mahasiswa mahasiswa1 = new Mahasiswa("5025241148", "Muhammad Zaky Zein", dosen3);
List<Matakuliah> daftar_matkul = new ArrayList<>();
daftar_matkul.add(new Matakuliah("IF0001", "Pemrograman Berorientasi Objek A", (short)40, (byte)3, "Selasa", "10:00", "11:50", "TIF-105", dosen2));
daftar_matkul.add(new Matakuliah("IF0001", "Pemrograman Berorientasi Objek B", (short)40, (byte)3, "Selasa", "13:30", "15:20", "TIF-105", dosen2));
daftar_matkul.add(new Matakuliah("IF0003", "Pemrograman Web C", (short)30, (byte)3, "Kamis", "07:00", "08:50", "IF-309", dosen2));
daftar_matkul.add(new Matakuliah("IF0004", "Konsep Kecerdasan Artifisial B", (short)25, (byte)2, "Senin", "13:30", "15:20", "TIF-101", dosen1));
daftar_matkul.add(new Matakuliah("IF0005", "Teori Graf A", (short)45, (byte)2, "Senin", "07:00", "08:50", "TIF-107", dosen4));
FRS frs1 = new FRS(mahasiswa1, (byte)3);
int pilihan;
do {
System.out.println("\n===== MENU FRS =====");
System.out.println("1. Lihat daftar matakuliah");
System.out.println("2. Ambil matakuliah");
System.out.println("3. Lihat matakuliah yang diambil");
System.out.println("4. Validasi FRS");
System.out.println("5. Keluar");
System.out.print("Pilih menu: ");
pilihan = sc.nextInt();
sc.nextLine();
if (pilihan == 1) {
System.out.println("\nDaftar Matakuliah:");
for (int i = 0; i < daftar_matkul.size(); i++) {
Matakuliah matkul = daftar_matkul.get(i);
System.out.println((i + 1) + ". " + matkul.getKode() + " - " + matkul.getNama() + " (" + matkul.getSks() + " SKS) (Kapasitas: " + matkul.getKapasitas() + ")" + "[" + matkul.getJadwal().toString() + "]");
}
} else if (pilihan == 2) {
System.out.print("Masukkan nomor matkul yang ingin diambil: ");
int idx = sc.nextInt() - 1;
sc.nextLine();
if (idx >= 0 && idx < daftar_matkul.size()) {
boolean ok = frs1.ambilMatkul(daftar_matkul.get(idx));
if (ok) System.out.println("Matkul berhasil ditambahkan!");
else System.out.println("Gagal menambah matkul.");
} else {
System.out.println("Nomor tidak valid.");
}
} else if (pilihan == 3) {
System.out.println("\nMatakuliah yang sudah diambil:");
for (Matakuliah matkul : mahasiswa1.getMatkulDiambil()) {
System.out.println("- " + matkul.getNama() + " (" + matkul.getSks() + " SKS)");
}
System.out.println("Total SKS semester ini: " + frs1.getTotalSksSemester());
} else if (pilihan == 4) {
frs1.validasi(dosen3);
} else if (pilihan == 5) {
break;
} else {
System.out.println("Pilihan tidak valid.");
}
} while(pilihan != 5);
sc.close();
}
}
Contoh Input dan Output program:
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 1
Daftar Matakuliah:
1. IF0001 - Pemrograman Berorientasi Objek A (3 SKS) (Kapasitas: 40)[Selasa 10:00-11:50]
2. IF0001 - Pemrograman Berorientasi Objek B (3 SKS) (Kapasitas: 40)[Selasa 13:30-15:20]
3. IF0003 - Pemrograman Web C (3 SKS) (Kapasitas: 30)[Kamis 07:00-08:50]
4. IF0004 - Konsep Kecerdasan Artifisial B (2 SKS) (Kapasitas: 25)[Senin 13:30-15:20]
5. IF0005 - Teori Graf A (2 SKS) (Kapasitas: 45)[Senin 07:00-08:50]
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 2
Masukkan nomor matkul yang ingin diambil: 1
Matkul berhasil ditambahkan!
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 2
Masukkan nomor matkul yang ingin diambil: 3
Matkul berhasil ditambahkan!
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 3
Matakuliah yang sudah diambil:
- Pemrograman Berorientasi Objek A (3 SKS)
- Pemrograman Web C (3 SKS)
Total SKS semester ini: 6
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 1
Daftar Matakuliah:
1. IF0001 - Pemrograman Berorientasi Objek A (3 SKS) (Kapasitas: 40)[Selasa 10:00-11:50]
2. IF0001 - Pemrograman Berorientasi Objek B (3 SKS) (Kapasitas: 40)[Selasa 13:30-15:20]
3. IF0003 - Pemrograman Web C (3 SKS) (Kapasitas: 30)[Kamis 07:00-08:50]
4. IF0004 - Konsep Kecerdasan Artifisial B (2 SKS) (Kapasitas: 25)[Senin 13:30-15:20]
5. IF0005 - Teori Graf A (2 SKS) (Kapasitas: 45)[Senin 07:00-08:50]
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 2
Masukkan nomor matkul yang ingin diambil: 4
Matkul berhasil ditambahkan!
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 2
Masukkan nomor matkul yang ingin diambil: 5
Matkul berhasil ditambahkan!
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 3
Matakuliah yang sudah diambil:
- Pemrograman Berorientasi Objek A (3 SKS)
- Pemrograman Web C (3 SKS)
- Konsep Kecerdasan Artifisial B (2 SKS)
- Teori Graf A (2 SKS)
Total SKS semester ini: 10
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 4
FRS Muhammad Zaky Zein semester 3 DISETUJUI oleh Misbakhul Munir Irfan Subakti, S.Kom., M.Sc.
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 2
Masukkan nomor matkul yang ingin diambil: 2
FRS sudah disetujui, tidak bisa menambah mata kuliah.
Gagal menambah matkul.
===== MENU FRS =====
1. Lihat daftar matakuliah
2. Ambil matakuliah
3. Lihat matakuliah yang diambil
4. Validasi FRS
5. Keluar
Pilih menu: 5
Penjelasan lebih lanjut:Class Dosen merepresentasikan data seorang dosen dan daftar matakuliah yang diajarnya. Saat sebuah matakuliah disetkan ke dosen melalui method setMatkulDiajar, matakuliah itu otomatis juga mencatat dosennya. Dengan begitu, relasi dua arah antara dosen dan matakuliah tetap konsisten.
Class Mahasiswa menyimpan identitas mahasiswa, dosen wali, serta daftar matakuliah yang diambil. Method ambilMatkul mencoba menambahkan matakuliah ke daftar mahasiswa dengan memanggil method tambahMahasiswa dari objek matakuliah. Jika berhasil, matakuliah dimasukkan ke daftar mahasiswa. Method dropMatkul melakukan hal sebaliknya, yaitu menghapus mahasiswa dari daftar matakuliah dan juga menghapus matakuliah dari daftar mahasiswa. Ada juga perhitungan total SKS dengan menjumlahkan semua matakuliah yang sudah diambil.
Class Matakuliah merepresentasikan satu mata kuliah. Objek ini memiliki kode, nama, kapasitas, jumlah SKS, jadwal, kelas, dosen pengajar, dan daftar mahasiswa yang mengambilnya. Method tambahMahasiswa akan mengecek apakah kapasitas sudah penuh sebelum menambahkan mahasiswa. Jika penuh, pesan error ditampilkan. Method hapusMahasiswa menghapus mahasiswa dari daftar. Method setDosen mengatur dosen pengajar sekaligus memastikan dosen juga mencatat matakuliah ini dalam daftar matakuliah yang diajarnya.
Class Jadwal hanya berfungsi untuk menyimpan informasi hari, jam mulai, dan jam selesai dari sebuah mata kuliah. Method toString digunakan agar jadwal bisa ditampilkan dengan format yang rapi seperti “Senin 07:00-08:50”.
Class FRS digunakan mahasiswa untuk mengelola matakuliah yang ingin diambil. Method ambilMatkul menambahkan matakuliah ke daftar jika FRS belum disetujui. Jika sudah disetujui, maka penambahan ditolak. Method getTotalSksSemester menghitung total SKS pada semester tersebut. Method validasi digunakan oleh dosen wali untuk menyetujui FRS mahasiswa. Validasi hanya berhasil jika dosen yang melakukan validasi memang dosen wali dari mahasiswa itu, dan total SKS tidak melebihi 24. Jika syarat tidak terpenuhi, maka validasi gagal.
Class Main menjadi driver program. Di dalamnya dibuat beberapa objek dosen, mahasiswa, dan daftar matakuliah. Kemudian sistem menampilkan menu interaktif menggunakan Scanner, yang memungkinkan pengguna melihat daftar matakuliah, mengambil matakuliah, melihat matakuliah yang sudah diambil, atau melakukan validasi FRS. Semua interaksi berjalan lewat perulangan sampai pengguna memilih keluar dari menu.
Demikian yang saya pelajari pada minggu kelima perkuliahan pemrograman berorientasi objek.
Muhammad Zaky Zein
5025241148


Comments
Post a Comment