পাঠ ২: সিনট্যাক্স

  • প্যাকেজ ডিক্লেয়ারেশান
  • ইম্পোর্ট
  • ক্লাস
  • ফিল্ডস
  • মেথডস
  • কন্সট্রাকটরস
  • কমেন্টস

এই চ্যাপ্টারে আমি একটি জাভা প্রোগ্রাম এর মৌলিক কিছু ওভারভিউ দেয়ার চেষ্টা করবো। তবে শুরুতে সুবিধার্থে আমাদের কিছু টার্মস সম্পর্কে জেনে নেওয়া জরুরি।

অবজেক্ট

যেহেতু জাভা একটি অবজেক্ট ওরিয়েন্টেড ল্যাংগুয়েজ, সুতরাং শুরুতে জানতে হবে অবজেক্ট কি। অবজেক্ট এর মানে আমারা যা জানি, সেটা হচ্ছে আমাদের জড়জগতের কোন বস্তু, যাকে ঠিক স্পর্শ করা যায়। তবে যেহেতু আমরা কল্পনা করতে পারি, আমরা অনেক কিছু ধরে নিতে পারি, মনে করুন - একটি বাইসাইকেল। বাইসাইকেল বলতেই আমদের মাথায় একটি চিত্র চলে আসে। আমরা এর বৈশিষ্টগুলো জানি, যেমন এটির দুইটি চাকা থাকে, একটি বসার সিট থাকে, এর ব্রেক আছে। তারপর এও জানি যে এটি কি করে, অর্থাৎ সাইকেল এর কাজ গুলোও আমরা জানি- যেমন এটি চলে। দেখা যাচ্ছে যে আমরা একটি বাইসাইকেল এর অবস্থা ও আচরণ সম্পর্কে জানি। এই অবস্থা ও আচরণ গুলো নিয়েই বাইসাইকেল একটি অবজেক্ট।

আমরা যদি আমাদের কল্পনাটুকু আরেকটু বাড়িয়ে নিয়ে বলি, সাইকেল হচ্ছে একটি সফটওয়্যার কম্পোনেন্ট যা কিনা কম্পিউটারে চলে, আমার মনে হয় কারো আপত্তি থাকার কথা নয়।

যেহেতু আমারা প্রোগ্রামিং নিয়ে আলোচনা করছি, সুতরাং এভাবে বলি, আমরা যদি একটা প্রোগ্রাম লিখি, সেই প্রোগ্রামের ছোট্ট একটি অংশ যার আমাদের এই বাইসাইকেল এর মতো বৈশিষ্ট্য থাকে, এবং একটি কিছু কাজ সম্পাদন করতে পারে, তাহলে সেই ছোট্ট অংশটিকে অবজেক্ট বলতে পারি।

ক্লাস

মনে করি আমরা একটা বাড়ি বানাতে চাই। প্রথমে আমরা চিন্তা করি বাড়িটা আসলে কিভাবে বানাবো। আমরা জায়গা নির্বাচন করি। তারপর চিন্তা করি বাড়িটি কত-তলা হবে, কয়টা এপার্টমেন্ট হবে, এপার্টমেন্ট গুলো কত স্কয়ারফিটের হবে। তারপর চিন্তা করি, একটা এপার্টমেন্ট এ কয়টি রুম হবে, ড্রয়িং রুমের দৈর্ঘ্য কত হবে, কয়টা বাথ থাকবে, বেলকনি কোথায় থাকবে, রান্না ঘর কোথায় হবে ইত্যাদি ইত্যাদি। আচ্ছা এগুলো ঠিক হয়ে গেল, এখন আমরা চিন্তা করবো আরও জটিল কাজ নিয়ে। ওয়্যারিং নিয়ে, প্রত্যেক রুমে কয়টা পয়েন্ট থাকবে, পানির লাইন কিভাবে নেব। তারপরে বাথরুমে কি ধরণের টাইল ব্যবহার করবো, ফ্লোরে কোন গুলো।

অর্থাৎ বাড়িটি বানানোর আগেই আমরা সব কিছু নির্ধারণ করে ফেলছি এবং আমরা এই বিষয়গুলো সব লিপিবদ্ধ করে রাখি। তারপর এই লিপিবদ্ধ লেখাগুলোকে নানাভাবে পরীক্ষা করে ক্রস চেক করে চূড়ান্ত করি। এর একটি গলাভরা নাম আছে, সেটা হচ্ছে- blueprint.

