در توسعۀ نرمافزار برخی مواقع نیاز داریم تا دیتا تایپ دادههای مورد استفاده در برنامۀ خود را تغییر دهیم که به فرآیند تغییر نوع دادهای به نوع دادۀ دیگر اصطلاحاً Casting گفته میشود (به طور مثال، فرض کنیم که در برنامهای نیاز داریم تا دادهای با دیتا تایپ int
را به دادهای از نوع double
تبدیل کرده سپس در برنامۀ خود مورد استفاده قرار دهیم.)
نکتۀ قابلتوجه در ارتباط با کَست کردن این است که پس از تغییر دیتا تایپ دادهای به دیتا تایپی دیگر، دیتای جدید که نوع آن تغییر یافته جایگزین دیتای قبلی نمیشود بلکه دادهای با دیتا تایپ جدید تولید میشود. همچنین از میان تمامی دیتا تایپهای زبان برنامهنویسی جاوا نوع دادۀ boolean
قابلیت کَست کردن ندارد.
در فرآیند کَستینگ دادۀ اولیهای که قصد تغییر دیتا تایپ آن را داریم تحت عنوان دیتای Source و دادۀ تولیدشده در نتیجۀ این فرآیند نیز دیتای Destination نامیده میشود. نکتۀ حائز اهمیت در این مورد این است که چنانچه دیتای Destination از دیتای Source از لحاظ میزان حافظۀ مورد نیاز برای ذخیرهسازی بزرگتر باشد، فرایند کَست شدن با ضریب خطای به مراتب کمتری انجام میشود که برای روشن شدن این مطلب، در ادامه یک مثال میزنیم.
فرض کنیم دیتای Source دادهای از جنس byte
بوده و قصد داریم تا آن را به دادهای از جنس int
تبدیل نماییم (برای آشنایی بیشتر با دیتا تایپها، به آموزش آشنایی با روشهای نامگذاری متغیرها در زبان برنامهنویسی جاوا مراجعه نمایید.) حال با توجه به آنچه بیان کردیم، با استفاده از دیتا تایپ int
میتوانیم دادههای به مراتب بزرگتری نسبت به دادهای از جنس byte
ذخیره نماییم (دیتا تایپ int
و byte
هر دو برای ذخیرهسازی اعداد صحیح به کار میروند.)
به علاوه، عکس این موضوع را بدین صورت میتوانیم در نظر بگیریم که در برخی مواقع دیتایی داریم که میخواهیم تا دیتا تایپ آن را تغییر دهیم و این در حالی است که دادۀ Destination فضای حافظه کمتری را به منظور ذخیرهسازی دیتا نسبت به دادۀ Source اِشغال میکند که نتیجۀ حاصل از فرآیند کَستینگ در چنین مواردی کمی دور از انتظار میباشد!
برای مثال، فرض کنیم دیتایی از جنس int
داریم که میخواهیم آن را به دادهای از جنس short
تبدیل کنیم که هر دو نیز برای ذخیرهسازی دادههایی از نوع عدد صحیح مورد استفاده قرار میگیرند اما فضای ذخیرهسازی دادهای از جنس short
نسبت به دادهای از جنس int
به مراتب کمتر است که در چنین شرایطی نتیجۀ حاصل از کَستینگ در زبان برنامهنویسی جاوا کمی دور از انتظار میباشد.
حال برای روش شدن مطالب تئوریک فوق، پروژهای جدید تحت عنوان Cast ایجاد کرده سپس کلاسی به نام Casting
در آن میسازیم و در ابتدا کدی به صورت زیر خواهیم داشت:
public class Casting {
public static void main(String[] args) {
}
}
در ادامه، با استفاده از دیتا تایپ double
متغیری تحت عنوان doubleVariable
با مقدار اولیۀ 10/2 تعریف میکنیم به طوری که خواهیم داشت:
public class Casting {
public static void main(String[] args) {
double doubleVariable = 10.2;
}
}
در کد فوق، عدد اعشاریِ 10/2 به منزلۀ دادۀ Source میباشد که در ادامه قصد داریم تا این داده را به دادهای از جنس int
کَست نماییم که برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class Casting {
public static void main(String[] args) {
double doubleVariable = 10.2;
int integerVariable = (int) doubleVariable;
}
}
در کد فوق، عدد 10/2 به عنوان دیتای Source بوده و عدد جدیدی که در نتیجه کَست کردن آن به دست میآید دیتای Destination به شمار میرود. همانطور که در کد فوق مشاهده میکنیم، با استفاده از دیتا تایپ double
متغیری تحت عنوان doubleVariable
تعریف کرده و عدد اعشاریِ 10/2 را بدان اختصاص دادهایم. در ادامه به منظور کَست کردن عدد اعشاری مذکور به عددی از جنس عدد صحیح، ابتدا دیتا تایپ int
را نوشته و متغیری تحت عنوان integerVariable
برای ذخیرهسازی دیتای Destination تعریف میکنیم. در ادامه یک علامت =
قرار داده و داخل علائم ( )
دیتا تایپ مورد نظر جهت تغییر نوع دادۀ دیتای Source را نوشته سپس نام متغیری را مینویسیم که دیتای Source را بدان منتسب کردهایم.
حال برای مشاهدۀ نتیجۀ حاصل از کَستینگ، در ابتدا دیتای Source منتسب به متغیر doubleVariable
را در کنسول چاپ کرده و در ادامه دیتای منتسب به متغیر integerVariable
را به متد ()println
میدهیم تا دیتای Destination را در کنسول چاپ کند به طوری که داریم:
public class Casting {
public static void main(String[] args) {
double doubleVariable = 10.2;
int integerVariable = (int) doubleVariable;
System.out.println(doubleVariable);
System.out.println(integerVariable);
}
}
حال با اجرای برنامۀ فوق در خروجی خواهیم داشت:
10.2
10
در واقع، دادۀ اولیه از نوع double
بوده و در صورت کَست کردن آن به نوع دادۀ int
یا عدد صحیح زبان برنامهنویسی جاوا به صورت خودکار دادۀ مذکور را رُند کرده و آن را به عدد 10 تبدیل میکند.
حال به بررسی عکس این موضوع میپردازیم و برای این منظور دیتا تایپی را مد نظر قرار میدهیم که به منظور ذخیرۀ دیتا نیاز به حافظۀ بزرگتری نسبت به دیتا تایپ مورد نظر در نتیجۀ کَستینگ دارد که برای این منظور کد مربوط به مثال قبل را به صورت زیر تغییر میدهیم:
public class Casting {
public static void main(String[] args) {
int integerVariable = 1000000;
}
}
در مثال فوق، دادۀ Source دیتایی از جنس int
بوده و مقدار اولیۀ آن معادل عدد 1000000 میباشد و از سوی دیگر، دیتا تایپ int
در مقایسه با دیتا تایپ short
فضای بیشتری را برای ذخیرهسازی دادهها اِشغال میکند. حال اگر بخواهیم تا دیتایی از جنس int
در مثال فوق را به دیتایی از نوع دادۀ short
کَست کنیم، کد فوق را به صورت زیر تکمیل مینماییم:
public class Casting {
public static void main(String[] args) {
int integerVariable = 1000000;
System.out.println(integerVariable);
short shortVariable = (short) integerVariable;
System.out.println(shortVariable);
}
}
در کد فوق، برای نمایش دیتای Source متغیر integerVariable
را به عنوان ورودی به متد ()println
میدهیم و در سطر بعد ابتدا دیتا تایپ مورد نظر جهت کَست کردن داده را نوشته سپس متغیری به نام shortVariable
به منظور نگهداری دیتای Destination تعریف میکنیم. در ادامه، داخل علائم ( )
نوع دادۀ مورد نظر را نوشته سپس نام متغیری را مینویسیم که دیتای Source بدان منتسب شده است و با استفاده از عملگر =
دیتای جدید تولیدشده در نتیجۀ فرآیند کَستینگ را به متغیر shortVariable
اختصاص میدهیم. در نهایت، دیتای جدید را با استفاده از متد ()println
در کنسول چاپ میکنیم به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
1000000
16960
همانطور که ملاحظه میکنیم، از آنجایی که ظرفیت دیتا تایپ short
نسبت به نوع دادۀ int
به مراتب کمتر است، از همین روی خروجی برنامه نیز عددی کوچکتر از دیتای اولیۀ پیش از کَستینگ میباشد.