تعلّم البرمجة بلغة كوتلن (12): أنواع البيانات Data Types

تعلّم البرمجة بلغة كوتلن (12): أنواع البيانات Data Types
أستمع الى المقال

اطلعنا في الدرس السابق، على المتغيرات وأهميتها وقواعدها وكيفية إعلانها في لغة كوتلن. وقلنا أنه لدينا العديد من أنواع البيانات التي يمكننا إسنادها للمتغير في كوتلن. في هذا الدرس سنستعرض بعض أشهر هذه الأنواع وأكثرها استخدامًا، تفصيليًا.

ما هي أنواع البيانات:

في حياتنا اليومية، نستخدم العديد من هذه الأنواع، مثل: النصوص والأعداد والحروف. الأعداد نفسها تنقسم إلى أنواع عديدة، منها عدد صحيح Integer number، ومنها عدد كسري Fraction Number وغيرها.

ونحن نعلم أيضًا أن الأعداد والنصوص مثلًا، نوعان مختلفان تمامًا. كيف لنا أن نعرف هذا؟ حسنًا، يمكننا إجراء عمليات حسابية (مثل الضرب والطرح والجمع) على الأعداد ولكن ليس على النصوص. كأن نجمع عدد كسري مع رقم صحيح:

9 + 3.5

وبالطبع لا يمكننا القيام بالعمليات الحسابية بين نص وعدد أو رقم، كالتالي:

3.5 + “Kotlin”

تتعامل كوتلن مع البيانات، بطريقة مشابهة لتعاملنا معها في حياتنا اليومية. هذا هو السبب في أن كل متغير في لغة كوتلن، له نوع يحدد العمليات المحتملة التي يمكننا إجراؤها على هذا المتغير والقيم التي يمكننا تخزينها فيه.

أنواع البيانات الأساسية في كوتلن:

تنقسم أنواع البيانات الأساسية في كوتلن، إلى عدة مجموعات حسب مضمونها. تعمل الأنواع من نفس المجموعة بشكل مشابه، ولكن لها أحجام مختلفة، وتمثل نطاقات مختلفة من القيم.

الأعداد Numbers:

يوجد عدة أنواع من الأعداد الصحيحة Integers والكسرية Fractional في كوتلن.

الأعداد الصحيحة Integers:

تمثل الأعداد الصحيحة، بأربعة أنواع من أكبر عدد إلى أصغر عدد: نوع Long، نوع Int، نوع Short، نوع Byte. هذه الأنواع الأربعة للأعداد الصحيحة، لديها أحجام ونطاقات مختلفة للأعداد.

يتم حساب نطاقات هذه الأنواع الأربعة بالمعادلة:

من العدد (2n-1)- إلى العدد 1-(2n-1)

المقصود بـ n عدد البتات bits. النطاق يشمل الصفر لذا يتم إنقاص واحد في آخر النطاق. وعند تطبيق المعادلة على الأنواع الأربعة، سنجد أنها تمثل النطاقات التالية:

  •  Byte: قلنا في مقالة سابقة، أن البايت Byte الواحد يساوي 8 بتات. بتعويض n في المعادلة أعلاه، بعدد البتات في البايت الواحد، سنجد أن متغير نوعه Byte يستطيع أن يمثل نطاق عددي من -128 إلى 127 فقط. كيف؟ لنطبق المعادلة:

-(28-1) = -(27)  = -128

 (28-1)-1 = (27)-1 = 127

بالتالي، إذا عرّفنا متغير من نوع Byte، علينا أن نضع به الأعداد التي يشملها هذا النطاق فقط. أقل عدد ممكن هو -128 وأكبر عدد ممكن هو 127. مثل: 127-، 126- … 0 … 125، 126، 127. أي عدد خارج هذا النطاق لا يستطيع البايت أن يمثله. الأعداد مثل: 129-، -130، أو 128، 129 … الخ، نضعها في متغير من نوع Short لأنها خارج نطاق الـ Byte.

  • Short: الـ Short يساوي 2 بايت Byte أو 16 بت Bit. بتطبيق المعادلة، سنجد أن الـ Short يمثل الأعداد من العدد -32768 إلى 32767. أي عدد خارج هذا النطاق، نضعه في متغير من نوع Int.
  • Int: الـ Int يساوي 4 بايت Byte أو 32 بت Bit. بتطبيق نفس المعادلة، سنجد أن الـ Int يمثل الأعداد من العدد -2147483648 إلى 2147483647. أو من العدد (231)- إلى العدد (231).
  • Long: الـ Long يساوي 8 بايت Byte أو 64 بت Bit. ويمثل الأعداد التي ضمن النطاق: (263)- و  (263).

