Što je objektno orijentirano programiranje (OOP)?
U dosadašnjim tutorijalima prošli smo kroz različite koncepte programiranja. Naučili smo Arrays, for loop, metode i druge bitne operacije. Sada ćemo naučiti ključni dio programskog jezika Java, a to je objektno orijentirano programiranje (OOP). Kao i svi dosadašnji tutorijali, i ovaj se nalazi na našem YouTube kanalu.
Objektno orijentirano programiranje je opisivanje odnosno preslikavanje entiteta iz stvarnog života u računalni program. U OOP se entiteti koje tako preslikavamo zovu objekti. Oni sadržavaju informacije o entitetu kojeg opisuju, kao i interakcije koje ti objekti mogu raditi. Iz primjera ćemo najbolje shvatiti što je OOP i kako funkcionira.
class Cat {
String name;
String color;
void meow() {
System.out.println(name + " says meow!");
}
}Napravili smo klasu koja se zove Cat, a poslužit će za kreiranje predloška (blueprint) kojim opisujemo mačku. Klasa Cat sadržava informacije o mački (ime i boju) te akcije koje mačka može raditi. Konkretno, mačka koju opisujemo može mijaukati. Sada ćemo klasu Cat pozvati u main metodi tako što ćemo kreirati objekt.
public class Main {
public static void main(String[] args) {
Cat myCat = new Cat(); // kreirali smo novi objekt
myCat.name = "Jonesy"; // odredili smo ime
myCat.color = "Yellow"; // odredili smo boju
myCat.meow(); // pozvali smo akciju koju objekt može činiti
}
}U ovom smo primjeru iskoristili klasu Cat da bismo kreirali objekt Cat. Isti smo taj objekt spremili u varijablu myCat te joj dali ime, odredili boju i pozvali akciju koju objekt može izvršiti (mijaukati). Istu tu klasu možemo iskoristiti za kreiranje više objekata.
public class Main {
public static void main(String[] args) {
Cat myCat = new Cat(); // kreirali smo novi objekt tipa Cat
myCat.name = "Jonesy"; // odredili smo ime
myCat.color = "White"; // odredili smo boju
myCat.meow(); // pozvali smo akciju koju objekt može činiti
Cat myOtherCat = new Cat(); // kreirali smo novi objekt tipa Cat
myOtherCat.name = "Blackie"; // odredili smo ime novom objektu
myOtherCat.color = "Black"; // odredili smo boju novom objektu
myOtherCat.meow(); // pozvali smo akciju koju novi objekt može činiti
}
}Kao što vidite, kreirali smo još jedan objekt (myOtherCat) i dali mu druge informacije s kojima smo ga opisali. Koristeći klase, možemo definirati doslovno svaki entitet iz stvarnog svijeta. Evo još jednog primjera, u kojem ćemo pomoću OOP-a opisati automobil.
class Car {
String brand;
String model;
boolean abs;
int year;
void start() {
System.out.println("The " + brand + " " + model + " is starting.");
}
void drive(int distance) {
System.out.println("Driving the " + brand + " for " + distance + " kilometers.");
}
}Kreirali smo klasu Car koja nam daje osnovne podatke o automobilu: koji je brand, model, ima li ABS te koje je godine proizveden. Sada ćemo iskoristiti tu klasu da bismo kreirali dodatne objekte.
public class Main {
public static void main(String[] args) {
Car myCar = new Car(); // kreirali smo novi objekt tipa Car
myCar.brand = "Mazda";
myCar.model = "MX-5";
myCar.abs = true;
myCar.year = 2023;
myCar.start(); // pokrenuli smo automobil
myCar.drive(50); // vozili smo ga 50 km
Car anotherCar = new Car(); // kreirali smo još jedan objekt tipa Car
anotherCar.brand = "Renault";
anotherCar.model = "Captur";
anotherCar.abs = true;
anotherCar.year = 2022;
anotherCar.start(); // pokrenuli smo ga
anotherCar.drive(30); // vozili smo ga 30 km
}
}U prethodnom bloku koda smo kreirali dva objekta, za što smo kao predložak koristili istu klasu Car. Ujedno smo pomoću metoda start() i drive() pozvali dvije akcije koje ti objekti mogu izvršiti.
Kao što vidite, OOP nam omogućava rad s entitetima iz stvarnog svijeta u našem kodu. Istovremeno nam olakšava rad jer pomoću OOP možemo isti kod koristiti više puta, čime izbjegavamo dupliciranje.
OOP u složenijem primjeru
Napravit ćemo još jedan primjer OOP-a u Javi, ali ovog puta nešto složeniji. Kreirat ćemo bankovnu aplikaciju koja sadrži popis klijenata banke, njihovih računa i ostvarenih transakcija.
public class Customer {
private String name;
private double accountBalance;
public Customer(String name, double accountBalance) {
this.name = name;
this.accountBalance = accountBalance;
}
public void deposit(double amount) {
System.out.println("Customer " + name + ", your balance is €" + accountBalance);
accountBalance += amount;
System.out.println("You deposited €" + amount + ". New balance is €" + accountBalance);
}
public void withdraw(double amount) {
if (amount > accountBalance) {
System.out.println("Customer " + name + ", you don't have enough funds. You tried to withdraw " +
amount + ", but your current balance is €" + accountBalance);
} else {
accountBalance -= amount;
System.out.println("Customer " + name + ", you withdraw €" + amount +
". New balance is €" + accountBalance);
}
}
}Kreirali smo klasu Customer, koja sadrži osnovne podatke o klijentu banke (ime i stanje na računu). Metodama deposit() i withdraw() opisali smo što klijent može učiniti sa svojim računom. Klijent konkretno može položiti novac na račun te podići novac s njega. Ujedno je dodana jednostavna logika u slučaju da nema dovoljno novca na računu. Također je dodan konstruktor, kako bismo jednostavnije pristupali podacima iz klase Customer. Sada ćemo iskoristiti tu klasu da bismo kreirali objekte.
public class Main {
public static void main(String[] args) {
Customer ivan = new Customer("Ivan", 14.45);
Customer maja = new Customer("Maja", 228.56);
ivan.deposit(250.00);
maja.withdraw(200.00);
ivan.withdraw(80.00);
maja.deposit(1000.00);
}
}Klasa Customer nam je poslužila za kreiranje dva objekta, pri čemu svaki objekt ima ime i početno stanje na računu. Metodama deposit() i withdraw() opisali smo što objekti mogu raditi. Rezultat pozivanja metoda deposit() i withdraw() je sljedeći:
Customer Ivan, your balance is €14.45
You deposited €250.0. New balance is €264.45 // ovaj i prethodni red su rezultat deposit metode za Ivana
Customer Maja, you withdraw €200.0. New balance is €28.56 // ovo je rezultat metode withdraw za Maju
Customer Ivan, you withdraw €80.0. New balance is €184.45 // ovo je rezultat metode withdraw za Ivana
Customer Maja, your balance is €28.56
You deposited €1000.0. New balance is €1028.56 // ovaj i prethodni red su rezultat deposit metode za MajuKljučni koncepti OOP-a
Objektno orijentirano programiranje je znatno širi pojam od primjera koji su ovdje navedeni. Da bismo shvatili svrhu i mogućnosti OOP paradigme važno je znati četiri ključna koncepta OOP-a, a to su
- Inheritance (nasljeđivanje)
- Encapsulation (enkapsulacija)
- Polymorphism (polimorfizam)
- Abstraction (apstrakcija)
Za svaki od ova četiri koncepta slijedi vlastiti tutorijal, kako bismo lakše svladali najbitniji dio programiranja u Javi.