Saturday, January 26, 2019

সি পয়েন্টার - ১ঃ ছ্যাঁচড়া তত্ব

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

মনে করো আলমকে আমি ১০ টাকা দিলাম এবং সেফাতকে আলমের পেছনে লাগায়া দিলাম। সেফাত যেহেতু আলমকে ফলো করে আলমকে দিয়ে আমি সে টাকাটা ফিরিয়ে আনতে পারবো তাইনা? একইভাবে সেফাতকে দিয়ে আমি আলমের কাছে টাকাটা পাঠিয়েও দিতে পারবো।

এখানে আলম একটা ভেরিয়েবল হিসেবে কাজ করছে আর ছ্যাঁচড়া সেফাত পয়েন্টার হিসেবে কাজ করছে। পয়েন্টারের কাজই হলো কোন একটা ভেরিয়েবলকে পয়েন্ট করা/অ্যাড্রেস রাখা/ফলো করা একই কথা।  কোন একটা পয়েন্টার যখন কোন একটা ভেরিয়েবলের অ্যাড্রেস রাখে তখন ওই পয়েন্টার সেই ভেরিয়েবলের সমস্ত ইনফরমেশন জানতে পারে।

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

আমরা জানি ভেরিয়েবলের কাজ হলো ডাটা রাখা, যেমন আলম ১০ টাকা রাখছে। পয়েন্টারের কাজ হলো সেই ভেরিয়েবলের অ্যাড্রেস রাখা। কাউকে ফলো করা আর তার অ্যাড্রেস জেনে রাখা একই জিনিস। অনেকে প্রশ্ন করতে পারো ভেরিয়েবলের অ্যাড্রেসটা আবার কি, তাদের জন্য-

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

 #include <stdio.h>  
 int main()  
 {  
   int alom = 10; //alom k 10 taka diye dilam B-)  
   printf("Total taka in alom: %d\n", alom);    //alom er kache koto taka ache ta jantechi
   printf("Address of Alom: %d\n", &alom);  //alom ekhon koi ache ta jantechi 
   return 0;  
 }  

 OUTPUT  
 Total taka in alom: 10  
 Address of alom: 6356748  

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

 #include <stdio.h>  
 int main()  
 {  
   int alom; //alom aslo 
   alom= 10; //alom re 10 taka dilam 
   int *sefat; //chesra sefat re hajir korlam 
   sefat = &alom; //sefat re alom er address chinaya disi. lou thela 
   printf("alom er kache taka ache: %d\n", alom);    //printing the value of alom
   printf("sefat er kache alom er address: %d\n", sefat); //seeing the address of alom from sefat
   return 0;  
 }  

 OUTPUT  
 alom er kache taka ache: 10  
 sefat er kache alom er address: 6356748  

এখন আমরা চাইলে সেফাতের কাছ থেকে জানতে পারবো আলমের কাছে কত টাকা আছে-
 #include <stdio.h>  
 int main()  
 {  
   int alom = 10;  
   int *sefat;  
   sefat = &alom;  
   printf("%d", *sefat); //Sefat is showing the value in alom   
   return 0;  
 }  

 OUTPUT   
 10  

আবার যদি চাই আলমের কাছের যে টাকা আছে তা পরিবর্তন করতে সেটা কিন্তু আমরা সেফাতকে দিয়েই করতে পারবো। মনে করো আমি সেফাতকে বললাম আলমের কাছে এখন ২০ রাখো। সেফাত দ্রুত আলমের কাছে গিয়ে ২০ টাকা রেখে দিবো।

 #include <stdio.h>  
 int main()  
 {  
   int alom = 10;  
   int *sefat;  
   sefat = &alom;  
   *sefat = 20;  //Changing the value of alom by sefat 
   printf("Current value of alom: %d", alom); //Printing the value of Alom   
   return 0;  
 }  

 OUTPUT   
 10  

দেখতে পাচ্ছো আমরা কিন্তু আলমকে কিছুই বলিনাই। সেফাতরে দিয়ে ঘটনা ঘটিয়ে ফেললাম। অথ্যাৎ, সেফাতকে দিয়ে আলমের ভেলু পরিবর্তন করে ফেললাম। চাইলে কিন্তু আলমের ব্যালান্স শুন্যও করে দিতে পারি। সো, বি কেয়ারফুল।

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

  #include <stdio.h>  
  int main()  
  {  
   int alom = 10;  
   int keka = 999;  
   int *sefat;  
   sefat = &alom; // sefat ekhon alom k follow kortese  
   printf("Sefat er point kora address a j value pawa gelo: %d\n", *sefat);  //alomer value
   sefat = &keka; // Sefat ekhon kekappike follow kortese  
   printf("Sefat er point kora jaygay bortoman value: %d\n", *sefat);  //kepapir value
   return 0;  
  }  

 OUTPUT  
 Sefat er point kora address a j value pawa gelo: 10  
 Sefat er point kora jaygay bortoman value: 999  

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

