# SE1EP1 - Java Fundamentals

# References

# Introduction

# - Mengenal Java dan Fungsinya

Apa itu Java?
Java merupakan bahasa pemrograman yang digunakan secara luas untuk pengodean aplikasi web. Bahasa ini telah menjadi pilihan populer di antara developer selama lebih dari dua dekade, dengan jutaan aplikasi Java yang digunakan saat ini. Java merupakan bahasa multiplatform yang berorientasi pada objek dan berpusat pada jaringan yang dapat digunakan sebagai platform di dalamnya. Java merupakan bahasa pemrograman yang cepat, aman, dan andal untuk mengodekan segala sesuatu mulai dari aplikasi seluler dan perangkat lunak korporasi hingga aplikasi big data dan teknologi sisi server.

Apa saja fungsi Java?
Karena merupakan bahasa yang gratis dan serbaguna, Java membangun perangkat lunak yang dilokalkan dan terdistribusi. Beberapa penggunaan Java yang umum di antaranya adalah:

  1. Pengembangan Game
    Banyak game seluler, komputer, dan video populer dibangun di Java. Bahkan game modern yang mengintegrasikan teknologi canggih seperti machine learning atau realitas virtual (virtual reality) dibangun dengan teknologi Java.

  2. Komputasi cloud
    Java sering disebut sebagai WORA – Write Once and Run Anywhere, yang membuatnya sempurna untuk aplikasi berbasis cloud yang terdesentralisasi. Penyedia cloud memilih bahasa Java untuk menjalankan program di berbagai platform yang mendasari.

  3. Big Data
    Java digunakan untuk mesin pemrosesan data yang dapat bekerja dengan set data yang kompleks dan data waktu nyata yang berjumlah besar.

  4. Kecerdasan Buatan
    Java merupakan pembangkit (powerhouse) bagi pustaka machine learning. Stabilitas dan kecepatan membuatnya sempurna untuk pengembangan aplikasi kecerdasan buatan, seperti pemrosesan bahasa alami dan deep learning.

  5. Internet of Things
    Java telah digunakan untuk memprogram sensor dan perangkat keras di perangkat edge yang dapat terhubung ke internet secara mandiri.

Apakah Java dan JavaScript sama?
Meskipun keduanya mengandung kata yang sama yaitu Java, akan tetapi Java dan JavaScript adalah dua bahasa yang berbeda dan tidak ada kaitan apapun diantara keduanya. Berikut ini adalah kesamaan dan perbedaannya:

Features Java JavaScript
Tujuan Awal Cross-Platform Web Browsers
Runtime JRE JavaScript engine (V8, SpiderMonkey, JavaScriptCore, Chakra, etc)
Diciptakan Oleh James Gosling Brendan Eich
Perusahaan Pendiri Sun Microsystems Netscape Communications
Rilis Perdana 23/05/1995 04/12/1995
OOP Support
Multithreading Support
Statically Typed
Compiled Language
Runtime Required
Try Catch
Entry point Required
Synchronous
Asynchronous
Cross-Platform

# Skillset & Tech Stack

# - Hardware dan Software requirement untuk Java Programming

Untuk membuat proses pembangunan software dengan Java lebih lancar setidaknya kamu perlu memenuhi spesifikasi Hardware dan Software yang memadai.

Spesifikasi Hardware:

  • CPU: 4 Core
  • Memory: 16 GB
  • Free Disk Space: 30 GB

Software Requirement:

  • OS: Windows (7/8/10/11), Linux, Mac OS
  • OpenJDK: >= 19
  • Bash Shell

# - Skillset apa saja yang wajib dikuasai seorang Java Developer

Seorang Java Developer tentunya perlu menguasai beberapa skillset berikut:

  • Memahami logika algoritma
  • Memahami XML
  • Pemahaman OOP yang kuat
  • Mampu mendeteksi bugs dari log
  • Memahami Konsep Rest API
  • Menguasai SQL
  • Menguasai Unit Testing
  • Menguasai Framework
  • Mampu membuat dokumentasi yang jelas dan lengkap
  • Memiliki Kesabaran

# - tools apa saja yang wajib dikuasai seorang Java Developer

Ada juga tools yang akan sering kamu gunakan jika kamu menjadi seorang Java Developer, yaitu:

  • OpenJDK
  • Git
  • Bash / Unix-Like Shell
  • IDE (Eclipse / Intellij Idea)
  • HTTP Client (Postman/Thunder Client/dll)
  • Maven / Gradle
  • Docker

# Environment Setup

# - Setup IDE

