آشنایی با مفهوم Casting در زبان برنامه‌نویسی جاوا


در توسعۀ نرم‌افزار برخی مواقع نیاز داریم تا دیتا تایپ داده‌های مورد استفاده در برنامۀ خود را تغییر دهیم که به فرآیند تغییر نوع داده‌ای به نوع دادۀ دیگر اصطلاحاً 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 به مراتب کمتر است، از همین روی خروجی برنامه نیز عددی کوچک‌تر از دیتای اولیۀ پیش از کَستینگ می‌باشد.

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
لیلامن یک کاربر مهمان هستم
۱۳۹۷/۰۷/۱۶
ممنون بابت آموزش های خوبتون
n.hashemi
n.hashemi
۱۳۹۷/۰۵/۲۲
fekonam to noskheh 8 dige ejazeh nemideh int be double cast koni
Sharifi_7
Sharifi_7
۱۳۹۷/۰۵/۰۸
آموزش های استاد مرادی فوق العادست
miracle
miracle
۱۳۹۵/۰۱/۲۳
سلام بر اقای مرادی عزیز واقعا خدا قوت
روش آموزش شما باعث شده که به طور منظم اونها رو پیگیری کنم و خوب یاد بگیرم امیدوارم بتونم به زودی در امر آموزش دادن و کمک به دیگران به شما ملحق بشم.
در ضمن پادکست هاتون خیلی عالیه همگی شما رو دوست دارم.
کاربر میهمان
بردیامن یک کاربر مهمان هستم
۱۳۹۴/۱۲/۲۲
خیلی خوب آموزش می دهید مرسی
امیرحسین مختاری
امیرحسین مختاری
۱۳۹۴/۰۹/۱۶
سلام
میشه کاربرد cast رو بگین برای چیه؟