آموزش جاوا (فصل ۹)

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

نحوۀ Cast کردن آبجکت‌ به دیتا تایپ‌ و بالعکس در زبان جاوا


در آموزش گذشته با نحوه کَست کردن دیتا تایپ‌های مختلف به یکدیگر آشنا شدیم و در این آموزش به تشریح نوع دیگری از فرآیند کَستینگ خواهیم پرداخت که در آن مقدار اختصاص‌یافته به یک آبجکت را با دیتا تایپ مورد نظر کَست کرده و بالعکس مقداری از نوع دادۀ مد نظر را به آبجکتی کَست می‌نماییم که برای شروع ابتدا پروژه‌ای جدید تحت عنوان CastingObjects ایجاد کرده سپس کلاسی به نام Casting در آن می‌سازیم.

نکتۀ قابل‌توجه در رابطه با کَستینگ آبجکت‌ها این است که در زبان برنامه‌نویسی جاوا نمی‌توان آبجکتی را به دیتا تایپ مورد نظر و بالعکس کَست نمود بلکه این کار با به‌کارگیری کلاسی از پیش تعریف‌شده و متناظر با هر دیتا تایپ در این زبان امکان‌پذیر می‌باشد. در واقع، هر یک از دیتا تایپ‌های مطرح‌شده در زبان جاوا از کلاسی هم‌نام با دیتا تایپ مربوطه برخوردار است که می‌توان با استفاده از قابلیت‌های این کلاس‌ها عملیات کَست کردن از یک آبجکت به دیتا تایپ مورد نظر و بالعکس را انجام داد.

همان‌طور که در آموزش‌های پیشین توضیح دادیم، در زبان برنامه‌نویسی جاوا هشت نوع دادۀ Primitive Type داریم که عبارتند از double ،float ،int ،short ،long ،byte ،char و boolean که توجه داشته باشیم تمامی آن‌ها با حروف کوچک نوشته‌ شده‌اند. به علاوه، کلاس‌های از پیش تعریف‌شدۀ هم‌نام با آن‌ها نیز در زبان جاوا برای هر یک از این دیتا تایپ‌ها در نظر گرفته شده‌اند با این تفاوت که کلاس‌های مذکور با حرف اول بزرگ نوشته می‌شوند که عبارتند از Double ،Float ،Integer ،Short ،Long ،Byte ،Character و Boolean به طوری که نام دو کلاسInteger و Character به صورت کامل نوشته می‌شوند در حالی که دیتا تایپ متناظر آن‌ها به ترتیب به صورت intو char نام‌گذاری شده‌اند.

اکنون قصد داریم تا یک آبجکت از روی کلاس Integer ایجاد کرده و مقداری به آن اختصاص دهیم (توجه داشته باشیم حرف اول واژۀ Integer به صورت بزرگ نوشته شده است.) که برای این منظور به صورت زیر عمل می‌کنیم:

public class Casting {
    public static void main(String[] args) {
        Integer integerObject = new Integer(123);
    }
}

همان‌طور که ملاحظه می‌کنیم، نحوۀ ساخت یک آبجکت از روی کلاس Integer بدین صورت است که اول نام کلاس مد نظر را نوشته سپس نام آبجکت را نوشته و با استفاده از کیورد new به کامپایلر دستور می‌دهیم که آبجکتی جدید از روی کلاس Integer ساخته و با عملگر = آن را به متغیر مورد نظر منتسب کند و بدین ترتیب در کد فوق آبجکتی تحت عنوان integerObject از روی کلاس Integer ساخته‌ و مقدار 123 از جنس عدد صحیح را بدان منتسب نموده‌ایم.

حال همانند مابقی آبجکت‌ها، می‌توانیم آبجکت ساخته‌شده را در تمامی قسمت‌های برنامه مورد استفاده قرار دهیم مضاف بر اینکه در صورت نیاز به استفاده از آن به عنوان یک مقدار عددی، می‌توانیم با فراخوانی متد تعریف‌شده در کلاس Integer روی آبجکت مد نظر آن را به مقدار عددی تبدیل نماییم به طوری که برای تبدیل آبجکت integerObjectبه مقداری با دیتا تایپ int به روش زیر عمل می‌کنیم:

public class Casting {
    public static void main(String[] args) {
        Integer integerObject = new Integer(123);
        int newValue = integerObject.intValue();
    }
}

در کد فوق، ابتدا آبجکتی از روی کلاس Integer تحت عنوان integerObject ساخته و مقدار عددی 123 را بدان منتسب کرده‌ایم و در ادامه متغیر دیگری به منظور نگهداری مقدار عددی 123 پس از کَستینگ تعریف کرده و مقدار ریترن‌شده در نتیجۀ فراخوانی متد ()intValue روی آبجکت integerObject را به آن اختصاص داده‌ایم (چنانچه آبجکت ساخته‌شده در مرحلۀ قبل از جنس کلاس Double بود، می‌توانستیم از متد ()doubleValue استفاده کرده و آن را به یک مقدار عددی از جنس double کَست کنیم.)

همچنین یکی از موارد رایج در فرآیند کَستینگ آبجکت به مقداری با دیتا تایپ مورد نظر، تبدیل آبجکت ساخته‌شده از روی کلاس String به مقداری با دیتا تایپ int است که برای روشن شدن این مطلب سناریویی تعریف کرده و آن را پیاده‌سازی می‌نماییم.این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

در این آموزش به بررسی نحوۀ ساخت آبجکت از روی کلاس‌های متناظرِ هر یک از دیتا تایپ‌های زبان برنامه‌نویسی جاوا پرداختیم و در ادامه مثالی کاربردی را پیاده‌سازی نمودیم تا ببینیم که چگونه می‌توان در صورت نیاز با فراخوانی برخی متدهای تعریف‌شده در کلاس مربوطه آن‌ها را به مقداری با دیتا تایپ مورد نظر کَست نمود. دانلود فایل‌های تمرین


مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *