Š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 Maju
Ključ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.