জাভা প্রোগ্রামিং – ৯ – মেথড

মেথড নাকি ফাংশন, ফাংশন নাকি মেথড, মেথড নাকি মেথড, মেথড হলে কি মেথড? এফ এম মেথড নাকি কোয়ান্টাম মেথড ? জগতে মেথডের তো অভাব নাই! সৌভাগ্যবশত প্রোগ্রামিং ল্যাঙ্গুয়েজে মেথড একরকম ই। কোন ল্যাঙ্গুয়েজে তাকে ফাংশন বলে আবার কোন ল্যাঙ্গুয়েজে বলে মেথড। ঘুরে ফিরে এক জিনিস। তো দেখা যাক জাভার মেথড কেমন!

জাভাতে মেথড ডিক্লারেশন

জাভাতে মেথডের স্ট্রাকচার সিন্ট্যাক্স এমন – (অনেকটা C এর মতন, একটা অতিরিক্ত কী ওয়ার্ড লাগে যেটার ব্যাখা এই পর্যায়ের জ্ঞান দিয়ে সম্ভব না, আমাদের OOP জানতে হবে)

access_modifier scope_modifier return_type method_name(param_list) {

}

এহেম। এখানে access_modifier, scope_modifier এগুলো কি জিনিস? একটা উদাহরণ দেই । তাহলে বুঝতে পারবা। আমরা একটা মেথড বা ফাংশন লেখবো যার কাজ হ্যালো ওয়ার্ল্ড প্রিন্ট করা।

public static void greet() {
  System.out.println("Hello World");
}

এইবার জিগস পাজল মিলাও, দেখো access_modifier কোনটা, scope_modifier কোনটা। রিটার্ন টাইপ আর প্যারামিটার লিস্ট তো জানাই আছে।

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

public static int sum(int a, int b) {
  return a + b;
}

একই কাজ অন্যান্য ডেটা টাইপের জন্য ও করা যায়।

আর্গুমেন্ট হিসাবে অ্যারে পাস করা

আচ্ছা সাধারণ ভ্যারিয়েবল নাহয় পাস করালাম কিন্তু অ্যারে পাস করাবো কীভাবে? ভালো কোয়েশ্চন। দেখা যাক –

public static void takeArray(int[] ar) {
  // যা ইচ্ছে তাই
}

এসাইনমেন্ট ১

১/ একটা মেথড লেখো যেটা অ্যারে থেকে সর্বোচ্চ ইলিমেন্ট বের করে সেটা রিটার্ন করে।
২/ সেম মেথড, এবার সর্বনিম্ন বের করবে।

ফাংশন থেকে অ্যারে রিটার্ন করা

এইটা C না। ফাংশন থেকে অ্যারে রিটার্ন করতে পয়েন্টার নিয়ে দৌড়ঝাপ করার কোন প্রয়োজন না। আমরা জাস্ট কল করবো আর মেথড রিটার্ন করবে।

public static int[] returnArray(int[] ar) {
  return ar; // যা দিলাম তাই নিলাম
}

এসাইনমেন্ট ২

১/ একটা অ্যারে মেথডে পাস করাবা এবং অ্যারে এর প্রতি ইলিমেন্ট এর ভ্যালু ২ করে বাড়াবা।
২/ একই মেথড আবার লেখো । এবার রিটার্ন টাইপ void দিয়ে দেখো আউটপুট কি আসে। কেন এমন আসে? স্যাম্পল কোড:

import java.util.*;

public class JigSawArray{
  public static void main(String[] args) {
    int[] ar = {9, 10, 11};
    System.out.println("method : addTwo");
    System.out.println("ar = " + Arrays.toString(ar));

    int[] arNew = addTwo(ar);
    System.out.println("ar + 2 = " + Arrays.toString(arNew));

    System.out.println("\nmethod : whyThisHappens");

    whyThisHappens(ar);
    System.out.println("Before call : ar = " + Arrays.toString(ar));
    System.out.println("After call : ar = " + Arrays.toString(ar));
  }

  public static int[] addTwo(int[] ar) {
  // ২ করে বাড়াও

    return ar;
  }

  public static void whyThisHappens(int[] ar) {
    // ২ করে বাড়াও
  }
}

