Semua field pada bab-bab sebelumnya ditandai public, sehingga kode mana pun boleh menulis rekening.Saldo = -1000000; tanpa melewati method apa pun. Kebebasan tersebut berisiko ketika class menyimpan data yang memiliki aturan, misalnya saldo yang tidak boleh berkurang di luar mekanisme tarik. Access modifier mengatur hal ini: kata kunci pada setiap deklarasi anggota yang menentukan siapa yang boleh mengaksesnya.

Daftar Access Modifier #

ModifierCakupan akses
publicSemua kode, termasuk kode di luar class dan di luar project
privateHanya kode di dalam class yang sama
internalHanya kode di dalam assembly (project) yang sama
protectedClass pemiliknya beserta class turunannya
protected internalGabungan protected dan internal: turunan maupun kode dalam assembly yang sama
private protectedGabungan yang lebih ketat: hanya turunan yang berada dalam assembly yang sama

Dua modifier terakhir adalah kombinasi lanjutan; keduanya cukup dikenali agar tidak asing saat membaca kode orang lain.

private Menjaga Field Saldo #

csharp
public class RekeningBank
{
    private int saldo;

    public string Pemilik;

    public RekeningBank(string pemilik, int saldoAwal)
    {
        Pemilik = pemilik;
        saldo = saldoAwal;
    }

    public void Setor(int jumlah)
    {
        saldo += jumlah;
    }

    public int BacaSaldo()
    {
        return saldo;
    }

    public void TampilkanInfo()
    {
        Console.WriteLine($"Rekening a.n. {Pemilik} - Saldo: Rp{saldo}");
    }
}

RekeningBank rekening = new RekeningBank("Budi", 500000);
rekening.Setor(200000);

Console.WriteLine($"Saldo dibaca lewat method: Rp{rekening.BacaSaldo()}");
rekening.TampilkanInfo();

Output yang Dihasilkan:

text
Saldo dibaca lewat method: Rp700000
Rekening a.n. Budi - Saldo: Rp700000

Mari kita telaah baris demi baris:

  1. private int saldo;: field ditandai private, sehingga hanya kode di dalam class RekeningBank yang dapat membaca atau menulisnya.
  2. Constructor dan Setor: keduanya berada di dalam class, sehingga bebas mengakses saldo; aturan pengisian dan penambahan saldo kini melekat pada class.
  3. BacaSaldo(): pintu baca yang public; method mengembalikan nilai saldo tanpa memberi hak tulis kepada luar.
  4. Pemanggilan dari luar: rekening.Setor(...) dan rekening.BacaSaldo() sah karena keduanya public; akses langsung seperti rekening.saldo tidak lagi mungkin.

Ketika Compiler Menolak Akses #

Percobaan mengakses anggota private dari luar class ditolak compiler sebelum program berjalan. Project uji berikut memuat dua baris pelanggaran:

csharp
RekeningBank rekening = new RekeningBank("Budi", 500000);
rekening.saldo = 100000;
Console.WriteLine(rekening.saldo);

Pesan compiler yang dihasilkan:

text
error CS0122: 'RekeningBank.saldo' is inaccessible due to its protection level

Galat CS0122 dilaporkan untuk setiap baris yang melanggar; hasilnya berasal dari eksekusi dotnet build nyata dengan path project dipangkas agar ringkas.

internal dan protected #

internal membatasi akses ke kode dalam assembly yang sama, yaitu hasil kompilasi satu project (.exe atau .dll). Demonstrasi internal membutuhkan dua project yang berdiri sendiri, sehingga bab ini hanya menjelaskan mekanismenya: ketika anggota internal pada project A dirujuk dari project B, compiler melaporkan bahwa anggota tersebut tidak dapat diakses. Pola ini dipakai untuk class yang tidak dimaksudkan menjadi pustaka pihak lain.

protected bekerja berpasangan dengan inheritance: selain class pemiliknya, class turunan juga boleh mengakses anggota protected, sedangkan kode lain tetap ditolak. Penjelasan lengkapnya menunggu bab inheritance pada bagian ini, karena contohnya membutuhkan class turunan.