Pada materi kali ini, kita akan menggunakan IDE dari Jetbrains yaitu Intellij Idea. Kamu bisa memilih Community Edition pada link berikut:

jetbrains.com/idea/download

Pilihlah sesuai dengan sistem operasi yang kamu gunakan.

# - Setup Runtime

Untuk mengkompilasi dan menjalankan program java, kamu membutuhkan compiler yang biasa dikenal dengan JDK (Java Development Kit). Kamu bisa memilih OpenJDK sebagai compiler java karena opensource.

Berikut ini link untuk installasi OpenJDK:

openjdk.org/install

Setelah proses instalasi selesai, lakukan verifikasi bahwa OpenJDK sudah terinstall dengan benar:

java -version
javac -version

# - Setup Tools

Selanjutnya ada juga beberapa tools yang perlu kamu install untuk mendukung produktifitas kamu sebagai Java Developer.

  • Git
  • HTTP Client (Postman/Thunder Client/dll)
  • Bash Terminal (untuk windows bisa menggunakan git bash)
  • Docker

# - Mengenal JVM

JVM atau singkatan dari Java Virtual Machine, bukanlah virtual machine seperti yang ada pada sebuah hypervisor. JVM bertanggung jawab untuk mengkonversi Bytecode ke mesin spesifik yang digunakan oleh JRE dan JDK. JRE (Java Runtime Environment) digunakan untuk menjalankan Java bytecode, sedangkan JDK (Java Development Kit) digunakan untuk mengkompilasi bahasa program Java ke Java Bytecode.

JVM (opens new window)

JVM juga memiliki kemampuan untuk menjalankan kode yang bukan ditulis dengan bahasa program Java dan telah dikompilasi menjadi Java Bytecode. Beberapa bahasa program yang didukung oleh JVM, diantaranya:

  • Java
  • Kotlin
  • Scala
  • Groovy
  • Clojure
  • Fantom
  • Ceylon
  • Jython
  • JRuby
  • Frege
  • Xtend
  • Golo
  • Concurnaas
  • Yeti

# Pemrograman Dasar

# - Classpath