চাইলে শুধু whyThisHappens মেথড টা কল করতে পারো বাকি বাকি ফাংশনের কল ডিলিট করে দিয়ে। ভেবে দেখো কেন এমন আসে।

কখন আর্গুমেন্ট আর কখন প্যারামিটার?

প্যারামিটার হচ্ছে ফাংশন ডিক্লারেশনের পার্ট। ভেরিয়েবল। আর্গুমেন্ট হচ্ছে ফাংশন কল করার সময় যে ভ্যালু পাস করছো।

সহজ ভাষায় বললে, প্যারামিটার অ্যাবস্ট্র্যাক্ট জিনিস। আর তাকে যে ভ্যালু দেয়া হয় সেটা আর্গুমেন্ট।

পাস বাই ভ্যালু আর পাস বাই রেফারেন্স

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

জাভাতে রেফারেন্স জিনিসটাও তেমন। এখানে পয়েন্টার নাই। মেমরী অ্যাড্রেস সরাসরি দেখার ও উপায় নেই। কিন্তু এখানে রেফারেন্স আছে। তোমাকে সরাসরি অ্যাক্সেস দিবে না বটে কিন্তু ভ্যারিয়েবল মডিফাই করার জন্য রেফারেন্স দিবে। জাভাতে ভ্যারিয়েবল এজন্য ২ ধরণের হয়। রেফারেন্স টাইপ(Array, class object, String) আর প্রিমিটিভ টাইপ(int, float, double, long, boolean ইত্যাদি ইত্যাদি)

এসাইনমেন্ট ২ এর কঠিন প্রশ্নটার উত্তর যদি এখনো না পেয়ে থাকো তাহলে এতক্ষণে পেয়ে যাওার কথা। অ্যারে রেফারেন্স টাইপ। তুমি ২ যোগ করার পরে রিটার্ন দাও বা না দাও, রেফারেন্স পেয়ে মেথড সেটা ঠিকই আপডেট করে দিয়েছে। (পয়েন্টার সরাসরি নাই কিন্তু তার সুবিধা গুলো আছে)

অ্যারে কেন রেফারেন্স টাইপ?

সাধারণ ভ্যারিয়েবল ডিক্লেয়ার করতে কি মেমরী অ্যালোকেট করা লাগে? জেভিম মেমরিতে র‍্যান্ডম যেকোন এক জায়গায় ভেরিয়েবল এর ভ্যালু বসিয়ে দিতে পারে। অ্যারে এর জন্য কি র‍্যান্ডমলি করা সম্ভব? না। অ্যারে এর জন্য অ্যালোকেট করা লাগে এবং সেটা র‍্যান্ডম একগাদা মেমরী অ্যাড্রেসে থাকে না।

চিট শিট new দিয়ে যা কিছু করবা সব রেফারেন্স টাইপ। কারণ এদের জন্য মেমরী অ্যালোকেট করা লাগে।

String তো new লিখে ইন্সটেনশিয়েট করা লাগে না, এইটা রেফারেন্স কেন?

করা লাগে না তার মানে এই না যে করা যায় না। তুমি করলে কেউ না করবে ? করেই দেখো 😉

String str = new String("Who said you can't instantiate a string?");

জাভা মেথড কি পাস বাই ভ্যালু নাকি পাস বাই রেফারেন্স?

জাভা মেথড পাস বাই ভ্যালু। তাহলে সে রেফারেন্স পায় ক্যামনে? সে ভ্যালু পাস করে ঠিকই কিন্তু যদি রেফারেন্স টাইপের ভ্যালু মডিফাই করা লাগে তখন সে মডিফিকেশনের কাজ করার জন্য রেফারেন্স নিজে কল করে নেয়। খালি, তোমাকে রেফারেন্স কল করতে দিবে না।

এসাইনমেন্ট ৩

১/ অ্যারে – ২ এর পোস্টে যে ম্যাট্রিক্স যোগ বিয়োগ করার প্রবলেম দিয়েছিলাম সেগুলোকে মেথড আকারে ইমপ্লিমেন্ট করো। যোগ করার জন্য একটা, বিয়োগের জন্য একটা এইভাবে।

২/ একটা মেথড লেখো যেটা কোন ইলিমেন্ট অ্যারে আছে কিনা সেটা চেক করে। থাকলে true না থাকলে false রিটার্ন করে।

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s