-->

Pemrograman #1 - Kelas dan Objek



Kelas dan Objek

Kelas adalah perluasan konsep dari struktural data. Serupa dengan struktural data, class dapat berisi anggota data (data member), tetapi kelas juga dapat berisikan fungsi-fungsi sebagai bagian dari anggotanya.

Sedangkan Objek adalah instasiasi dari kelas. Dalam kondisi variable, sebuah kelas akan menjadi tipe, dan objek akan menjadi variabelnya.

Kelas dapat didefinisikan dengan menggunakan kata kunci class. Berikut bentuk dasar dari pendefinisian kelas.

class <className> {
  <accessSpecifier> :
    member_1;
    member_n;
  <accessSpecifier> :
    member_1;
    member_n;
};

Dimana nama kelas adalah identifier yang valid untuk kelas. Sedangkan deklarasi tubuh dapat berisi anggota-anggota yang dapat menjadi data atau deklarasi fungsi.

Kelas dapat mempunyai format yang sama sebagai struktural data murni, tetapi kelas tidak hanya berisikan data. Melainkan juga dapat berisikan fungsi-fungsi dimana fungsi itu terdapat pembaharuan yang diberi nama access specifier.

Access specifier terdiri dari tiga buah kata kunci dasar yaitu : private, public, dan protected. Modifikasi dari ketiga spesifikasi ini akan memberikan akses yang benar untuk anggota-anggota yang mengikutinya.

  • Private, anggota yang mengikuti akses private hanya dapat diakses oleh anggota yang berasal dari kelas yang sama.
  • Public, anggota yang mengikuti akses public dapat diakses dari mana saja oleh siapa saja selama objek kelas itu terlihat (dikenali).
  • Protected, anggota yang mengikuti akses protected hanya dapat diakses oleh anggota yang berasal dari kelas yang sama. Tetapi juga dapat diakses oleh anggota dari kelas yang diturunkan (derived class).

Cara mendifinisikan kelas

Ketika akan mendefinisikan kelas, maka kelas tersebut juga harus mendefinisikan rangkaian tipe datanya. Hal ini bukan berarti kelas mendefinisikan data yang sesungguhnya, hanya saja kelas mendeklarasikan pengertian dari nama dan tipe data sehingga objek dari kelas akan konsisten pada operasi-operasi yang akan disajikan nantinya.

Berikut contoh pendefinisian sebuah kelas.
class Student {
private:
  string sId;
  string name;
  string gender;
public:
  Student();
  void printOut();
};
Dari potongan skrip diatas dapat dilihat bagaimana kelas dengan nama Student di deklarasikan. Pada kelas tersebut dapat diketahui memiliki anggota-anggota berupa data dan fungsi dengan uraian antara lain terdapat tiga buah data dengan tipe string yaitu sId, name, dan gender, dimana data tersebut memiliki akses spesifikasi private. dan kelas Student juga memiliki dua buah fungsi yaitu Student(), dan printout(), yang mana fungsi tersebut memiliki akses spesifikasi public.

Dalam penggunaannya, kelas harus mendefinisikan fungsi-fungsi yang menjadi anggotanya. Agar ketika akan diakses, jelas maksud dan tujuan dari fungsi-fungsi yang telah dideklarasikan.

Berikut contoh lanjutan dari kelas Student
#include <iostream>

using namespace std;

class Student {
private:
  string sId;
  string name;
  string gender;
public:
  Student();
  void printOut();
};

Student::Student() {
  sId = "16.11.0035";
  name = "Taufiq Hidayat"
  gender = "L";
}

void Student::printOut() {
  cout << "Welcome... " << name << endl;
  cout << "Your Student ID is " << sId << endl;
}

Dari contoh diatas dapat dilihat bagaimana fungsi dari anggota kelas Student dideklarasikan. untuk mendefinisikan fungsi sebenarnya dapat dilakukan dalam dua cara yaitu dari dalam kelas dan dari luar kelas. Untuk kesempatan kali ini fungsi didefinisikan diluar kelas.