Classpath pada Java adalah satu set kumpulan path atau lokasi dari library Java yang dibutuhkan pada sebuah project atau dikenal dengan dependencies. Seperti halnya vendor pada PHP atau node_modules pada NodeJS. Definisi classpath dapat merujuk pada kumpulan file, direktori maupun java arsip (JAR) yang masing-masing dipisahkan dengan simbol colon (😃.

Contoh definisi classpath:

CLASSPATH=.:lib:app:/opt/javalib
java MyProgram

Atau:

java -classpath .:lib:app:/opt/javalib MyProgram

# - Tipe Data

Tipe data pada Java dibagi menjadi 2 kategori, yaitu Primitive Data Type dan Object Data Type (Non-Primitive).

Berikut ini adalah beberapa Primitive Data Type pada Java:

Tipe Data Default Value Keterangan
byte 0 menampung nilai byte
short 0 menampung nilai bilangan bulat
int 0 menampung nilai bilangan bulat lebih besar dari short
long 0L menampung nilai bilangan bulat lebih besar dari int
float 0.0f menampung nilai float
double 0.0d menampung nilai double
boolean \u0000 menampung nilai boolean
char false menampung nilai karakter

Ada juga beberapa contoh Object Data Type, diantaranya:

Tipe Data Default Value Keterangan
String null menampung nilai berupa kumpulan karakter
Integer null menampung nilai integer
Float null menampung nilai float

data type (opens new window)

Berikut init contoh penggunakan beberapa tipe data pada Java. Buatlah sebuah file dengan nama App.java lalu isi dengan kode berikut:

// Filename: App.java
class App {
    public static void main(String[] args) {
        int a = 1;
        short b = 2;
        long c = 3L;
        float d = 4.0f;
        
        System.out.println(a + b + c + d);
    }
}

Kemudian jalankan perintah berikut pada terminal:

javac App.java
java App

Setelah perintah diatas dijalankan, maka akan tercipta 1 file baru dengan nama App.class, file itulah yang disebut dengan Java Bytecode yang akan dieksekusi oleh JVM melalui JRE.

# - Class

Class pada java merupakan sebuah object yang didalamnya terdapat beberapa elemen yaitu property, method, constructor dan class lain (inner class).

Setiap class hanya dapat di eksekusi dengan membuat entrypoint atau dengan melakukan import dari class lainnya yang memiliki entrypoint.

Berikut ini adalah contoh Class pada Java:

class Car {
    // Property
    float fuelLiter;

    // Property
    String name;

    // Constructor
    Car(String name) {
        // Property assignment
        this.name = name;
    }

    // Method
    void fuelRefill(float liter) {
        // Property addition assignment
        this.fuelLiter += liter;
    }

    // Method
    boolean run() {
        return true;
    }

    // Entrypoint Method
    public static void main(String[] args) throws InterruptedException {
        // Local Variable
        int kmTarget = 10;
        // Instance
        Car miniBus = new Car("minibus");

        // For Loop
        for (int km = 0; km <= kmTarget; km++) {
            // Instance Method Call
            boolean running = miniBus.run();

            // Conditional
            if (!running) {
                // Static Method Call
                System.out.println("fuel empty");

                // Break the loop
                break;
            }

            // Static Method Call
            System.out.println(km + "km");

            // Static Method Call
            Thread.sleep(1000);
        }
    }
}

# - Instance dan Static

Pada contoh sebelumnya terdapat kode miniBus.run() yang merupakan eksekusi dari method run di class Car. Method run tidak dapat di eksekusi langsung dengan kode Car.run() karena tidak bersifat static. Jadi sebelum mengeksekusi method run kamu harus membuat instance dan menampungnya ke dalam sebuah variable, contohnya: Car miniBus = new Car("minibus").

Sementara pada code System.out.println("...") tidak dibutuhkan instance karena System.out.println merupakan static method. Begitu juga dengan Thread.sleep.

Method main pada class Car bersifat static, sebetulnya kamu dapat mengeksekusinya dengan kode Car.main. Tetapi berhubung main adalah sebuah entrypoint, jadi method main sebaiknya hanya dieksekusi oleh JRE.

# - Array

Mendefinisikan Array pada java cukup sederhana, kamu cukup menambahkan [] (square brackets) setelah tipe datanya.


// Array Definition
char[] world = {'H', 'e', 'l', 'l', 'o'};

// For loop
for (char c: world) {
    System.out.print(c);
}

System.out.println(" world");

# - Error Handling

Implementasi Error handling pada java sangatlah mudah, kamu bisa menggunakan block try, catch, finaly.

block fungsi
try membungkus kode yang memiliki kemungkinan error
catch tidak akan dieksekusi kecuali terjadi error
finaly dieksekusi setelah block try atau catch selesai dieksekusi tanpa peduli bahwa terjadi error atau sukses

contoh:

for (int i = 5; i >= 0; i--) {
    System.out.println(5/i);
}

Jika kode diatas dijalankan, maka akan muncul error seperti berikut:

Exception in thread "main" java.lang.ArithmeticException: / by zero

Bungkus kode diatas dengan block try catch:

try {
    for (int i = 5; i >= 0; i--) {
        System.out.println(5/i);
    }
} catch (Exception e) {
    System.out.println("skip");
}

# - Package

Package pada java biasa digunakan untuk mengklasifikasikan kode berdasarkan fungsinya. nama package biasanya memiliki format reverse domain name dan ditulis dalam lowercase.

contoh penulisan package:

package com.example.hello;
// atau
package com.example.world;

setiap kata dipisahkan oleh titik, nantinya akan mewakili nama folder:

└── com
    └── example
        ├── hello
        └── world

Buatlah 3 file dalam satu folder yang sama, dengan nama berikut:

  • App.java
  • Hello.java
  • World.java

isi file App.java:

package com.example;

import com.example.hello.Hello;
import com.example.world.World;

class App {
    public static void main(String[] args) {
        System.out.println(Hello.sayHello() + " " + World.sayWorld());
    }
}

isi file Hello.java:

package com.example.hello;

public class Hello {
    public static String sayHello() {
        return "Hello";
    }
}

isi file World.java:

package com.example.world;

public class World {
    public static String sayWorld() {
        return "World";
    }
}

Lakukan compiling pada 3 file tersebut:

# compile java dan masukan bytecode ke dalam folder build
javac -d build *.java
# Jalankan program dengan classpath yang ada difolder build
# nama class yang akan di eksekusi harus diikuti dengan nama packagenya
java -classpath build com.example.App

# - JAR (Java Archive)

Untuk merilis aplikasi berbasis java, kamu perlu menghimpun semua bytecode dalam sebuah file yang bernama JAR atau Java Archive. JAR biasanya memiliki ekstensi .jar. Berikut ini cara membuat JAR file dari sebuah project.

cd /path/to/project
javac -d build *.java
cd build
jar cfe app.jar com.example.App $(find . -name '*.class')

Setelah perintah tersebut di eksekusi, maka file app.jar siap di distribusikan. berikut ini adalah cara menjalankan file JAR:

java -jar app.jar

Sekarang kamu sudah bisa mendistribusikan project tersebut.