জাভা (Java) বিশ্বের অন্যতম জনপ্রিয়, শক্তিশালী এবং বহুল ব্যবহৃত একটি প্রোগ্রামিং ভাষা। এটি ১৯৯৫ সালে সান মাইক্রোসিস্টেম (Sun Microsystems) দ্বারা তৈরি করা হয়, যা বর্তমানে ওরাকল (Oracle) এর মালিকানাধীন। জাভার মূলমন্ত্র হলো "Write Once, Run Anywhere" (WORA) অর্থাৎ একবার কোড লিখুন, আর যেকোনো প্ল্যাটফর্মে রান করুন।

এই গাইডে আমরা জাভার প্রাথমিক বিষয়গুলো থেকে শুরু করে এর গভীরে প্রবেশ করব।

১. জেডিকে (JDK), জেইআরই (JRE) এবং জেভিএম (JVM) এর ধারণা

জাভাতে কোড লেখা থেকে শুরু করে তা এক্সিকিউট করা পর্যন্ত এই তিনটি উপাদান অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে।

JVM (Java Virtual Machine)

JVM হলো একটি ভার্চুয়াল মেশিন যা জাভা বাইটকোড (Bytecode) এক্সিকিউট করে। যখন আমরা জাভা কোড কম্পাইল করি, তখন তা সরাসরি মেশিন কোডে রূপান্তরিত না হয়ে বাইটকোডে পরিণত হয়। এরপর এই বাইটকোডকে JVM অপারেটিং সিস্টেমের বোধগম্য মেশিন কোডে রূপান্তর করে রান করে। প্রতিটি অপারেটিং সিস্টেমের (Windows, Linux, macOS) জন্য আলাদা আলাদা JVM থাকে, কিন্তু তারা সবাই একই বাইটকোড রান করতে পারে। আর এ কারণেই জাভাকে প্ল্যাটফর্ম ইন্ডিপেন্ডেন্ট বলা হয়।

JRE (Java Runtime Environment)

JRE হলো জাভা প্রোগ্রাম রান করার পরিবেশ বা এনভায়রনমেন্ট। এটি JVM এবং জাভা কোর ক্লাস লাইব্রেরির (Core Class Libraries) একটি সমন্বয়। সহজ কথায়, আপনি যদি শুধু কোনো জাভা প্রোগ্রাম চালাতে চান (তৈরি করতে না চান), তবে আপনার কম্পিউটারে কেবল JRE থাকলেই চলবে। JRE এর ভেতরেই JVM থাকে।

JDK (Java Development Kit)

JDK হলো জাভা ডেভেলপমেন্ট কিট, যা দিয়ে জাভা প্রোগ্রাম লেখা এবং ডেভেলপ করা হয়। আপনি যদি একজন জাভা ডেভেলপার হতে চান, তবে আপনাকে JDK ইন্সটল করতে হবে। JDK-র ভেতরে JRE থাকে, এবং এর সাথে আরও কিছু ডেভেলপমেন্ট টুলস (যেমন: কম্পাইলার javac, ডিবাগার ইত্যাদি) যুক্ত থাকে।

সংক্ষেপে সম্পর্কটা হলো: JDK = JRE + Development Tools এবং JRE = JVM + Library Classes

২. বেসিক সিনট্যাক্স (Basic Syntax)

২.১ হ্যালো ওয়ার্ল্ড (Hello World)

জাভাতে প্রতিটি কোডই কোনো না কোনো ক্লাসের ভেতরে থাকতে হয়। নিচে একটি সাধারণ হ্যালো ওয়ার্ল্ড প্রোগ্রামের উদাহরণ দেওয়া হলো:

public class Main {
    public static void main(String[] args) {
        // এটি কনসোলে মেসেজ প্রিন্ট করে
        System.out.println("Hello, World!");
    }
}

এখানে main মেথড হলো জাভা প্রোগ্রামের এন্ট্রি পয়েন্ট, যেখান থেকে প্রোগ্রামের এক্সিকিউশন শুরু হয়।