Dapat disimpulkan pendefinian kelas sesungguhnya memliki beberapa aturan yang penting. dalam bentuk lengkapnya kelas memiliki data (biasa dikenal dengan nama atribut), fungsi (biasa dikenal dengan nama metode). Dimana nanti fungsi/metode dapat dibagi kedalam empat bagian antara lain : Constructor, Destructor, Properties (dalam bahasa JAVA juga dikenal sebagai getter & setter), dan Method.

Berikut contoh lengkap untuk menggunakan kelas dalam C++
#include <iostream>

using namespace std;

class Student {
private:
  string sId;
  string name;
  string gender;
public:
  Student();
  void printOut();
};

Student::Student() {
  sId = "16.11.0035";
  name = "Taufiq Hidayat"
  gender = "L";
}

void Student::printOut() {
  cout << "Welcome... " << name << endl;
  cout << "Your Student ID is " << sId << endl;
}

int main() {
  Student student;
  student.printOut();

  return 0;
}

Pointer pada Kelas

Objek juga dapat ditunjuk sebagai pointer. Setelah terdeklarasikan, sebuah kelas akan menjadi tipe yang valid, sehingga dapat digunakan untuk penunjuk sebagai pointer.

Sebuah pointer ke kelas pada C++ diberlakukan dengan cara yang sama seperti pointer ke struktur (struct). Untuk melakukan akses pada data member biasa, objek dapat menggunakan tanda dot operator (.). Sedangkan untuk melakukan akses data member pada objek pointer haruslah mengggunakan arrow operator (->).

Sama seperti semua pointer pada umumnya, pointer harus diinisialisasikan sebelum dapat digunakan. Berikut contoh penggunaan pointer dalam kelas.
#include <iostream>

using namespace std;

class Student {
private:
  string nim;
  string name;
  string gender;
public:
  Student() {}
  Student(string cNim, string cName, string cGender);
    nim{cNim},
    name{cName},
    gender{cGender} {}
  string getName() {return name;}
  void setName(string cName) {name = cName;}
  ~Student(){}
};


int main() {
  Student student("16.11.0035", "ArtTerror23", "L");
  Student *ptr1, *ptr2;

  ptrStudent1 = &student;
  ptrStudent2 = new Student("16.11.0035", "ArtTerror23", "L");

  cout << "From object student : " << student.getName() << endl;
  cout << "From pointer student 1 : " << ptr1->getName() << endl;
  cout << "From pointer student 2 : " << ptr2->getName() << endl;

  delete ptrStudent2;

  return 0;
}
Berhati-hatilah ketika menginstansiasikan sebuah pointer dengan menggunakan kata kunci new. karena itu mengalokasikan memori objek kedalam memori komputer yang masih kosong (free store). Dan apabila tidak di hancurkan (dengan kata kunci delete), maka itu akan menyebabkan menumpuknya memori (memory leak).

Kata kunci “this”

Setiap objek dalam C ++ memiliki akses ke alamatnya sendiri melalui sebuah pointer yang dikenal dengan nama this pointer. This merupakan sebuah pointer dengan parameter implicit untuk semua fungsi member. Hal ini dapat digunakan untuk merujuk kepada objek yang sedang diterapkan.

Dengan kata lain kata kunci this ini mewakili sebuah pointer ke objek yang fungsi membernya sedang dijalankan, dan ini digunakan dalam fungsi member dari sebuah kelas untuk merujuk kepada objek dirinya sendiri.

Perlu ditekankan friend fungsi tidak memiliki this pointer, karena friend (baik fungsi maupun kelas) bukanlah termasuk anggota dari sebuah kelas. Hanya fungsi member yang memiliki this pointer.

Berikut contoh penggunaan kata kunci this pada kelas:
#include <iostream>

using namespace std;

class Student {
private:
  string nim;
  string name;
  string gender;
public:
  Student() {}
  Student(string cNim, string cName, string cGender);
    nim{cNim},
    name{cName},
    gender{cGender} {}
  void showStudent();
  ~Student(){}
};

void Student::showStudent() {
  string prename;

  if(this -> gender == "M") {
    prename = "Mr.";
  } else if (this -> gender == "F") {
    prename = "Mrs.";
  }
}


