1. টাইপকাস্টিং
আদিম প্রকারের ভেরিয়েবলগুলি (টাইপ বাদে boolean
) বিভিন্ন ধরণের সংখ্যা সংরক্ষণ করতে ব্যবহৃত হয়। যদিও ভেরিয়েবলের প্রকারগুলি কখনই পরিবর্তিত হয় না, এমন একটি জায়গা রয়েছে যেখানে আপনি এক প্রকার থেকে অন্য প্রকারে রূপান্তর করতে পারেন। আর সেই জায়গাটা অ্যাসাইনমেন্ট ।
বিভিন্ন ধরনের ভেরিয়েবল একে অপরকে বরাদ্দ করা যেতে পারে। যখন আপনি এটি করেন তখন এক প্রকারের একটি ভেরিয়েবলের মান অন্য ধরণের একটি মানতে রূপান্তরিত হয় এবং দ্বিতীয় ভেরিয়েবলের জন্য নির্ধারিত হয়। এই বিষয়ে, আমরা দুটি ধরণের রূপান্তর সনাক্ত করতে পারি: প্রশস্ত করা এবং সংকীর্ণ করা।
প্রশস্তকরণ একটি ছোট ঝুড়ি থেকে একটি বড় ঝুড়িতে একটি মান স্থানান্তরিত করার মতো: এই অপারেশনটি নির্বিঘ্ন এবং ব্যথাহীন। যখন আপনি একটি বড় ঝুড়ি থেকে একটি ছোট ঝুড়িতে একটি মান স্থানান্তর করেন তখন সংকুচিত হয় : সেখানে পর্যাপ্ত স্থান নাও থাকতে পারে এবং আপনাকে কিছু ফেলে দিতে হবে।
এখানে ঘুড়ির আকার অনুসারে বাছাই করা প্রকারগুলি রয়েছে:
2. প্রসারিত প্রকার রূপান্তর
এটি একটি সংখ্যাসূচক ধরনের একটি ভেরিয়েবল অন্য সংখ্যাসূচক ধরনের একটি পরিবর্তনশীল বরাদ্দ করা প্রায়ই প্রয়োজন. তুমি এটা কিভাবে করলে?
জাভা 4 পূর্ণসংখ্যার ধরন আছে:
টাইপ | আকার |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
ছোট ঝুড়িতে সংরক্ষিত ভেরিয়েবল সবসময় বড় ঝুড়িতে সংরক্ষিত ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে।
int
, short
এবং byte
ভেরিয়েবল সহজে ভেরিয়েবলে বরাদ্দ করা যেতে পারে long
। short
এবং byte
ভেরিয়েবলগুলি ভেরিয়েবলগুলিতে বরাদ্দ করা যেতে পারে int
। এবং ভেরিয়েবলের byte
জন্য ভেরিয়েবল বরাদ্দ করা যেতে পারে short
।
উদাহরণ:
কোড | বর্ণনা |
---|---|
|
এই কোড ঠিক ঠিক কম্পাইল হবে. |
এই ধরনের একটি রূপান্তর, একটি ছোট থেকে একটি বড় ধরনের, একটি প্রশস্ত টাইপ রূপান্তর বলা হয়।
বাস্তব সংখ্যা সম্পর্কে কি?
তাদের সাথে, সবকিছু একই - আকার গুরুত্বপূর্ণ:
টাইপ | আকার |
---|---|
float |
4 bytes |
double |
8 bytes |
float
double
কোনো সমস্যা ছাড়াই ভেরিয়েবলকে ভেরিয়েবল বরাদ্দ করা যেতে পারে । কিন্তু পূর্ণসংখ্যার ধরনগুলির সাথে জিনিসগুলি আরও আকর্ষণীয়।
আপনি একটি float
ভেরিয়েবলের জন্য যেকোনো পূর্ণসংখ্যা ভেরিয়েবল বরাদ্দ করতে পারেন। এমনকি long
টাইপ, যা 8 বাইট দীর্ঘ। এবং আপনি যা চান তা বরাদ্দ করতে পারেন - যেকোন পূর্ণসংখ্যা পরিবর্তনশীল বা float
পরিবর্তনশীল - একটি double
পরিবর্তনশীলকে:
কোড | বিঃদ্রঃ |
---|---|
|
|
মনে রাখবেন যে একটি বাস্তব প্রকারে রূপান্তর করার ফলে পর্যাপ্ত উল্লেখযোগ্য সংখ্যার অভাবের কারণে নির্ভুলতা হারাতে পারে।
পূর্ণসংখ্যা থেকে ফ্লোটিং-পয়েন্ট সংখ্যায় রূপান্তর করার সময়, সংখ্যার নিম্ন ক্রম অংশগুলি বাতিল করা হতে পারে। কিন্তু যেহেতু ভগ্নাংশ সংখ্যা আনুমানিক মান সঞ্চয় করার জন্য বোঝা যায়, তাই এই ধরনের অ্যাসাইনমেন্ট অপারেশন অনুমোদিত।
3. সংকীর্ণ টাইপ রূপান্তর
অন্যান্য সম্ভাবনা সম্পর্কে কি? যদি আপনি long
একটি int
ভেরিয়েবল একটি মান বরাদ্দ করতে হবে?
একটি ঝুড়ি হিসাবে একটি পরিবর্তনশীল কল্পনা করুন. আমাদের কাছে বিভিন্ন আকারের ঝুড়ি রয়েছে: 1, 2, 4 এবং 8 বাইট। একটি ছোট ঝুড়ি থেকে একটি বড় একটি আপেল স্থানান্তর করা একটি সমস্যা নয়. কিন্তু একটি বড় ঝুড়ি থেকে একটি ছোট ঝুড়িতে স্থানান্তর করার সময়, কিছু আপেল হারিয়ে যেতে পারে।
এই রূপান্তর — একটি বৃহত্তর টাইপ থেকে একটি ছোট টাইপ — একটি সংকীর্ণ টাইপ রূপান্তর বলা হয় । এইভাবে একটি অ্যাসাইনমেন্ট অপারেশন সম্পাদন করার সময়, একটি সংখ্যার অংশটি নতুন ভেরিয়েবলের সাথে খাপ খায় না এবং তাই বাতিল করা হতে পারে।
একটি টাইপ সংকুচিত করার সময়, আমাদের অবশ্যই কম্পাইলারকে স্পষ্টভাবে বলতে হবে যে আমরা ভুল করছি না, আমরা ইচ্ছাকৃতভাবে সংখ্যার অংশটি বাতিল করছি। এর জন্য টাইপকাস্ট অপারেটর ব্যবহার করা হয়। এটি বন্ধনীতে একটি টাইপ নাম ।
এই ধরনের পরিস্থিতিতে, জাভা কম্পাইলারের জন্য প্রোগ্রামারকে টাইপকাস্ট অপারেটর নির্দিষ্ট করতে হবে। সাধারণভাবে, এটি এই মত দেখায়:
(type) expression
উদাহরণ:
কোড | বর্ণনা |
---|---|
|
প্রতিবার টাইপকাস্ট অপারেটরকে স্পষ্টভাবে নির্দেশ করতে হবে |
এখানে a
সমান 1
, এবং সম্ভবত টাইপকাস্ট অপারেটরটি ওভারকিলের মতো মনে হচ্ছে। কিন্তু a
বড় হলে কি হতো?
কোড | বর্ণনা |
---|---|
|
|
long
এক মিলিয়ন একটি এবং একটি এর মধ্যে পুরোপুরি ফিট করে int
। কিন্তু একটি short
ভেরিয়েবলের জন্য 10 মিলিয়ন বরাদ্দ করার সময়, প্রথম দুটি বাইট বাতিল করা হয় এবং শুধুমাত্র শেষ দুটি বাইট রাখা হয়। এবং একটিকে বরাদ্দ করার সময় byte
, শুধুমাত্র শেষ বাইটটি অবশিষ্ট থাকে।
সংখ্যাগুলি কীভাবে মেমরিতে সাজানো হয়:
টাইপ | বাইনারি স্বরলিপি | দশমিক স্বরলিপি |
---|---|---|
int |
0বি 00000000 00001111 01000010 01000000 | 1000000 |
short |
0b 01000010 01000000 | 16.960 |
byte |
0b 01000000 | 64 |
char
টাইপ
A char
, a এর মতো short
, দুটি বাইট দখল করে, কিন্তু একটিকে অন্যটিতে রূপান্তর করতে, আপনাকে সর্বদা একটি টাইপকাস্ট অপারেটর ব্যবহার করতে হবে। এখানে সমস্যাটি হল যে short
টাইপটি স্বাক্ষরিত এবং -32,768
এটি থেকে থেকে মান ধারণ করতে পারে +32,767
, তবে char
টাইপটি স্বাক্ষরবিহীন এবং এটি থেকে 0
পর্যন্ত মান থাকতে পারে 65,535
।
নেতিবাচক সংখ্যাগুলি একটিতে সংরক্ষণ করা যায় না char
, তবে সেগুলি একটিতে সংরক্ষণ করা যেতে পারে short
। এবং একটি short
এর চেয়ে বড় সংখ্যা সংরক্ষণ করতে পারে না 32,767
, তবে এই জাতীয় সংখ্যাগুলি একটিতে সংরক্ষণ করা যেতে পারে char
।
4. একটি অভিব্যক্তির ধরন
যদি একই রাশিতে বিভিন্ন ধরনের ভেরিয়েবল ব্যবহার করা হয়? যৌক্তিকভাবে, আমরা বুঝতে পারি যে তাদের প্রথমে একটি সাধারণ প্রকারে রূপান্তর করতে হবে। কিন্তু কোনটি?
বৃহত্তর এক, অবশ্যই.
জাভা সবসময় বড় ধরনের রূপান্তর করে। মোটামুটিভাবে বলতে গেলে, একটি প্রকারকে প্রথমে প্রশস্ত করা হয় এবং শুধুমাত্র তারপরে একই ধরণের মান ব্যবহার করে অপারেশন করা হয়।
যদি একটি int
এবং a long
একটি অভিব্যক্তিতে জড়িত থাকে, তবে এর মানটি int
a এ রূপান্তরিত হবে long
এবং শুধুমাত্র তখনই অপারেশনটি এগিয়ে যাবে:
কোড | বর্ণনা |
---|---|
|
a a এ প্রশস্ত করা হবে long এবং তারপর সংযোজন ঘটবে। |
ফ্লোটিং-পয়েন্ট সংখ্যা
যদি একটি পূর্ণসংখ্যা এবং একটি ফ্লোটিং-পয়েন্ট সংখ্যা ( float
বা double
) একটি অভিব্যক্তিতে জড়িত থাকে, তাহলে পূর্ণসংখ্যাটি একটি ফ্লোটিং-পয়েন্ট সংখ্যা ( float
বা double
) এ রূপান্তরিত হবে এবং শুধুমাত্র তখনই অপারেশন করা হবে।
যদি অপারেশনটি a float
এবং a জড়িত থাকে double
, তাহলে float
একটি তে রূপান্তরিত হবে double
। যা আসলে প্রত্যাশিত।
একে অপরের সাথে ইন্টারঅ্যাক্ট করার সময় byte
, short
এবং প্রকারগুলি char
সর্বদা রূপান্তরিত হয় । টাইপটিকে স্ট্যান্ডার্ড পূর্ণসংখ্যার ধরন হিসাবে বিবেচনা করার int
একটি ভাল কারণ রয়েছে ।int
আপনি a কে byte
a দ্বারা গুণ করলে short
আপনি একটি পাবেন int
। আপনি a কে byte
a দ্বারা গুণ করলে byte
আপনি একটি পাবেন int
। এমনকি আপনি a byte
এবং a যোগ করলেও byte
আপনি একটি পাবেন int
।
এর বেশ কিছু কারণ রয়েছে। উদাহরণ:
কোড | বর্ণনা |
---|---|
|
110 * 120 হল 13,200 , যা প্রকারের সর্বোচ্চ মানের থেকে সামান্য বেশি byte :127 |
|
110 + 120 হয় 230 , যা প্রকারের সর্বোচ্চ মানের থেকেও সামান্য বেশি byte :127 |
সাধারণভাবে, একটি 8-বিট (1 বাইট) সংখ্যাকে 8-বিট (1 বাইট) সংখ্যা দ্বারা গুণ করার সময়, আমরা একটি সংখ্যা পাই যা 16-বিট বিট (2 বাইট) দখল করে।
ফলস্বরূপ, পূর্ণসংখ্যার ধরনগুলির থেকে ছোট সমস্ত ক্রিয়াকলাপগুলি int
সর্বদা অবিলম্বে int
s-এ রূপান্তরিত হয়। এবং এর মানে হল যে আপনি যদি একটি টাইপের থেকে ছোট একটি ভেরিয়েবলে গণনার ফলাফল সংরক্ষণ করতে চান int
, তাহলে আপনাকে সর্বদা স্পষ্টভাবে টাইপকাস্ট অপারেটর নির্দিষ্ট করতে হবে।
উদাহরণ:
কোড | বর্ণনা |
---|---|
|
অভিব্যক্তি byte * byte একটি হবেint |
|
অভিব্যক্তি byte + byte একটি হবেint |
|
অভিব্যক্তিটি byte + int হবে একটি int আক্ষরিক একটি একটি int । |
5. একটি গুরুত্বপূর্ণ nuance
টাইপকাস্ট অপারেটরের মোটামুটি উচ্চ অগ্রাধিকার রয়েছে।
এর মানে হল যে যদি একটি অভিব্যক্তিতে থাকে, উদাহরণস্বরূপ, যোগ এবং একটি টাইপকাস্ট অপারেটর, টাইপকাস্টটি যোগ করার আগে সঞ্চালিত হবে।
উদাহরণ:
কোড | বর্ণনা |
---|---|
|
টাইপকাস্ট অপারেটর শুধুমাত্র ভেরিয়েবলে প্রয়োগ করা হবে a , যা ইতিমধ্যেই একটি byte । এই কোড কম্পাইল হবে না. |
|
এটাই সঠিক পথ। |
আপনি যদি সম্পূর্ণ এক্সপ্রেশনটিকে একটি নির্দিষ্ট টাইপে রূপান্তর করতে চান, এবং শুধুমাত্র অভিব্যক্তির একটি উপাদান নয়, তাহলে সম্পূর্ণ অভিব্যক্তিটিকে বন্ধনীতে মুড়ে টাইপকাস্ট অপারেটরকে সামনে রাখুন।
GO TO FULL VERSION