Minggu, 05 Oktober 2025

PBO A - Pertemuan 5 - Konsep dan Sifat Objek

Nama    : Erlangga Rizqi Dwi Raswanto

NRP      : 5025241179

Kelas     : PBO A

1) Pendahuluan

Pada minggu ini dibuat sebuah sistem mini FRS (Formulir Rencana Studi) untuk mendemonstrasikan konsep OOP dengan kode Java sederhana. Fungsi aplikasi :

  • Melihat daftar mata kuliah yang tersedia

  • Mengambil mata kuliah (cek kapasitas & duplikasi)

  • Drop mata kuliah

  • Melihat KRS (daftar MK diambil + total SKS)


2) Empat Pilar OOP (dan bagaimana diterapkan)

  1. Encapsulation (Enkapsulasi)

    • Seluruh atribut pada Dosen, MataKuliah, Mahasiswa bersifat private dan diakses via getter (dan operasi khusus seperti daftar(), batal(), ambil(), drop()).

    • Efeknya: aturan kapasitas, larangan duplikasi, dsb terkendali di dalam kelasnya masing-masing.

  2. Abstraction (Abstraksi)

    • Detail teknis seperti logika naik/turun kapasitas disembunyikan melalui metode daftar()/batal() pada MataKuliah.

    • Kelas Main cukup memanggil API sederhana (mis. m.ambil(mk)), tanpa tahu bagaimana kapasitas dihitung.

  3. Inheritance (Pewarisan)

    • Program ini tidak memakai pewarisan eksplisit (selain turunan implisit dari Object).

    • Jika diperlukan, sangat mudah menambahkan superkelas Orang (punya nama) lalu Dosen & Mahasiswa mewarisinya.

  4. Polymorphism (Polimorfisme)

    • Method overriding pada toString() (di Dosen, MataKuliah). Saat objek dicetak, Java memilih implementasi toString milik objek aktual (polimorfisme berbasis Object).


3) Diagram Kelas (UML)

classDiagram
class Dosen {
  - nama : String
  - nip  : String
  + Dosen(nama:String, nip:String)
  + getNama() String
  + getNip() String
  + toString() String
}

class MataKuliah {
  - kode : String
  - nama : String
  - sks : int
  - kapasitas : int
  - terisi : int
  - jadwal : String
  - dosen : Dosen
  + MataKuliah(kode,nama,sks,kapasitas,jadwal,dosen)
  + getKode() String
  + getNama() String
  + getSks() int
  + getJadwal() String
  + getDosen() Dosen
  + isPenuh() boolean
  + daftar() boolean
  + batal() boolean
  + toString() String
}

class Mahasiswa {
  - nama : String
  - nrp  : String
  - krs : List<MataKuliah>
  + Mahasiswa(nama:String, nrp:String)
  + getNama() String
  + getNrp() String
  + getKRS() List<MataKuliah>
  + ambil(MataKuliah) boolean
  + drop(MataKuliah) boolean
  + totalSks() int
}

class Main {
  + main(String[]) void
  - tampilKatalog(List<MataKuliah>) void
  - cetakKRS(Mahasiswa) void
  - bacaInt() int
  - valid(int, List<?>) boolean
}

Dosen <.. MataKuliah : dosen pengampu
Mahasiswa "1" --> "*" MataKuliah : mengambil

4) Rincian Kelas & Metode

A. Dosen

  • Atribut: nama, nip (keduanya final)

  • Metode kunci: toString() untuk menampilkan dosen rapi di konsol.

  • Peran: metadata pengampu MK (tanpa logika bisnis).

B. MataKuliah

  • Atribut: kode, nama, sks, kapasitas, terisi, jadwal, dosen.

  • Metode bisnis:

    • isPenuh()true jika terisi >= kapasitas

    • daftar() → tambah 1 kursi jika belum penuh

    • batal() → kurangi 1 kursi jika ada yang terdaftar

  • Tujuan: menjaga aturan kapasitas dan format tampilan.

C. Mahasiswa

  • Atribut: nama, nrp, krs (list MK yang diambil)

  • Metode bisnis:

    • ambil(mk) → gagal jika sudah diambil atau kapasitas penuh

    • drop(mk) → gagal jika MK belum ada di KRS

    • totalSks() → jumlahkan sks semua MK di krs

  • Tujuan: menjaga aturan duplikasi di sisi mahasiswa.