عمليًا،  النوعين الأخيرين Int و Long، هما أكثر الأنواع استخدامًا. قد يكفي استخدام الـ Int، لأنه يمكننا من أن نضع عدد هائل من الأعداد يكون كافيًا في أغلب الاستعمالات. ولكن بالطبع يمكننا استخدام الـ Long والذي يمكنه تمثيل أعداد أكبر حتى من الـ Int.

إسناد أعداد لأنواع المتغيرات الأربعة:

لن نواجه مشكلة عند إسناد الأرقام الصغيرة للمتغيرات من نوع Byte و Short. ولكن عند محاولة إسناد أرقام كبيرة لهذين النوعين، حدثت المشكلة. كما نرى في الصورة التالية، أن برنامج IntelliJ احتج على إسناد الرقم مليون (يمكن كتابته 000_1000 هكذا في كوتلن) إلى هذين النوعين بوضع خط أحمر تحت الرقم. وبالطبع يمكن إسناد هذا الرقم إلى متغير من نوع Int أو Long بدون أية مشكلة.

ملاحظة أخرى من الصورة أعلاه، وهي أن كلمة Int هي الوحيدة بين باقي الأنواع التي تظهر باللون الرمادي. هذا لأنه عند إسناد رقم ما إلى متغير، فسيكون نوعه افتراضيًا Int، ما لم نكتب صراحة نوع آخر. ويظهر باللون الرمادي، ليخبرنا البرنامج بأنه لا داعي لكتابته.

الأعداد الكسرية Fractional:

تُمثل الأعداد الأرقام العشرية decimal digits بنوعين في كوتلن، نوع Float، ونوع Double. هذين النوعين، يختلفان في الحجم، وأيضًا في عدد الأرقام بعد الفاصلة العشرية.

  • Float: يساوي 32 بت Bit. ويستطيع تمثيل من 6-7 أرقام بعد الفاصلة العشرية.
  • Double: يساوي 64 بت Bit. ويستطيع تمثيل من 14-16 رقم بعد الفاصلة العشرية. عمليًا، يعتبر هذا النوع، هو الأكثر استخدامًا من نوع الـ Float.

عند إسناد أي عدد بأرقام عشرية إلى متغير، ستعتبر كوتلن تلقائيًا أن نوعه هو Double. للإعلان عن متغير من نوع Float، يجب علينا كتابة حرف F أو f بعد الرقم الأخير من العدد، كما يظهر في الصورة التالية:

طباعة أعلى وأقل عدد ممكن للنوع:

يمكننا استخدام كوتلن نفسها لمعرفة أقل عدد وأكبر عدد يمكن للأنواع أعلاه تمثيله، بكتابة اسم النوع ثم نقطة بعدها MIN_VALUE لأقل عدد، و MAX_VALUE لأكبر عدد، ثم طباعة الناتج باستخدام وظيفة ()println، كالتالي:

يمكننا اتباع نفس الطريقة مع باقي الأنواع، فقط نقوم بتغيير اسم النوع.

طباعة حجم النوع بالبايت Byte والبت Bit:

لطباعة حجم النوع، نكتب اسم النوع ثم نقطة بعدها SIZE_BYTES لمعرفة حجمه بالبايت، أو SIZE_BITS لمعرفة حجمه بالبت، كالتالي:

وبالطبع يمكن اتباع نفس الطريقة مع باقي الأنواع.

المحارف Characters:

تمتلك كوتلن من ضمن أنواع البيانات الأساسية، النوع Char. إذا وضعنا حرف أو رقم أو حتى رمز بين علامتي تنصيص مفردة (‘ ‘)، ستعتبره كوتلن من النوع Char. حجم هذا النوع مشابه لحجم نوع الـ Short ويساوي 2 بايت Byte، أو 16 بت Bit. مع العلم، أنه يمكننا وضع حرف أو رقم أو رمز واحد فقط، بين علامتي التنصيص المفردة، كالتالي:

كل المتغيرات في الشفرة أعلاه، تعتبر من نوع Char. حتى الرقم والذي لا يمكننا إعتباره رقم في هذه الحالة، بل حرف. والمسافة أيضًا إذا تم وضعها بين العلامتين.

القيم المنطقية Booleans:

نوع البيانات هذا، يمثل قيمتين متعاكستين. صح true أو خطأ false. نعلن عن متغير من هذا النوع لاستخدامه لاحقًا داخل شفرتنا. حجم هذا النوع غير محدد بدقة.

مثال على متغيرات من هذا النوع:

سيتضح هذا النوع أكثر عند استخدامه في الشروط وغيرها، في دروس لاحقة.

السلاسل المحرفية Strings:

من أكثر أنواع البيانات الأساسية التي سنستخدمها بكثرة في شفراتنا بلغة كوتلن. هذا النوع يتكون من سلسلة من المحارف قد تمثل كلمات أو جمل أو أرقام أو رموز داخل علامتي تنصيص مزدوجة (” “)، بخلاف نوع الـ Char.

مثال على متغيرات من هذا النوع:

استنتاج نوع المتغير:

عند الإعلان عن متغير ما في كوتلن، وإسناد قيمة له، ستستنتج كوتلن نوع هذا المتغير حسب نوع القيمة المسندة إليه. فمثلاً، لو كان لدينا متغيرين، نسند لأحدهما جملة نصية ونسند للآخر عدد، كالتالي:

وبعدها وضعنا المتغيرين في برنامج كوتلن، وأردنا تنفيذ بعض العمليات عليهما، وطباعة نتائج العملية، كالتالي:

هذا البرنامج لن يتم تجميعه حتى ولن يتنفذ. والسبب أننا نحاول جمع متغيرين من نوعين لا يمكن جمعهما. لأن كوتلن تعرفت تلقائيًا على أن المتغير text نوعه نصي String، والمتغير number نوعه عدد صحيح Int (اختصارًا لـ Integer)، في سطر الإعلان عنهما. فيما يعرف بعملية الاستدلال على النوع type inference، والتي تتميز بها كوتلن.

ستستنتج كوتلن نوع المتغير، إذا اتبعنا طريقة الإعلان عن المتغيرات ، والتي ذكرناها في الدرس السابق، كالتالي:

var/val identifier = initialization

هناك طريقة أخرى يمكننا استخدامها، وهي كتابة نوع المتغير صراحة، كالتالي:

var/val identifier: Type = initialization

في هذه الطريقة، نضع نقطتين ( : ) ثم النوع Type بعد اسم المتغير. نلاحظ أيضًا، أن النوع Type، يبدأ بحرف كبير uppercase. يمكننا إعادة كتابة المتغيرات أعلاه، كالتالي:

وبالرغم من أننا كتبنا نوع كل متغير بأنفسنا، ولكن كوتلن تعرف أيضًا نوع كل متغير ولن تسمح لنا بفعل التالي:

هذا الأمر سيوقف تنفيذ البرنامج، وينتج لنا الخطأ التالي في برنامج IntelliJ:

Type mismatch: inferred type is Int but String was expected

الخطأ يقول بكل وضوح، أن نوع المتغير المعلن String غير متطابق مع القيمة التي نحاول إسنادها إليه، والتي تعرفت عليها كوتلن على أنها قيمة من نوع Int. لأن نوع البيانات النصي String في كوتلن، لا بد أن يكون بين علامتي تنصيص ( ” ” ). ستقبل كوتلن الإسناد أعلاه إذا وضعنا العدد بين علامتي تنصيص:

ففي هذه الحالة لم يعد عدد صحيح من نوع Int، بل نوع نصي String، لوجوده بين علامتي تنصيص.

هذا الدرس هو جزء من سلسلة تعليم مبادئ البرمجة بلغة كوتلن. لمُتابعة الدروس منذ البداية ومُشاهدة فهرس المحتويات يمكنك الانتقال إلى الدرس الأول من هنا.

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.