২.২ ভেরিয়েবলস ও ডেটা টাইপ (Variables & Data Types)

জাভা একটি স্ট্রংলি টাইপড (Strongly Typed) ল্যাঙ্গুয়েজ। এর মানে হলো ভেরিয়েবল ডিক্লেয়ার করার সময় তার ডেটা টাইপ বলে দিতে হয়।

int myNum = 100;               // ইন্টিজার (পূর্ণসংখ্যা)
float myFloatNum = 5.99f;      // ফ্লোটিং পয়েন্ট (দশমিক সংখ্যা)
double myDoubleNum = 19.99d;   // ডাবল (বেশি প্রিসিশন যুক্ত দশমিক সংখ্যা)
char myLetter = 'D';           // ক্যারেক্টার (একটি অক্ষর)
boolean myBool = true;         // বুলিয়ান (সঠিক বা ভুল)
String myText = "Hello Java";  // স্ট্রিং (টেক্সট বা বাক্য)

৩. অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্ট

জাভা মূলত একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) ভাষা। এর মানে হলো, জাভাতে সবকিছুই অবজেক্ট (Object) এবং ক্লাস (Class) হিসেবে চিন্তা করা হয়। ওওপি (OOP)-র প্রধান চারটি স্তম্ভ হলো: এনক্যাপসুলেশন, ইনহেরিট্যান্স, পলিমরফিজম এবং অ্যাবস্ট্রাকশন।

৩.১ ক্লাস ও অবজেক্ট (Class & Object)

ক্লাস হলো একটি ব্লু-প্রিন্ট বা নকশা, আর অবজেক্ট হলো সেই নকশা থেকে তৈরি বাস্তব কোনো জিনিস।

class Car {
    String brand;
    int speed;

    void drive() {
        System.out.println(brand + " গাড়িটি চলছে " + speed + " কিমি/ঘণ্টা বেগে।");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car(); // myCar হলো Car ক্লাসের একটি অবজেক্ট
        myCar.brand = "Toyota";
        myCar.speed = 120;
        myCar.drive();
    }
}

৩.২ এনক্যাপসুলেশন (Encapsulation)

এনক্যাপসুলেশন মানে হলো ডেটা (ভেরিয়েবল) এবং মেথডগুলোকে একসাথে একটি ইউনিটে (যেমন ক্লাস) আবদ্ধ করে রাখা এবং ক্লাসের ভেতরের ডেটাকে বাইরের সরাসরি অ্যাক্সেস থেকে লুকিয়ে রাখা (Data Hiding)। এর জন্য সাধারণত ভেরিয়েবলগুলোকে private করা হয় এবং এগুলোর মান সেট বা পাওয়ার জন্য gettersetter মেথড ব্যবহার করা হয়।

class Person {
    private String name; // private ভেরিয়েবল

    // Setter মেথড
    public void setName(String name) {
        this.name = name;
    }

    // Getter মেথড
    public String getName() {
        return name;
    }
}

৩.৩ ইনহেরিট্যান্স (Inheritance)

ইনহেরিট্যান্স মানে হলো উত্তরাধিকার। যখন একটি ক্লাস অন্য একটি ক্লাসের প্রোপার্টি (ভেরিয়েবল ও মেথড) উত্তরাধিকার সূত্রে গ্রহণ করে, তাকে ইনহেরিট্যান্স বলে। যে ক্লাস প্রোপার্টি দেয় তাকে 'সুপার ক্লাস' বা 'প্যারেন্ট ক্লাস' এবং যে গ্রহণ করে তাকে 'সাব ক্লাস' বা 'চাইল্ড ক্লাস' বলে। এটি কোড রিইউজেবিলিটি (Code Reusability) বাড়ায়। ইনহেরিট করার জন্য extends কি-ওয়ার্ড ব্যবহার করা হয়।