D. Main

    • Inisialisasi data contoh (Dosen, daftar MataKuliah)

    • Input 1 mahasiswa

    • Menu: daftar MK / ambil / drop / lihat KRS

    • Utilitas: tampilKatalog, cetakKRS, bacaInt, valid


5) Alur Operasi (Ringkas)

sequenceDiagram
participant U as User
participant Main
participant Mhs as Mahasiswa
participant MK as MataKuliah

U->>Main: Pilih (1) Lihat daftar MK
Main->>Main: tampilKatalog(katalog)

U->>Main: Pilih (2) Ambil MK (nomor i)
Main->>MK: katalog.get(i)
Main->>Mhs: ambil(MK)
Mhs->>MK: daftar() (cek kapasitas)
MK-->>Mhs: true/false
Mhs-->>Main: true/false (tambah ke KRS jika true)
Main-->>U: Berhasil/Gagal

U->>Main: Pilih (3) Drop MK (nomor j di KRS)
Main->>Mhs: drop(MK_j)
Mhs->>MK: batal() (kurangi terisi)
MK-->>Mhs: true/false
Mhs-->>Main: true/false
Main-->>U: Berhasil/Gagal

U->>Main: Pilih (4) Lihat KRS
Main->>Mhs: getKRS(), totalSks()
Main-->>U: Daftar MK + total SKS

6) Source Code

Dosen.java
public class Dosen {
private final String nama;
private final String nip;


public Dosen(String nama, String nip) {
this.nama = nama;
this.nip = nip;
}


public String getNama() { return nama; }
public String getNip() { return nip; }


@Override
public String toString() {
return nama + " (NIP: " + nip + ")";
}
}

Mahasiswa.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class Mahasiswa {
private String nama;
private String nrp;
private List<MataKuliah> krs = new ArrayList<>();


public Mahasiswa(String nama, String nrp) {
this.nama = nama;
this.nrp = nrp;
}


public String getNama() { return nama; }
public String getNrp() { return nrp; }
public List<MataKuliah> getKRS() { return Collections.unmodifiableList(krs); }


public boolean ambil(MataKuliah mk) {
if (krs.contains(mk)) return false; // sudah diambil
if (mk.daftar()) {
krs.add(mk);
return true;
}
return false; // penuh
}


public boolean drop(MataKuliah mk) {
if (!krs.contains(mk)) return false;
if (mk.batal()) {
krs.remove(mk);
return true;
}
return false;
}


public int totalSks() {
int sum = 0;
for (MataKuliah mk : krs) sum += mk.getSks();
return sum;
}
}

MataKuliah.java

public class MataKuliah {
private String kode;
private String nama;
private int sks;
private int kapasitas;
private int terisi = 0;
private String jadwal; // contoh: "Senin 10:00-11:50"
private Dosen dosen;


public MataKuliah(String kode, String nama, int sks, int kapasitas, String jadwal, Dosen dosen) {
this.kode = kode;
this.nama = nama;
this.sks = sks;
this.kapasitas = kapasitas;
this.jadwal = jadwal;
this.dosen = dosen;
}


public String getKode() { return kode; }
public String getNama() { return nama; }
public int getSks() { return sks; }
public String getJadwal() { return jadwal; }
public Dosen getDosen() { return dosen; }


public boolean isPenuh() { return terisi >= kapasitas; }


/** Coba daftar satu kursi. true jika berhasil */
public boolean daftar() {
if (isPenuh()) return false;
terisi++;
return true;
}


/** Batalkan satu kursi. true jika berhasil */
public boolean batal() {
if (terisi <= 0) return false;
terisi--;
return true;
}


@Override
public String toString() {
String d = (dosen == null ? "-" : dosen.getNama());
return String.format("%s - %s (%d SKS) | %s | %d/%d | Dosen: %s",
kode, nama, sks, jadwal, terisi, kapasitas, d);
}
}
Main.java
import java.util.*;

public class Main {
    private static final Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        // Data contoh dosen
        Dosen d1 = new Dosen("Fajar Baskoro", "19700001");
        Dosen d2 = new Dosen("Victor Hariadi", "19700002");