আমাদের এক্ষেত্র বাড়টি হচ্ছে অবজেক্ট। এই অবজেক্ট বানানোর আগে আমাদের blueprint এর দরকার হয়। আর এই blueprint কেই আমরা বলি ক্লাস।

আমরা তাহলে এখন অবজেক্ট এবং ক্লাস এর ধারণা জানি। এবার তাহলে আমাদের মূল বিষয় সিনট্যক্স নিয়ে কথা বলি-

আমরা যারা সি কিংবা অন্য কোন প্রোগ্রামিং ল্যাংগুয়েজ আগে থেকেই জানি, একটি প্রোগ্রামে দুটি জিনিস অবশ্যই কমন থাকে - সেগুলো হলো - ফাংশান এবং ডেটা ।

একটি জাভা প্রোগ্রাম লিখতে হলে আমাদেরকে অবশ্যএই একটি ফাইল তৈরি করতে হবে যার এক্সটেনশন হবে .java. উদাহরণসরূপ- HelloWorld.java এবার আমরা লক্ষ্য করি একটি জাভা প্রোগ্রামে কি কি থাকে-

  • প্যাকেজ ডিক্লারেশন
  • ইম্পোর্ট স্টেটমেন্টস
  • টাইপ ডিক্লারেশন
    • ফিল্ডস
    • মেথডস

উপরের নামগুলো নিয়ে দ্বন্দ্ব লাগলে সমস্যা নেই, এক্ষণি সেগুলো নিয়ে আলোচনা করছি, তবে তার আগে একটি জাভা প্রোগ্রাম দেখে নিই।

    package bd.com.howtocode.java.tutotorial.syntax;

    import java.util.HashMap;

    public class HelloWorld {
        protected final String hello = "value";

        public static void main(String[] args) {
        }
    }

এই কোডটির শুরুতেই আছে প্যাকেজ ডিক্লারেশন। আমরা আমাদের কম্পিউটারে নানা ধরণের ফাইল বিভিন্ন ফোল্ডারে সাজিয়ে রাখি। যেমন- মুভি ফোল্ডারে হয়তো আমরা শুধুই মুভি রাখি, সেখানে অন্য ফাইল রাখি না। আবার মুভি ফোল্ডারে এর মধ্যে আরো সাব-ফোল্ডার তৈরি করি আরো আলাদা করার জন্যে, যেমন – বাংলা মুভি, ইংরেজি মুভি ইত্যাদি। জাভাতে প্যাকেজ বলতে এই ধারণটিই বুঝায়। একটি জাভা প্রোগ্রামিং ভাষায় লেখা সফ্টওয়্যার এ শত শত বা হাজার হাজার পৃথক ক্লাস থাকতে পারে। এজন্যে প্যাকেজ ডিক্লারেশন এর মাধ্যমে আমরা একি রকম ক্লাস গুলো একটি প্যাকেজের মধ্যে আলাদা করে রাখি।

উদাহরণসরূপ এখানে প্যাকেজ স্ট্রাকচার এর একটি স্ক্রিনশট দেওয়া হল-

package declamation

প্যাকেজ নাম গুলােকে লোয়ার কেস অক্ষরে-এ লিখতে হয়।

কোম্পানি গুলো তাদের ইন্টারনেট ডোমেইন নেইম কে উল্টো করে তাদের প্যাকেজের নাম লিখে। যেমন - example.com এর একটি প্রোগ্রামার একটি প্যাকেজের নাম লিখবে এইভাবে- com.example.package.

আমাদের ক্ষেত্রে-

package bd.com.howtocode.java.tutotorial.syntax;

তারপর আমাদের প্রোগ্রামের দ্বিতীয় লাইনটি হলো - ইম্পোর্ট স্টেটমেন্টস। অন্য কোন প্যাকেজের ক্লাস যদি আমাদের প্রোগ্রামে দরকার হয় তাহলে আমারা সেটিকে এভাবে ইম্পোর্ট করতে পারি। এটি সি প্রোগ্রামিং এর ইনক্লুড স্টেটমেন্টস এর মতো।

import java.util.HashMap;