// Parent Class
class Animal {
    void eat() {
        System.out.println("এই প্রাণীটি খাচ্ছে...");
    }
}

// Child Class
class Dog extends Animal {
    void bark() {
        System.out.println("কুকুরটি ঘেউ ঘেউ করছে...");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat();  // Animal ক্লাস থেকে পেয়েছে
        myDog.bark(); // নিজস্ব মেথড
    }
}

৩.৪ পলিমরফিজম (Polymorphism)

পলিমরফিজম শব্দটির অর্থ 'বহুরূপিতা'। এটি এমন একটি কনসেপ্ট যেখানে একই কাজ বিভিন্ন উপায়ে করা যায়। জাভাতে পলিমরফিজম প্রধানত দুই প্রকার: মেথড ওভারলোডিং (Compile-time Polymorphism) এবং মেথড ওভাররাইডিং (Runtime Polymorphism)।

মেথড ওভারলোডিং: একই ক্লাসে একই নামের একাধিক মেথড থাকতে পারে, যদি তাদের প্যারামিটার আলাদা হয়।

class MathUtils {
    int add(int a, int b) {
        return a + b;
    }
    double add(double a, double b) {
        return a + b;
    }
}

মেথড ওভাররাইডিং: প্যারেন্ট ক্লাসের কোনো মেথডকে চাইল্ড ক্লাসে নতুন করে ডিফাইন করা।

class Animal {
    void sound() {
        System.out.println("প্রাণী শব্দ করে");
    }
}
class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("বিড়াল মিউ মিউ করে");
    }
}

৩.৫ অ্যাবস্ট্রাকশন (Abstraction)

অ্যাবস্ট্রাকশন মানে হলো অপ্রয়োজনীয় ডিটেইলস লুকিয়ে রাখা এবং শুধুমাত্র ব্যবহারকারীর জন্য প্রয়োজনীয় অংশটুকু প্রদর্শন করা। জাভাতে এটি abstract ক্লাস এবং interface এর মাধ্যমে অর্জন করা যায়।

abstract class Shape {
    abstract void draw(); // এর কোনো বডি বা ইমপ্লিমেন্টেশন নেই
}

class Circle extends Shape {
    void draw() {
        System.out.println("একটি বৃত্ত আঁকা হচ্ছে...");
    }
}

৪. ইন্টারফেস (Interfaces)

ইন্টারফেস অনেকটা অ্যাবস্ট্রাক্ট ক্লাসের মতোই, তবে এটি সম্পূর্ণভাবে অ্যাবস্ট্রাক্ট। ইন্টারফেসে শুধুমাত্র মেথড সিগনেচার থাকে (Java 8 এর আগে), কোনো মেথড বডি থাকে না। একটি ক্লাস ইন্টারফেসকে ইমপ্লিমেন্ট (implement) করার জন্য implements কি-ওয়ার্ড ব্যবহার করে এবং ইন্টারফেসের সকল মেথডকে ওভাররাইড করতে বাধ্য থাকে। ইন্টারফেস ব্যবহার করে জাভাতে মাল্টিপল ইনহেরিট্যান্স এর কাজ করা যায়।

interface Animal {
    void animalSound();
    void sleep();
}

class Pig implements Animal {
    public void animalSound() {
        System.out.println("শূকর শব্দ করে: উই উই");
    }
    public void sleep() {
        System.out.println("Zzz");
    }
}

৫. এক্সেপশন হ্যান্ডেলিং (Exception Handling)

প্রোগ্রাম চলাকালীন কোনো অনাকাঙ্ক্ষিত এরর বা ত্রুটি ঘটলে প্রোগ্রাম যাতে ক্র্যাশ না করে, সেজন্য এক্সেপশন হ্যান্ডেলিং ব্যবহার করা হয়। জাভাতে মূলত try, catch, finally, throw, এবং throws কিওয়ার্ডগুলো দিয়ে এই কাজ করা হয়।

  • try: যে কোডে ত্রুটি হওয়ার সম্ভাবনা আছে তা try ব্লকে রাখা হয়।
  • catch: try ব্লকে ত্রুটি ধরা পড়লে তা কীভাবে সমাধান বা প্রদর্শন করা হবে, তা catch ব্লকে থাকে।
  • finally: এই ব্লকটি সবসময় এক্সিকিউট হবে, তা ত্রুটি ঘটুক বা না ঘটুক।