        // Input satu mahasiswa
        System.out.print("Nama mahasiswa : ");
        String nama = sc.nextLine();
        System.out.print("NRP mahasiswa  : ");
        String nrp = sc.nextLine();
        Mahasiswa m = new Mahasiswa(nama, nrp);

        // Katalog MK minimal
        List<MataKuliah> katalog = new ArrayList<>();
        katalog.add(new MataKuliah("IF101", "PBO",          3, 2, "Senin 10:00-11:50",  d1));
        katalog.add(new MataKuliah("IF102", "Teori Graf",   3, 3, "Selasa 08:00-09:40", d2));
        katalog.add(new MataKuliah("IF103", "Struktur Data",3, 1, "Kamis 10:00-11:50",  d2));

        int pilih;
        do {
            System.out.println("\n==== MENU FRS (Sederhana) ====");
            System.out.println("Login: " + m.getNama() + " (" + m.getNrp() + ")");
            System.out.println("1. Lihat daftar mata kuliah");
            System.out.println("2. Ambil mata kuliah");
            System.out.println("3. Drop mata kuliah");
            System.out.println("4. Lihat KRS");
            System.out.println("0. Keluar");
            System.out.print("Pilih: ");
            pilih = bacaInt();

            switch (pilih) {
                case 1:
                    tampilKatalog(katalog);
                    break;

                case 2:
                    tampilKatalog(katalog);
                    System.out.print("Pilih nomor MK: ");
                    int ambil = bacaInt() - 1;
                    if (valid(ambil, katalog)) {
                        boolean ok = m.ambil(katalog.get(ambil));
                        System.out.println(ok ? "Berhasil ambil." : "Gagal (penuh/duplikat).");
                    }
                    break;

                case 3:
                    List<MataKuliah> list = new ArrayList<>(m.getKRS());
                    if (list.isEmpty()) { System.out.println("KRS kosong."); break; }
                    for (int i = 0; i < list.size(); i++) {
                        System.out.println((i+1) + ". " + list.get(i));
                    }
                    System.out.print("Pilih nomor MK untuk di-drop: ");
                    int drop = bacaInt() - 1;
                    if (valid(drop, list)) {
                        boolean ok = m.drop(list.get(drop));
                        System.out.println(ok ? "Berhasil drop." : "Gagal drop.");
                    }
                    break;

                case 4:
                    cetakKRS(m);
                    break;

                case 0:
                    System.out.println("Selesai.");
                    break;

                default:
                    System.out.println("Menu tidak valid.");
            }
        } while (pilih != 0);
    }

    private static void tampilKatalog(List<MataKuliah> katalog) {
        System.out.println("\nDaftar Mata Kuliah:");
        for (int i = 0; i < katalog.size(); i++) {
            System.out.println((i + 1) + ". " + katalog.get(i));
        }
    }

    private static void cetakKRS(Mahasiswa m) {
        List<MataKuliah> list = new ArrayList<>(m.getKRS());
        if (list.isEmpty()) { System.out.println("KRS kosong."); return; }
        System.out.println("\nKRS Saat Ini:");
        int total = 0;
        for (MataKuliah mk : list) {
            System.out.println("- " + mk.getNama() + " (" + mk.getSks() + " SKS)");
            total += mk.getSks();
        }
        System.out.println("Total SKS: " + total);
    }

    private static int bacaInt() {
        while (true) {
            try {
                return Integer.parseInt(sc.nextLine().trim());
            } catch (Exception e) {
                System.out.print("Masukkan angka: ");
            }
        }
    }

    private static boolean valid(int idx, List<?> list) {
        if (idx < 0 || idx >= list.size()) {
            System.out.println("Nomor tidak valid.");
            return false;
        }
        return true;
    }
}



7) Contoh Penggunaan


Login dan melihat daftar kuliah



Mengambil kelas kuliah



Melihat KRS



Drop KRS



Tidak ada komentar:

Posting Komentar

PBO A - Pertemuan 15 - Pong!

Nama : Erlangga Rizqi Dwi Raswanto NRP : 5025241179 Kelas : PBO A 1. Pendahuluan Pada pertemuan 15, kita mempraktikkan pembuatan game...