এর পরের লাইনটি হলো টাইপ ডিক্লারেশন। জাভাতে একটি টাইপ একটা ক্লাস অথবা ইন্টারফেইস অথবা এনাম হতে পারে(ইন্টারফেইস এবং এনাম নিয়ে পরে আলোচনা করা হবে)। ক্লাস ক্ষেত্রে শুরুতে class কিওয়ার্ড লিখেতে হয় তারপর কার্লি ব্রেস { শুরু এবং শেষ } করতে হয়। আমাদের পরবর্তি প্রতিটা লাইন কোড এই কার্লি ব্রেস { } এর ভেতরে লিখতে হবে।

public class HelloWorld { }

এখানে অতিরিক্ত একটি public কিওয়ার্ড দেখা যাচ্ছে। এই মুহুর্তে শুধু মনে রাখুন ক্লাস এর শুরুতে এটি লিখতে হয়। পরে এটি নিয়ে আলোচনা করা হবে।

এর পরেই আমরা যা দেখছি তাকে বলা হয় ফিল্ড ডিক্লারেশন। অর্থাৎ আমরা যে বিভিন্ন রকম ভ্যারিয়বল ডিক্ল্যার করি, সেগুলো।

    protected final String hello = "value";

এবং এর পরেই থাকে মেথড। সি কিংবা অন্যান্য প্রোগ্রামিং ল্যাংগুয়েজ এ যাকে আমরা ফাংশন কিংবা সাবরুটিন বলে থাকে, এখানে আমরা সেগুলোকে মেথড বলি।

এক্ষেত্রে আমাদের মেথড হচ্ছে -

public static void main(String[] args) {
}

এটি হচ্ছে মেইন মেথড। জাভা প্রোগ্রামকে রান করতে হলে অবশ্যই কোন ক্লাসে একটি মেইন মেথড থাকতে হবে। এবার আমরা কিছু জিনিস প্রিন্ট করার চেষ্টা করি-

জাভাতে কনসলে কিছু প্রিন্ট করার জন্যে System.out.println() অথবা System.out.print() ব্যবহার করা হয়।

আমরা যদি নিচের প্রোগ্রমটি রান করি-

        package bd.com.howtocode.java.tutotorial.syntax;

        public class HelloWorld {
            public static void main(String[] args) {
                System.out.println("Hello, world!"); // Advance the cursor to the beginning of next line after printing
                System.out.println();                // Print a empty line
                System.out.print("Hello, world!");   // Cursor stayed after the printed string
                System.out.println("Hello,");
                System.out.print(" ");               // Print a space
                System.out.print("world!");
                System.out.println("Hello, world!");
            }
        }

তাহলে কনসলে নিচের লাইন গুলো প্রিন্ট হবে-

Hello, world!

Hello, world!Hello,
 world!Hello, world!

আমরা ইতিমধ্যে জানি ক্লাস কি- তাহলে এবার একটি ক্লাস লিখে ফেলা যাক-

    package bd.com.howtocode.java.tutotorial.syntax;

    /**
     * @author Bazlur Rahman Rokon
     * @since 9/20/14.
     */
    public class Bicycle {
        int cadence = 0;
        int speed = 0;
        int gear = 1;

        void changeCadence(int newValue) {
            cadence = newValue;
        }

        void changeGear(int newValue) {
            gear = newValue;
        }

        void speedUp(int increment) {
            speed = speed + increment;
        }

        void applyBrakes(int decrement) {
            speed = speed - decrement;
        }

        void printStates() {
            System.out.println("cadence:" +
                    cadence + " speed:" +
                    speed + " gear:" + gear);
        }
    }

আমরা ক্লাস এবং অবজেক্ট কি জানি, কিন্তু কিভাবে ক্লাস থেকে অবজেক্ট তৈরি করতে হয় সেটি এবার দেখা যাক-

    package bd.com.howtocode.java.tutotorial.syntax;

    /**
     * @author Bazlur Rahman Rokon
     * @since 9/20/14.
     */

    public class BicycleDemo {
        public static void main(String[] args) {
            // Create two different
            // Bicycle objects

            Bicycle bike1 = new Bicycle();
            Bicycle bike2 = new Bicycle();

            // Invoke methods on
            // those objects
            bike1.changeCadence(50);
            bike1.speedUp(10);
            bike1.changeGear(2);
            bike1.printStates();

            bike2.changeCadence(50);
            bike2.speedUp(10);
            bike2.changeGear(2);
            bike2.changeCadence(40);
            bike2.speedUp(10);
            bike2.changeGear(3);
            bike2.printStates();
        }
    }

