Thursday, August 2, 2018

অব্জেক্ট অরিয়েন্টেড প্রোগ্রামিং - ৯ঃ oop তে static কেন ব্যবহার করা হয়



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

প্রোগ্রাম- ১ঃ
 public class Student {  
      String name;  
      int age;  
      int university_code;  
 }  

 public class MainClass {  
      public static void main(String[] args) {  
           Student student1 = new Student();  
           Student student2 = new Student();  
           student1.age = 23;  
           student1.name = "Rakib";  
           student1.university_code = 100;  
           student2.name = "Rigan";  
           student2.age = 24;  
           student2.university_code = 100;  
           System.out.println("Name: "+ student1.name+", Age: "+student1.age+ ", University Code: "+ student1.university_code);  
           System.out.println("Name: "+ student2.name+", Age: "+student2.age+ ", University Code: "+ student2.university_code);  
      }  
 }  


OUTPUT
 Name: Rakib, Age: 23, University Code: 100  
 Name: Rigan, Age: 24, University Code: 100  

আমরা জানি প্রতিটা অব্জেক্টই মেমরিতে আলাদা আলাদা যায়গা করে নেয়। উপরে প্রোগ্রামটিতে যে ঘটনা ঘটেছিলো-

চিত্রঃ নন স্ট্যাটিক ফিল্ডগুলো অব্জেক্ট তৈরীর সাথে সাথে মেমরিতে আলাদা যায়গা নেয়

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

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

প্রোগ্রাম - ২ঃ
 public class Student {  
      static String name;  
      static int age;  
      static int university_code;  
 }  

 public class MainClass {  
      public static void main(String[] args) {  
           Student.name = "Rakib";  
           Student.age = 23;  
           Student.university_code = 100;  
           System.out.println("Name: "+ Student.name+ ", Age: "+ Student.age+ ", University Code: "+ Student.university_code);  
      }  
 }  

OUTPUT
Name: Rakib, Age: 23, University Code: 100  

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

প্রোগ্রাম - ৩ঃ

 public class Student {  
      static String name;  
      static int age;  
      static int university_code;  
 }  

 public class MainClass {  
      public static void main(String[] args) {
  
           //Create object for student1  
           Student student1 = new Student();  

           //create object for student2  
           Student student2 = new Student();  

           //add data for student1  
           student1.age = 23;  
           student1.name = "Rakib";  
           student1.university_code = 100; 
 
           //add data for student2  
           student2.name = "Rigan";  
           student2.age = 24;  
           student2.university_code = 100; 
 
           //Print data for student1  
           System.out.println("Name: "+ student1.name+", Age: "+student1.age+ ", University Code: "+ student1.university_code);  

           //Print data for student2  
          System.out.println("Name: "+ student2.name+", Age: "+student2.age+ ", University Code: "+ student2.university_code);   
      }  
 }  

 OUTPUT  
 Name: Rigan, Age: 24, University Code: 100  
 Name: Rigan, Age: 24, University Code: 100  

খেয়াল করো দুইটা আলাদা আলাদা ডাটা দেওয়ার পরও আমরা শুধু Rigan এর ডাটাই দুইবার দেখতে পারছি। অথ্যাৎ, শেষে যে ডাটা টা দিলাম সেটাই দুইবার দেখাচ্ছে।

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

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


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

প্রোগ্রাম - ৪ঃ
 public class Student {  
       String name;  
       int age;  
      static int university_code;  
 }  

 public class MainClass {  
      public static void main(String[] args) {  
           //Create object for student1  
           Student student1 = new Student();  
           //create object for student2  
           Student student2 = new Student();  
           //Setting university code   
           Student.university_code = 100;  
           //add data for student1  
           student1.age = 23;  
           student1.name = "Rakib";  
           //add data for student2  
           student2.name = "Rigan";  
           student2.age = 24;  
           //Print data for student1  
           System.out.println("Name: "+ student1.name+", Age: "+student1.age+ ", University Code: "+ student1.university_code);  
           //Print data for student2  
          System.out.println("Name: "+ student2.name+", Age: "+student2.age+ ", University Code: "+ student2.university_code);   
      }  
 }  

 OUTPUT  
 Name: Rakib, Age: 23, University Code: 100  
 Name: Rigan, Age: 24, University Code: 100  

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


এতে মেমরির অপচয় রোধ হল।  প্রথম প্রোগ্রামে university_code এর জন্য দুইবার মেমরি এলোকেট হয়েছে। অথ্যাৎ, মেমরিতে ৩২x২ = ৬৪ বিট যায়গা দখল হয়েছে। যদি আমি মোট ১০০ টা অব্জেক্ট তৈরী  করতাম তাহলে ৩২x১০০ = ৩২০০ বিট যায়গা দখল হতো। যা অপ্রয়োজনীয়।

কিন্তু প্রোগ্রাম - ৪ যতটা অব্জেক্ট তৈরী হোকনা কেন university_code এর জন্য মাত্র ৩২ বিটেই সকল অব্জেক্ট এর কাজ হয়ে যাবে। এতে আমাদের অপ্রয়োজনীয় মেমরি তৈরী করার দরকার পড়েনাই। মেমরি লস কমে গেছে।

যেহেতু এটি ক্লাস এর অধীনে থাকে সেহেতু অব্জেক্ট না থাকলেও static ভেরিয়েবলের জন্য মেমরি বরাদ্ধ থাকবে। অথ্যাৎ, ক্লাস তৈরীর সাথে সাথেই static ফিল্ডগুলো মেমরিতে যায়গা তৈরী করে নেয়। এভাবে আমরা static ব্যবহার করে মেমরি কনজাম্পশন  কমিয়ে আনতে পারি।


No comments:

Post a Comment