তুমি কি জানো একটা অ্যারের নাম নিজেই একটা পয়েন্টার? অথ্যাৎ, আমাদের যদি একটা অ্যারে হয় int myArr[] = {50, 60, 70, 80, 90} এখানে myArr হলো একটা পয়েন্টার যার কাছে থাকবে প্রথমজনের অ্যাড্রস।  মানে হলো myArr এর কাছে থাকে myArr[0] এর অ্যাড্রেস। বিশ্বাস না হলে *myArr প্রিন্ট করে দেখো তোমার আউটপুট আসবে 50.

  #include <stdio.h>  
  int main()  
  {  
    int myArr[] = {50, 60, 70, 80, 90};  
    printf("%d", *myArr);  
   return 0;  
  }  

 OUTPUT   
 50  

এখন সেই অ্যাড্রেসটা যদি সেফাতকে দেখিয়ে দিতে পারি তাহলে কিন্তু সে এবার কেকাকে ভূলে গিয়ে এখানে এসে myArr[0] কে পয়েন্ট করবে। বুঝতেই পারছো সেফাত এখন কোন ভালুটা আউটপুট দিবে।

 #include <stdio.h>  
 int main()  
 {  
   int myArr[] = {50, 60, 70, 80, 90};  
   int *sefat = myArr;  
   printf("%d", *sefat);  
   return 0;  
 }  

 OUTPUT   
 50  

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

Wednesday, January 2, 2019

অব্জেক্ট অরিয়েন্টেড প্রোগ্রামিং - ১২ঃ অ্যানোনিমাস ইনার ক্লাস

অ্যানোনিমাস ইনার ক্লাস হলো এক ধরনের ক্লাস যার কোন নাম নাই। এই কথা শুনে অনেকে হয়তো টাস্কি খেয়ে গেছো; নামবিহীন আবার ক্লাস হয় নাকি! একটু পরেই ব্যপারটা আরো ক্লিয়ার হবে। নীচের প্রোগ্রামটা খেয়াল করো। আমি একটা PersonalData নামের একটা ইন্টারফেস তৈরী করলাম এবং সেটাকে ইমপ্লিমেন্ট করার জন্য MyClass নামের আরেকটা ক্লাস তৈরী করলাম এবং কাজটি সম্পর্ন করলাম।

Program - 1: 

 public interface PersonalData {  
      int x = 20;   
      public void getAge();   
 }  

 public class MyClass implements PersonalData {  
      @Override  
      public void getAge() {  
           System.out.println("The age is: "+ x);  
      }  
 }  

 public class MainClass {  
      public static void main(String[] args) {  
           MyClass myClass = new MyClass();  
           myClass.getAge();  
      }  
 }  

 OUTPUT  
 20  

মেইন মেথড থেকে কল করে আমি সিমপ্লি getAge() মেথডটি ব্যবহার করতে পারবো, যার আউটপুট হবে ২০। পুরো কাজটা অক্ষত রেখে কোনভাবে যদি MyClass ক্লাসটিকে হাওয়া করে দিতে পারি তখনই Anonymous Inner ক্লাসের ব্যপারটা চলে আসে। আমরা কাজটা করেই ফেলি!

Program - 2:

 public interface PersonalData {  
      int x = 20;   
      public void getAge();   
 }  

 public class MainClass {  
      public static void main(String[] args) {  
           /* Creating the object of the interface implementing the   
            overloading method */  
           PersonalData personalData = new PersonalData() {  
                @Override  
                public void getAge() {  
                     System.out.println("The age is: "+ x);  
                }  
           };  
           personalData.getAge();  
      }  
 }  

 OUTPUT  
 20  

কোন পার্থক্য খুঁজে পেয়েছো? এখানে কিন্তু MyClass নামের ক্লাসটি নাই। কিন্তু আমাদের আউটপুট ঠিকই আছে। এখানে আমরা ইন্টারফেসটি ইমপ্লিমেন্ট করার জন্য আলাদা ক্লাস ইউজ না করে সরাসরি ইন্টারফেসটির অব্জেক্ট তৈরী করেছি এবং তার আনইমপ্লিমেন্টেড মেথডগুলো ইমপ্লিমেন্ট করে দিয়েছি একইসাথে। এর ফলে আমরা মাঝখানের ক্লাসটিকে এভয়েড করে ফেলছি। এখানে MyClass ই Anynomous ক্লাস হিসেবে কাজ করছে আর যেহেতু এটি MainClass নামক অন্য একটি ক্লাসের ভিতর কাজ করছে তাই একে Anynomous Inner ক্লাস বলা হয়। তাহলে আমরা অ্যানোনিমাস ইনার ক্লাসের একটা সংজ্ঞায় উপনীত হতে পারি-

অ্যানোনিমাস ইনার ক্লাস হল এমন এক ধরনের ক্লাস যেটা কোন ইন্টারফেস বা অ্যাবস্ট্র্যাক্ট ক্লাসের সাবক্লাস তৈরী করা ছাড়াই অব্জেক্ট তৈরী করতে সহায়তা করে।