# Object Oriented Programming
###### tags: `OOP`
## Mengapa harus ada OOP ?
Mengapa tidak membuat program secara prosedural saja?
Membuat program secara prosedural juga sebenarnya bisa, tetapi masalahnya nanti kalau programnya sudah semakin besar da kompleks, kode program akan sulit dimaintenance.
Pada pemrograman prosedural, kita biasanya memecah program menjadi beberapa prosedur. Lalu mebuat beberapa variable global dan lokal untuk menyimpan data temp.
Ketika program semakin besar, maka otomatis semakin banyak pula variabel yang dibutuhkan dan prosedur yang harus dibuat.
Lama kelamaan, kode akan lebih sulit untuk dimodifikasi, karena sudah terlalu kompleks.
## What is OOP?
Object Oriented Programming atau dalam bahasa indonesia dikenaal dengan pemrograman berorientasikan objek merupakan sebuah paradigma atau teknik pemrograman yang berorientasikan objek.
Pada OOP, fungsi dan variable dibungkus dalam sebuah objek atau class.
Sebelum membuat objek kita harus membuat class terlebih dahulu.
### Class
Class bertugas untuk mengumpulkan prosedur/fungsi dan variable dalam satu tempat.

Setelah class dibuat, maka object dapat dibuat. Class yang dibuat akan berfungsi sebagai template, sedangkan object adalah sebuah variable yang merupakan instance atau perwujudan dari Class.
Dimana terdapat data dan fungsi yang disebut dengan object.
Contoh:
:::success
untuk sebuah mobil terdapat:
data:
- tinggi
- lebar
- panjang
- warna
- mesin
- aksesoris
- bentuk
fungsi:
- gas()
- rem()
- ubahPersnelling()
- action()
:::
:::warning
Di dalam kotak hijau tersebut disebut **OBJECT**
:::
Dalam OOP:
- **Variable** disebut atribut atau properti
- **Fungsi** disebut method
Contoh class:
```java
class NamaClass {
String atribut1;
String atribut2;
void namaMethod(){ ... }
void namaMethodLain(){ ... }
}
```
Setelah membuat class lalu object pun dapat dibuat berdasarkan template class tersebut:
```java
NamaClass namaObj = new NamaClass();
```
Kata kunci new berfungsi untuk membuat object baru dari class.
Stelah membuat object, kita bisa mengakses atribut dan method dari object tersebut.
```java
namaObj.namaMethod();
namaObj.atribut1;
```
tanda titik . berfungsi untuk mengakses atribut dan method.
## Gimana caranya buat object?
Pertama kita buat class dulu yang dianggap sebagai template, lalu kita buat objectnya dimana mengambil karakteristik dari templatenya yang disebut OBJECT.
Object yang telah dibuat adalah realnya.
Ada proses namanya instansiasi yaitu proses membuat object real dari templatenya.
Cuma itu.
## Perbedaan antara Procedural vs OOP
https://www.youtube.com/watch?v=pTB0EiLXUC8
<center>

</center>
Sebelum OOP dibuat, terdapat procedural programming dimana di dalam sebuah program terdapat fungsi dan data yang simpel. Namun semakin program berkembang maka kita akan mendapatkan fungsi yang lebih kompleks dimana-mana. Karena kita mengcopy-paste fungsi secara terus menerus. (spaghetting code)
<center>

</center>
OOP lah yang menyelesaikan permasalahan tersebut, karena mengkombinasi group dari variable dan fungsi yang berhubungan menjadi satu unit, dengan sebutan object. Dimana data disebut property, dan fungsi disebut method.

Kita bisa membuat OOP dengan pemisalan sebuah mobil.
<center>

</center>
Dalam proses pembuatan mobil, pasti membutuhkan data tahun produksi, model produksi, dan warna dari mobil tersebut. Lalu bagaimana cara mobil tersebut digunakan yaitu dengan menambahkan method start(), stop(), dan move()
## Encapsulation
Group of related variable and function operate on them into object
## Abstraction
Hiding some properties and methods from the outside dan advantage:
- simpler interface,
- reduce the impact of change,

## Inheritance
misalnya kita membuat sebuah tombol dengan memiliki method dasar yang sama, seperti click() dan focus(), lalu hal tersebut bisa diaplikasikan pada object-object yang baru dengan hanya menginheritnya.

## Polymorphism = Many Form
In OOP PM allows to get rid of long event or switch and case statements. Refactor the ugly switch and case statement.
# Scanner
Untuk melakukan input dari user, maka bisa menggunakan beberapa metode. Yang pertama adalah menggunakan:
```java
import java.util.Scanner;
```
Lalu pada class Main dilakukan penginputan sebagai berikut:
```java
// definisikan property
int numberOne;
Scanner input = new Scanner(System.in);
numberOne = input.nextInt();
// nextInt adalah tipe data, tipe data yang diinput harus sesuai dengan apa yang didefinisikan pertama kali
```
Yang kedua:
...
Yang ketiga:
...
## Compare OOP Java Dengan OOP C++
source: [Link](https://www.msuniv.ac.in/images/e-content/1.Object%20Oriented%20Programming%20with%20C%20and%20Java.pdf), [Link2](http://icarus.cs.weber.edu/~dab/cs1410/textbook/1.Basics/review.html)
| Konsep Pembeda | Java | C++ |
| -------- | -------- | -------- |
| Language | Java adalah true Object Oriented language | Basically C dengan Object-Oriented Procedural extension, maka dari itu C++ adalah Multi-barrel rocket launcher |
|Operator|Java mensupport operator overloading| C++ tidak mensupport operator overloading|
|Template| Java tidak memiliki template untuk class-class| C++ memiliki tempate class tertentu |
|Inheritance| Java tidak bisa mensupport multiple inheritance, melainkan bisa ditemukan pada interface| C++ mensupport multiple inheritance |
|Global Variable| Di java tidak ada global variable. Variable dan method di deklarasi di setiap class yang dibuat.| C++ bisa menggunakan global variable |
| Pointer | Tidak ada pointer di Java | C++ memiliki konsep pointer |
| Destructor | Tidak ada destructor function, diganti dengan finalize () function | C++ memiliki destructor function |
| Header| Tidak ada header yang digunakan pada java | C++ memiliki header files untuk memasukkan semua library yang di include |
|Operasi yang berhubungan dengan class | method | member function |
## Membuat BlueJ dengan kodingan Calculator
Pertama buka BlueJ:

Kedua New Project, sesuaikan dengan pathnya. Pada case ini saya membuatnya di `C:\test_bluej\01`:

Buat Package dengan nama `Calculator`, lalu Open:

Jika sudah di dalam package, buat class Tambah, Kurang, Kali, Bagi. Dan isikan class Sesuai dengan kodingan yang sudah dibuat sebelumnya (dengan mengklik 2x pada masing-masing class yang ingin di edit isinya).

Jika kodingan yang diisi tiap kelas sudah saling terhubung, maka object pada blueJ akan tersambung dengan otomatis:

Compile Tiap-tiap object dengan mengklik tiap class, jika compile benar maka tidak akan ada syntax error di bagian bawah container class. Lalu compile object `Calc` yang merupakan Main object pada package tersebut dengan
klik kanan + pilih void main(String[] args)

Jika ada tampilan seperti ini, klik okay

Aplikasi telah berjalan :)


### Atau jika menggunakan fitur dari BlueJ secara langsung tiap object bisa CHEK methodnya.
Misalnya Saya akan menggunakan method Tambah,
klik kanan method Tambah + klik new Tambah(parameter a, parameter b):

Maka di bawah akan terlihat kotak merah, lalu double klik on it.

Hasilnya bisa terlihat sesuai dengan property dan data type serta proses yang kita definikan di kodingan class tersebut.
Selesai.