public class Main {
    public static void main(String[] args) {
        try {
            int[] myNumbers = {1, 2, 3};
            System.out.println(myNumbers[10]); // এটি একটি এরর তৈরি করবে
        } catch (Exception e) {
            System.out.println("কিছু একটা সমস্যা হয়েছে! এরর: " + e.getMessage());
        } finally {
            System.out.println("Try-Catch ব্লক শেষ হয়েছে।");
        }
    }
}

৬. কালেকশনস ফ্রেমওয়ার্ক (Collections Framework)

জাভা কালেকশনস ফ্রেমওয়ার্ক হলো ডেটা সংরক্ষণ এবং ম্যানিপুলেট করার জন্য ক্লাস এবং ইন্টারফেসের একটি আর্কিটেকচার। এটি সার্চিং, সর্টিং, ইনসার্শন, ডিলিশন ইত্যাদি অপারেশন সহজে করতে সাহায্য করে।

এর প্রধান তিনটি ইন্টারফেস হলো: List, Set এবং Map।

৬.১ List (লিস্ট)

List হলো একটি অর্ডারড কালেকশন, যেখানে ডুপ্লিকেট ভ্যালু রাখা যায়। সবচেয়ে জনপ্রিয় ইমপ্লিমেন্টেশন হলো ArrayList এবং LinkedList

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> cars = new ArrayList<String>();
        cars.add("Volvo");
        cars.add("BMW");
        cars.add("Ford");
        cars.add("BMW"); // ডুপ্লিকেট অনুমোদিত
        
        System.out.println(cars);
    }
}

৬.২ Set (সেট)

Set হলো এমন একটি কালেকশন যেখানে কোনো ডুপ্লিকেট ভ্যালু থাকতে পারে না। সাধারণত HashSet বা TreeSet ব্যবহার করা হয়।

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> cars = new HashSet<String>();
        cars.add("Volvo");
        cars.add("BMW");
        cars.add("BMW"); // এটি যুক্ত হবে না, কারণ ডুপ্লিকেট অনুমোদিত নয়
        
        System.out.println(cars);
    }
}

৬.৩ Map (ম্যাপ)

Map ডেটা সংরক্ষণ করে Key-Value পেয়ার (জোড়া) হিসেবে। এখানে প্রতিটি Key ইউনিক হতে হয়, তবে Value ডুপ্লিকেট হতে পারে। এর জনপ্রিয় ইমপ্লিমেন্টেশন হলো HashMap

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, String> capitalCities = new HashMap<String, String>();
        
        // Key এবং Value যুক্ত করা
        capitalCities.put("England", "London");
        capitalCities.put("Germany", "Berlin");
        capitalCities.put("Bangladesh", "Dhaka");
        
        System.out.println(capitalCities.get("Bangladesh")); // আউটপুট: Dhaka
    }
}

উপসংহার

জাভা অত্যন্ত শক্তিশালী এবং বিশাল একটি ল্যাঙ্গুয়েজ। উপরোক্ত বিষয়গুলো জাভার প্রধান ভিত্তি। একজন দক্ষ জাভা ডেভেলপার হতে হলে OOP কনসেপ্ট, কালেকশন ফ্রেমওয়ার্ক এবং মেমোরি ম্যানেজমেন্ট (JVM) সম্পর্কে পরিষ্কার ধারণা থাকা অপরিহার্য। এই গাইডটি অনুসরণ করে আপনি আপনার জাভা শেখার যাত্রায় একটি শক্ত ভিত্তি গড়ে তুলতে পারবেন।