আমরা জানি যে জাভা প্রোগ্রাম চালু করতে হলে একটি মেইন মেথড দরকার হয়। উপরের প্রোগ্রামটিতে একটি মেইন মেথড আছে। এবং এর ভেতরে শুরুতে আমরা দুইটি অবজেক্ট তৈরি করেছি।

 Bicycle bike1 = new Bicycle();
 Bicycle bike2 = new Bicycle();

জাভাতে অবজক্ট তৈরি করা খুব সহজ। এর জন্যে আমাদের তিনটি স্টেপ দরকার হয়-

  • ডিক্লারেশন
  • ইনসটেনশিয়েশান
  • ইনিশিয়ালাইজেশান

Bicycle bike1 = new Bicycle(); ‌‌‌‌‌‌

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

এখানে ডিক্লারেশন টাইপ ডিক্লারেশন এর মতোই। ভ্যারিয়বল চ্যাপ্টারে আমরা আরো ডিটেইলস দেখবো।

তারপর অবজেক্টটি ধরে ডট অপারেটর ব্যবহার করে সেই ক্লাসের মেথড গুলো কল করা হয়ছে। ‌‌‌ এই প্রোগ্রামটি রান করলে আউটপুট আসবে-

cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3 

কনস্ট্রাকটর

কনস্ট্রাকটর অন্যান্য মেথড বা ফাংশনের মতই একটি মেথড বা ফাংশনে। তবে এটির কোন রিটার্ন টাইপ নেই। একটি ক্লাসকে একটি অবজেক্ট-এ তৈরি করতে যে প্রয়োজনীয় কাজ গুলো করতে হয়, কনস্ট্রাকটর সেই কাজ গুলো করে থাকে। তবে মজার ব্যপার হচ্ছে সেই প্রয়োজনীয় কাজ গুলো জন্যে আমাদের কোড লিখতে হয় না।

আমাদের উপরের ক্লাসটিতে আমরা কোন কনস্ট্রাকটর লিখি নি। তাহলে এর অবজেক্ট তৈরি হলো কিভাবে? উত্তরটি হচ্ছে আমরা যদি কোন কনস্ট্রাকটর না লিখি তাহলে জাভা কম্পাইলার নিজে থেকেই একটি কনস্ট্রাকটর লিখে কম্পাইল করে, যাকে আমরা বলি ডিফল্ট কনস্ট্রাকটর। তবে আমরা চাইলে নিজের একটি লিখতে পারি।

  public class Bicycle {
      int cadence = 0;
      int speed = 0;
      int gear = 1;

      public Bicycle() {
      }
  }

এবার আমরা দেখবো কিভাবে জাভাতে কমেন্ট লিখতে হয়-

জাভা তিন ধরণের কমেন্ট সাপোর্ট করে-

    Comment                                                        |  Description
        /* text */                                                        |   জাভা কম্পাইলার /* থেকে */ পর্যন্ত সব কিছু উপেক্ষা করে যাবে  
    // text                                                                |  জাভা কম্পাইলার //   থেকে লাইনের শেষ পর্যন্ত উপেক্ষা করে যাবে  
        /** documentation */                           | এটি হচ্ছে ডকুমেন্টাশান কমে্নট । একে  doc comment বলা হয়। 

উদাহরণ-


    package bd.com.howtocode.java.tutotorial.syntax;

    /**
     * The HelloWorld program implements an application that
     * simply displays "Hello World!" to the standard output.
     *
     * @author Bazlur Rahman Rokon
     * @since 9/20/14.
     */
    public class HelloWorld {
        public static void main(String[] args) {
            // Prints Hello, World! on standard output.
            System.out.println("Hello, world!");

            /*
            for (int i = 0; i < 100; i++) {
                System.out.println(i);
            }*/
        }
    }

আরও কিছু নিয়ম:

  • জাভাতে প্রত্যেকটি স্টেটমেন্ট এর পর সেমিকোলন (;) দিয়ে স্টেটমেন্ট শেষ করতে হয়।
  • জাভা একটি কেইস সেনসিটিভ ল্যাংগুয়েজ- অর্থাৎ hello এবং Hello দুটি আলাদা শব্দ ।

অনুশীলন:

নিচের প্যাটার্নগুলো প্রিন্ট করতে চেষ্টা করুন -

* * * * *          * * * * *    * * * * *
* * * * *        *       *     *     *
* * * * *          *       *      *   * 
* * * * *         *       *       * *
* * * * *          * * * * *        *
   (a)            (b)          (c)