ক্লাস এবং স্ট্রাক্টের মধ্যে পার্থক্য

স্ট্রাক্ট এবং এনাম - সুইফট প্রোগ্রামিং (Swift Programming) - Computer Programming

185

Swift-এ ক্লাস (Class) এবং স্ট্রাক্ট (Struct) উভয়ই ডেটা এবং ফাংশনালিটির মডেলিং করতে ব্যবহৃত হয়। যদিও তাদের মধ্যে অনেক সাদৃশ্য রয়েছে, তাদের কাজ এবং ব্যবহারিক পার্থক্যও আছে। ক্লাস এবং স্ট্রাক্ট উভয়েই প্রোপার্টিজ (properties), মেথড (methods), ইনিশিয়ালাইজার (initializer) থাকতে পারে, কিন্তু তাদের কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। নিচে ক্লাস এবং স্ট্রাক্টের মধ্যে প্রধান পার্থক্যগুলো ব্যাখ্যা করা হলো।


১. রেফারেন্স টাইপ বনাম ভ্যালু টাইপ

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

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

উদাহরণ:

// ক্লাস উদাহরণ
class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

let person1 = Person(name: "Alice")
let person2 = person1
person2.name = "Bob"

print(person1.name) // আউটপুট: Bob

এখানে, person2 এবং person1 একই রেফারেন্স শেয়ার করে। তাই person2-এ পরিবর্তন করলে person1-এও পরিবর্তন হয়েছে।

// স্ট্রাক্ট উদাহরণ
struct PersonStruct {
    var name: String
}

var person3 = PersonStruct(name: "Alice")
var person4 = person3
person4.name = "Bob"

print(person3.name) // আউটপুট: Alice

এখানে, person3 এবং person4 আলাদা কপি। person4-এ পরিবর্তন করলে person3 অপরিবর্তিত থাকে।

২. ইনহেরিটেন্স (Inheritance)

  • ক্লাস: ক্লাস ইনহেরিটেন্স সমর্থন করে, অর্থাৎ একটি ক্লাস অন্য একটি ক্লাস থেকে বৈশিষ্ট্য এবং মেথড উত্তরাধিকারী হতে পারে। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূল বৈশিষ্ট্যগুলির মধ্যে একটি।
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func makeSound() {
        print("Animal sound")
    }
}

class Dog: Animal {
    func bark() {
        print("Woof!")
    }
}

let dog = Dog(name: "Buddy")
dog.makeSound() // আউটপুট: Animal sound
dog.bark()      // আউটপুট: Woof!
  • স্ট্রাক্ট: স্ট্রাক্ট ইনহেরিটেন্স সমর্থন করে না। আপনি একটি স্ট্রাক্টকে অন্য স্ট্রাক্ট থেকে উত্তরাধিকারী করতে পারবেন না।

৩. ডিনিশিয়ালাইজার (Deinitializer)

  • ক্লাস: ক্লাসে ডিনিশিয়ালাইজার (deinit) থাকতে পারে, যা অবজেক্ট মেমোরি থেকে সরানোর সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত রিসোর্স রিলিজ করার জন্য ব্যবহৃত হয়।
class FileHandler {
    var fileName: String
    
    init(fileName: String) {
        self.fileName = fileName
    }
    
    deinit {
        print("\(fileName) is closed.")
    }
}
  • স্ট্রাক্ট: স্ট্রাক্টে ডিনিশিয়ালাইজার নেই। স্ট্রাক্ট ভ্যালু টাইপ হওয়ায়, যখন এর স্কোপ শেষ হয়, তখন এটি স্বয়ংক্রিয়ভাবে মেমোরি থেকে মুক্তি পায় এবং কোনো অতিরিক্ত ডিনিশিয়ালাইজেশনের প্রয়োজন হয় না।

৪. রেফারেন্স কাউন্টিং (ARC)

ক্লাস: ক্লাস অবজেক্টগুলিতে অটোমেটিক রেফারেন্স কাউন্টিং (ARC) প্রযোজ্য হয়, যা মেমোরি ম্যানেজমেন্টের জন্য দায়ী। ARC ট্র্যাক করে কতগুলি রেফারেন্স একটি ক্লাসের অবজেক্টের সাথে সংযুক্ত আছে এবং যখন কোনো রেফারেন্স থাকে না, তখন এটি মেমোরি থেকে অবজেক্টটি সরিয়ে দেয়।

স্ট্রাক্ট: স্ট্রাক্ট ভ্যালু টাইপ হওয়ায় এতে ARC প্রযোজ্য নয়। এটি স্বয়ংক্রিয়ভাবে মেমোরি থেকে মুক্তি পায়।

৫. মিউটেবল এবং ইমিউটেবল স্ট্রাকচার

ক্লাস: ক্লাস মিউটেবল হতে পারে, এমনকি যদি এটি কনস্ট্যান্ট (let) হিসাবে ডিফাইন করা হয়। আপনি এর প্রোপার্টিজ পরিবর্তন করতে পারেন।

স্ট্রাক্ট: স্ট্রাক্ট যদি কনস্ট্যান্ট (let) হিসেবে ডিফাইন করা হয়, তবে এর প্রোপার্টিজ পরিবর্তন করা যায় না। এর জন্য var ব্যবহার করতে হবে।

struct Car {
    var model: String
}

var car1 = Car(model: "Toyota")
car1.model = "Honda" // এটি কাজ করবে

let car2 = Car(model: "Ford")
// car2.model = "Chevrolet" // এটি কাজ করবে না, কারণ car2 একটি কনস্ট্যান্ট।

৬. ক্লাস বনাম স্ট্রাক্টের ব্যবহারিক প্রয়োগ

ক্লাস ব্যবহার করা উচিত যখন:

  • অবজেক্টগুলির মধ্যে রেফারেন্স শেয়ার করতে হয়।
  • ইনহেরিটেন্স প্রয়োজন।
  • মেমোরি ম্যানেজমেন্ট (ARC) দরকার।
  • ডিনিশিয়ালাইজেশন প্রয়োজন।

স্ট্রাক্ট ব্যবহার করা উচিত যখন:

  • ডেটা স্ট্রাকচারগুলি ছোট এবং লাইটওয়েট হয়।
  • ডেটা কপি করে ব্যবহার করার প্রয়োজন হয়।
  • ইমিউটেবল বা ভ্যালু-বেজড ডেটা স্ট্রাকচার প্রয়োজন।

উপসংহার

বৈশিষ্ট্যক্লাসস্ট্রাক্ট
টাইপরেফারেন্স টাইপভ্যালু টাইপ
ইনহেরিটেন্সসমর্থন করেসমর্থন করে না
ডিনিশিয়ালাইজারআছে (deinit)নেই
রেফারেন্স কাউন্টিং (ARC)প্রযোজ্যপ্রযোজ্য নয়
মিউটেবিলিটিকনস্ট্যান্ট থাকলেও মিউটেবল হতে পারেকনস্ট্যান্ট হলে ইমিউটেবল

Swift-এ ক্লাস এবং স্ট্রাক্টের মধ্যে পার্থক্য বোঝা খুবই গুরুত্বপূর্ণ, কারণ এটি ডেটা এবং অবজেক্ট ম্যানেজমেন্টের সঠিক কৌশল নির্ধারণ করতে সাহায্য করে। প্রয়োজন অনুযায়ী এই দুইটি ডেটা টাইপ বেছে নিয়ে প্রোগ্রামিং করতে পারলে আপনার অ্যাপ্লিকেশন আরও কার্যকরী এবং মজবুত হবে।

Content added By
Promotion

Are you sure to start over?

Loading...