Setiap object menyimpan dua hal: data dan kemampuan bertindak. Di dalam C#, data object disimpan dalam field, sedangkan tindakan didefinisikan sebagai method; keduanya disebut anggota (member) class. Bab ini membedah keduanya pada class RekeningBank: saldo adalah data yang dimiliki, sedangkan setor dan tarik adalah tindakan yang mengoperasikan data tersebut.

Field: Data Milik Object #

Field dideklarasikan di dalam badan class dengan pola: access modifier, tipe, lalu nama field. Posisi deklarasinya bebas, tetapi kebiasaan umum menempatkan semua field di bagian atas class agar mudah ditemukan.

csharp
public string Nomor;   // identitas rekening
public string Pemilik; // nama pemilik rekening
public int Saldo;      // saldo dalam rupiah

Field yang belum diisi tetap memiliki nilai, yaitu nilai bawaan (default value) sesuai tipenya: int bernilai 0, string bernilai null, dan bool bernilai false. Nilai bawaan ini berlaku sejak object dibuat, sehingga membaca Saldo sebelum penugasan mana pun menghasilkan 0. Nilai field juga melekat pada object: dua object dari class yang sama menyimpan salinan field yang berbeda.

Method: Perilaku Object #

Method dideklarasikan dengan pola: access modifier, return type, nama method, parameter di dalam tanda kurung, lalu badan method di dalam kurung kurawal. Return type void menyatakan method tidak mengembalikan nilai, seperti pada TampilkanInfo. Parameter memberi method data tambahan dari pemanggil: Setor(int jumlah) menerima satu nilai int yang menjadi bahan penambahan saldo. Method tanpa parameter seperti TampilkanInfo bekerja murni dari data object pemanggilnya. Nama method mengikuti konvensi PascalCase, dan setiap method membaca atau mengubah field milik object pemanggilnya tanpa perlu menerima data tersebut lewat parameter.

Contoh: Setor dan Tarik Saldo #

csharp
public class RekeningBank
{
    public string Nomor;
    public string Pemilik;
    public int Saldo;

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

    public void Tarik(int jumlah)
    {
        if (jumlah <= Saldo)
        {
            Saldo -= jumlah;
        }
    }

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

RekeningBank rekening = new RekeningBank();
Console.WriteLine($"Nilai awal Saldo: {rekening.Saldo}");

rekening.Nomor = "REK-3001";
rekening.Pemilik = "Budi";

rekening.Setor(500000);
rekening.Setor(150000);
rekening.Tarik(200000);
rekening.Tarik(1000000000);

rekening.TampilkanInfo();

Output yang Dihasilkan:

text
Nilai awal Saldo: 0
Rekening REK-3001 a.n. Budi - Saldo: Rp450000

Mari kita telaah baris demi baris:

  1. Console.WriteLine($"Nilai awal Saldo: {rekening.Saldo}"): field Saldo belum diisi, sehingga nilainya tetap 0 sesuai nilai bawaan int.
  2. Setor(500000) lalu Setor(150000): method menambah Saldo object pemanggil, dari 0 menjadi 500000 kemudian 650000.
  3. Tarik(200000): kondisi jumlah <= Saldo terpenuhi, sehingga Saldo berkurang menjadi 450000.
  4. Tarik(1000000000): jumlah penarikan melebihi saldo sehingga kondisi tidak terpenuhi; Saldo tidak berubah, karena aturan bisnis ditegakkan di dalam method, bukan oleh kode pemanggil.
  5. TampilkanInfo(): mencetak data akhir object, yaitu rekening milik Budi dengan saldo Rp450000.

Perhatikan bahwa Setor dan Tarik menulis Saldo secara langsung, tanpa awalan nama object. Compiler mengetahui bahwa kedua method berjalan atas object tertentu; mekanisme rincinya dibahas pada bab This Keyword.