int main() {
  Student student1;
  student1.setNim("16.11.0035");

  Student *student2 = new Student();
  student2 -> setNim("16.11.0035");
  delete student2;
  
  return 0;
}

Perbedaan kata kunci new pada kelas

Untuk mengetahui perbedaan menggunakan pointer dengan yang tidak menggunakan pointer maka perhatikan contoh dari potongan kode pada kasus dibawah ini:
void Student::showStudent() {
  string prename;

  if(this -> gender == "M") {
    prename = "Mr.";
  } else if (this -> gender == "F") {
    prename = "Mrs.";
  } else {
    prename = "";
  }
  cout << prename << this -> name << endl;
  cout << "Student ID " << this -> nim << endl;
}

int main() {
  Student student("16.11.0035", "Taufiq Hidayat", "M");
  student.showStudent();

  return 0;
}
dari potongan contoh diatas sekilas tidak ada perbedaan antara objek student1 dengan student2. dimana kedua objek itu sama-sama mengisikan nilai kepada data member. Namun terdapat perbedaan antara kedua objek tersebut. Berikut penjelasan tentang perbedaan dari masing-masing objek.

Ketika fungsi mengembalikan nilainya, berikut yang akan terjadi: objek student2 akan keluar dari lingkup (out of scope), dimana perintah destruktor akan selalu berlawanan dengan perintah konstruktor. Namun objek student2 hanya sebagai pointer, jadi hal tersebut tidak akan terjadi apa-apa, dan memori yang menempati hanya dibebaskan. Dan yang paling penting memori yang digunakan untuk menunjuk ke kelas Student tidaklah tersentuh dengan kata lain hanya pointernya saja yang dibebaskan. Inilah yang jika dibiarkan (tidak di delete) maka akan mengakibatkan terjadinya kebocoran dalam memori (memory leak). berbeda pada objek student1 ketika keluar dari lingkup (out of scope). karena objek tersebut mempunya durasi yang otomatis, maka destruktor akan terpanggil sehingga semua memori yang terpakai oleh objek student1 akan langsung dibebaskan.

Berikut rincian perbandingan antara tanpa penggunaan kata kunci new dengan yang menggunakan kata kunci new :
Yang tidak menggunakan katakunci new
  • Mengalokasikan memori untuk objek kedalam “call stack” (dimana semua variabel lokal ditempatkan), yang pada umumnya memiliki lebih sedikit ruang memori yang tersedia untuk disimpan/ditumpuk. Jika yang dialokasikan terlalu banyak maka akan beresiko teradinya “stack overflow”.
  • Ketika objek telah selesai digunakan, tidak diperlukan kata kunci delete untuk membebaskan memorinya sebab sudah terdapat destruktor yang akan dipanggil secara otomatis.
  • Memori yang terpakai sudah tidak teralokasikan lagi ketika objek telah keluar dari lingkup (out of scope), dalam artian tidak bisa mengembalikan penunjuk terhadap objek yang terdapat pada stack.

Yang menggunakan kata kunci new
  • Mengalokasikan memori untuk objek kedalam “free store”.
  • Ketika objek selesai digunakan, objek harus dibebaskan memorinya dengan menggunakan kata kunci delete. Jika tidak dihapus maka akan membuat kebocoran pada memori (memory leak).
  • Memori yang terpakai akan tetap teralokasikan sampai objek itu terhapus (delete). dalam artian bisa mengembalikan sebuah objek yang telah dibuat dengan menggunakan kata kunci new.

Kata kunci new akan dibutuhkan selama objek yang dibuat berada diluar lingkup fungsi, dan objek yang dibuat benar-benar besar (membutuhkan ruang alokasi memori yang besar), atau ketika tidak mengetahui ukuran array (objek yang berupa array) yang digunakan pada waktu proses kompilasi.


Jadi kesimpulannya jika membuat sebuah program dalam bahasa C++ dimana program itu untuk kinerja (for performance). Menggunakan kata kunci new dan free store itu akan jauh lebih lambat daripada menggunakan call stack (kecuali ketika menggunakan threads). jadi kata kunci new cukup digunakan hanya ketika dibutuhkan saja.
Load Comments

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel