یکی از اولین مفاهیمی که هر برنامهنویس باید در هر زبان یاد بگیرد، متغیرها (Variables) هستند. در زبان برنامهنویسی کاتلین، تعریف و استفاده از متغیرها به شکل ساده، خوانا و در عین حال بسیار قدرتمند انجام میشود. درک درست از متغیرهای کاتلین نهتنها به شما کمک میکند کدی تمیزتر بنویسید، بلکه باعث جلوگیری از خطاهای رایج و افزایش ایمنی برنامه میشود. در این مقاله از سایت الکامکو به زبان ساده بررسی میکنیم که متغیرها در کاتلین (Kotlin Variables) چگونه تعریف میشوند، چه تفاوتی بین val و var وجود دارد، و در چه موقعیتهایی بهتر است از هرکدام استفاده کنیم. اگر در حال یادگیری کاتلین هستید یا قصد دارید پایههای خود را در این زبان تقویت کنید، این راهنما برای شماست.
متغیر چیست؟
متغیر (Variable) در برنامهنویسی به محل حافظهای گفته میشود که برای ذخیره مقدار دادهای (مثل عدد، متن، یا مقدار منطقی) در طول اجرای برنامه استفاده میشود. متغیرها به ما امکان میدهند دادهها را با نام مشخصی نگه داریم، در طول برنامه از آنها استفاده کنیم و در صورت نیاز مقدارشان را تغییر دهیم.
متغیر کاتلین چیست؟
متغیر در برنامهنویسی، یک فضای نامگذاری شده در حافظه است که برای ذخیره کردن دادهها استفاده میشود. درست مانند یک ظرف که محتویات را در خود نگه میدارد، متغیر نیز دادهها را در طول اجرای برنامه نگهداری میکند. این دادهها میتوانند انواع مختلفی داشته باشند، مانند اعداد، متن، مقادیر منطقی و غیره.
انواع دادههای مختلفی در کاتلین وجود دارد که هر کدام برای ذخیره نوع خاصی از اطلاعات استفاده میشوند. رایجترین انواع داده عبارتند از:
- Int: اعداد صحیح مانند ۱، ۲، ۳ و …
- Double: اعداد اعشاری مانند ۳.۱۴، ۵.۲، ۷.۸۹ و …
- Float: اعداد اعشاری با دقت کمتر (مناسب برای صرفهجویی در حافظه)
- Boolean: مقادیر درست (true) یا غلط (false)
- String: رشتههای متنی مانند “سلام دنیا”
- Char: تک کاراکترها مانند ‘a’، ‘B’، ‘c’ و …
پیشنهاد خرید: دوره ساخت اپلیکیشن فروشگاهی اندروید با کاتلین و معماری MVVM
چگونگی تعریف متغیرها در کاتلین
کاتلین برای تعریف متغیرها از دو کلمهی کلیدی اصلی استفاده میکند که هر یک کاربرد خاص خود را دارند:
-
val(Value – فقطخواندنی / غیرقابل تغییر): متغیرهایی که باvalتعریف میشوند، پس از مقداردهی اولیه، دیگر قابل تغییر نیستند. این بدان معناست که نمیتوانید پس از تخصیص اولین مقدار، مقدار جدیدی به آنها بدهید. آنها مانند یک “مقدار ثابت” یا “final” در زبانهای دیگر عمل میکنند.val pi = ۳.۱۴۱۵۹ // مقدار pi پس از این قابل تغییر نیست // pi = 3.14 // خطا: نمیتوان به val مجدداً مقدار داد val userName = "رضا" // userName همیشه "رضا" باقی میماندکاربرد: برای دادههایی که میدانید در طول عمر برنامه یا یک بخش خاص، ثابت خواهند ماند. استفاده از
valدر کاتلین ترجیح داده میشود زیرا کد را ایمنتر و قابل پیشبینیتر میکند (Less mutable state is generally better). -
var(Variable – قابل تغییر): متغیرهایی که باvarتعریف میشوند، پس از مقداردهی اولیه، قابل تغییر هستند. شما میتوانید در طول اجرای برنامه، مقادیر جدیدی را به آنها اختصاص دهید.var counter = ۰ // counter میتواند تغییر کند counter = ۱۰ // اکنون counter 10 است var currentTemperature = ۲۵.۰ // دما میتواند در طول زمان تغییر کند currentTemperature = ۲۶.۵کاربرد: برای دادههایی که انتظار دارید در طول اجرای برنامه تغییر کنند، مانند شمارندهها، وضعیتها، یا ورودیهای کاربر که ممکن است بهروز شوند.
همچنین بخوانید» چگونه برنامه نویسی را یاد بگیریم؟
استنتاج نوع (Type Inference)
یکی از ویژگیهای عالی کاتلین، قابلیت استنتاج نوع (Type Inference) است. این یعنی شما همیشه نیازی به ذکر صریح نوع داده متغیر ندارید. کاتلین میتواند نوع متغیر را بر اساس مقدار اولیهای که به آن میدهید، حدس بزند:
val age = ۳۰ // Kotlin inferres Int
var name = "سارا" // Kotlin inferres String
val price = ۹۹.۹۹ // Kotlin inferres Double
با این حال، اگر بخواهید میتوانید نوع را به صورت صریح هم مشخص کنید:
val age: Int = ۳۰
var name: String = "سارا"
val price: Double = ۹۹.۹۹
این کار در مواقعی که ابهام وجود دارد یا میخواهید خوانایی کد را افزایش دهید، مفید است.
چرا دو نوع متغیر؟
داشتن val و var به شما امکان میدهد تا صریحاً قصد خود را در مورد قابلیت تغییر یک متغیر بیان کنید. این کار به نوشتن کدی کمک میکند که:
- خواناتر است: با یک نگاه میفهمید که کدام دادهها ثابت و کدام قابل تغییر هستند.
- ایمنتر است: احتمال خطاهایی که ناشی از تغییر ناخواسته دادهها هستند را کاهش میدهد.
- کارایی بهتری دارد: کامپایلر کاتلین میتواند برای متغیرهای
valبهینهسازیهای بیشتری انجام دهد.
به همین دلیل، بهترین توصیه در کاتلین این است که تا حد امکان از val استفاده کنید و تنها در صورت نیاز واقعی به تغییر مقدار یک متغیر، از var استفاده کنید.
نکات مهم در مورد متغیرها
- نام متغیر باید با حروف کوچک شروع شود و میتواند شامل حروف، اعداد و زیرخط (_) باشد.
- نام متغیر نباید کلمه کلیدی یا نام رزرو شده زبان برنامه نویسی باشد.
- نوع داده متغیر باید با مقداری که به آن اختصاص داده میشود مطابقت داشته باشد.
- از متغیرها به طور صحیح و در دامنه تعریف شده آنها استفاده کنید.
- برای خوانایی بیشتر کد، نامهای متغیر را واضح و گویا انتخاب کنید.
همچنین بخوانید» انواع حلقه ها در کاتلین
تبدیل متغیرها به همدیگر در زبان برنامه نویسی کاتلین
در کاتلین، تبدیل متغیرها به یکدیگر (معروف به Type Conversion یا Type Casting) به صورت صریح (Explicit) انجام میشود. این یک تفاوت مهم با برخی زبانها مانند جاوا است که در مواردی تبدیلهای ضمنی (Implicit) را مجاز میدانند (مثلاً int به long). فلسفه کاتلین این است که از تبدیلهای ناخواسته که میتواند منجر به از دست رفتن دادهها یا خطاهای پنهان شود، جلوگیری کند.
کاتلین مجموعهای از توابع تبدیل را برای انواع دادههای اولیه فراهم میکند.
۱. تبدیل انواع عددی به یکدیگر
برای تبدیل از یک نوع عددی به نوع دیگر، باید از توابع تبدیل مشخص استفاده کنید:
toByte()toShort()toInt()toLong()toFloat()toDouble()toChar()(برای تبدیل اعداد به کاراکترهای یونیکد معادل)
مثال:
fun main() {
val myInt: Int = ۱۰۰
// تبدیل Int به Long
val myLong: Long = myInt.toLong()
println("Int به Long: $myLong") // خروجی: ۱۰۰
// تبدیل Int به Double
val myDouble: Double = myInt.toDouble()
println("Int به Double: $myDouble") // خروجی: ۱۰۰.۰
// تبدیل Int به Float
val myFloat: Float = myInt.toFloat()
println("Int به Float: $myFloat") // خروجی: ۱۰۰.۰
// تبدیل Long به Int (ممکن است منجر به از دست رفتن داده شود)
val largeLong: Long = 2_000_000_000_000L // عدد بزرگتر از محدوده Int
val convertedInt: Int = largeLong.toInt()
println("Long به Int: $convertedInt") // خروجی: ۱۴۱۰۰۶۵۴۰۸ (داده از دست رفته)
val smallLong: Long = 50L
val convertedInt2: Int = smallLong.toInt()
println("Long به Int (محدوده مجاز): $convertedInt2") // خروجی: ۵۰
// تبدیل Double به Int (قسمت اعشاری حذف میشود)
val myDoubleValue: Double = ۹۹.۷۵
val intFromDouble: Int = myDoubleValue.toInt()
println("Double به Int: $intFromDouble") // خروجی: ۹۹
// تبدیل Int به Char (به کد ASCII/Unicode)
val charCode: Int = ۶۵ // کد ASCII برای 'A'
val myChar: Char = charCode.toChar()
println("Int به Char: $myChar") // خروجی: A
}
نکات مهم در تبدیل عددی:
- تبدیل صریح: شما حتماً باید تابع تبدیل را فراخوانی کنید.
val x: Int = 10val y: Long = x// خطا! بایدx.toLong()باشد.
- از دست رفتن داده (Data Loss): هنگام تبدیل از یک نوع با محدوده بزرگتر به یک نوع با محدوده کوچکتر (مثلاً
LongبهIntیاDoubleبهInt)، ممکن است دادهها از دست بروند یا تقریب صورت گیرد. کاتلین این موضوع را به شما گوشزد میکند.
همچنین بخوانید: آموزش اندروید استودیو از صفر تا صد
۲. تبدیل رشته به عدد و برعکس
-
عدد به رشته: از تابع
toString()استفاده کنید. این برای هر نوع دادهای در کاتلین قابل استفاده است.Kotlin
val num: Int = ۱۲۳ val numAsString: String = num.toString() println("عدد به رشته: $numAsString") // خروجی: "۱۲۳" val piValue: Double = ۳.۱۴ val piAsString: String = piValue.toString() println("Double به رشته: $piAsString") // خروجی: "۳.۱۴" -
رشته به عدد: از توابع مانند
toInt(),toLong(),toDouble(),toFloat()استفاده کنید. مهم: اگر رشته حاوی مقدار عددی معتبری نباشد، این توابع یکNumberFormatExceptionپرتاب میکنند. برای جلوگیری از این خطا، میتوانید از توابعtoIntOrNull(),toLongOrNull(),toDoubleOrNull(),toFloatOrNull()استفاده کنید که در صورت عدم موفقیتnullبرمیگردانند.Kotlin
val stringNumber: String = "۴۵۶" val parsedInt: Int = stringNumber.toInt() println("رشته به Int: $parsedInt") // خروجی: ۴۵۶ val invalidString: String = "abc" // val parsedIntWithError: Int = invalidString.toInt() // این خط باعث NumberFormatException میشود! val safeParsedInt: Int? = invalidString.toIntOrNull() println("رشته به Int (ایمن): $safeParsedInt") // خروجی: null val validDecimalString: String = "۱۲۳.۴۵" val parsedDouble: Double? = validDecimalString.toDoubleOrNull() println("رشته اعشاری به Double (ایمن): $parsedDouble") // خروجی: ۱۲۳.۴۵
۳. تبدیل بین انواع شیء (Object Types) – Casting
در کاتلین، وقتی با انواع شیء (کلاسها) سروکار دارید، میتوانید از عملگرهای as و as? برای تبدیل نوع استفاده کنید.
-
as(Unsafe Cast – تبدیل ناایمن): این عملگر برای تبدیل صریح یک شیء به نوع دیگری استفاده میشود. اگر شیء قابل تبدیل به آن نوع نباشد، یکClassCastExceptionپرتاب میکند.Kotlin
open class Animal class Dog : Animal() { fun bark() = println("Woof!") } class Cat : Animal() { fun meow() = println("Meow!") } fun petAnimal(animal: Animal) { val dog = animal as Dog // اگر animal واقعاً Dog نباشد، خطا میدهد dog.bark() } fun main() { val myDog = Dog() petAnimal(myDog) // خروجی: Woof! // val myCat = Cat() // petAnimal(myCat) // Runtime Error: ClassCastException (Cat cannot be cast to Dog) } -
as?(Safe Cast – تبدیل ایمن): این عملگر تلاش میکند شیء را به نوع مورد نظر تبدیل کند. اگر تبدیل موفقیتآمیز باشد، شیء تبدیل شده را برمیگرداند. اگر شیء قابل تبدیل نباشد، به جای پرتاب استثنا،nullبرمیگرداند. این روش بسیار ایمنتر است.Kotlin
fun petAnimalSafe(animal: Animal) { val dog = animal as? Dog // اگر animal، Dog باشد آن را برمیگرداند، در غیر این صورت null if (dog != null) { dog.bark() } else { println("این حیوان یک سگ نیست!") } } fun main() { val myDog = Dog() petAnimalSafe(myDog) // خروجی: Woof! val myCat = Cat() petAnimalSafe(myCat) // خروجی: این حیوان یک سگ نیست! }
۴. Smart Casts (تبدیل هوشمند)
کاتلین در بسیاری از موارد به صورت هوشمند نوع یک متغیر را پس از یک بررسی نوع (is یا !is)، تشخیص میدهد و نیازی به تبدیل صریح با as ندارید.
Kotlin
fun process(obj: Any) {
if (obj is String) {
// در اینجا، obj به طور خودکار به String تبدیل شده است
println("این یک رشته به طول ${obj.length} است.")
} else if (obj is Int) {
// در اینجا، obj به طور خودکار به Int تبدیل شده است
println("این یک عدد صحیح با مقدار ${obj * ۲} است.")
} else {
println("نوع ناشناخته.")
}
}
fun main() {
process("Hello Kotlin") // خروجی: این یک رشته به طول ۱۲ است.
process(۱۲۳) // خروجی: این یک عدد صحیح با مقدار ۲۴۶ است.
process(true) // خروجی: نوع ناشناخته.
}
خلاصه:
- اعداد: همیشه تبدیل صریح با توابع
toXxx()نیاز است. مراقب از دست رفتن داده باشید. - رشتهها:
toString()برای تبدیل عدد به رشته.toXxx()/toXxxOrNull()برای تبدیل رشته به عدد. - اشیاء:
asبرای تبدیل ناایمن (ممکن استClassCastExceptionبدهد).as?برای تبدیل ایمن (در صورت عدم موفقیتnullبرمیگرداند). - Smart Casts: کاتلین در بسیاری از سناریوهای رایج (مانند بررسی
is) به طور خودکار تبدیل را انجام میدهد و نیازی به کد اضافی نیست.
درک این مکانیسمهای تبدیل برای نوشتن کد ایمن و کارآمد در کاتلین ضروری است.
سوالات متداول پیرامون متغییرهای کاتلین
-
۱. تفاوت اصلی بین
valوvarچیست؟val(Value): برای تعریف متغیرهای فقطخواندنی (read-only) یا غیرقابل تغییر (immutable) استفاده میشود. مقدار آن پس از اولین مقداردهی قابل تغییر نیست. مانند یک ثابت در زبانهای دیگر (مثلfinalدر جاوا).var(Variable): برای تعریف متغیرهای قابل تغییر (mutable) استفاده میشود. مقدار آن میتواند در طول زمان و در طول اجرای برنامه، به دفعات تغییر کند.
-
۲. چه زمانی باید از
valاستفاده کنم و چه زمانی ازvar؟- قانون کلی (بهترین روش): همیشه سعی کنید تا حد امکان از
valاستفاده کنید. اگر میدانید که مقدار یک متغیر قرار نیست بعد از مقداردهی اولیه تغییر کند، ازvalاستفاده کنید. این کار به نوشتن کدی ایمنتر، قابل پیشبینیتر و با باگهای کمتر کمک میکند. - فقط در صورت نیاز از
varاستفاده کنید: وقتی متوجه شدید که واقعاً نیاز دارید مقدار یک متغیر را در طول اجرای برنامه تغییر دهید (مثلاً یک شمارنده، یک وضعیت قابل تغییر UI، یا دادهای که از ورودی کاربر بهروز میشود)، آنگاه ازvarاستفاده کنید.
- قانون کلی (بهترین روش): همیشه سعی کنید تا حد امکان از
-
چه زمانی نوع را صریحاً مشخص کنم؟
- وقتی که خوانایی کد افزایش مییابد (مثلاً برای انواع پیچیده).
- وقتی که متغیر را در ابتدا مقداردهی نمیکنید.
- وقتی که میخواهید نوع خاصی را تحمیل کنید (مثلاً
val value: Long = 10به جایval value = 10که Int را استنتاج میکند).
-
“محدوده (Scope)” متغیر در کاتلین به چه معناست؟
- محدوده به قسمتی از کد اشاره دارد که یک متغیر در آن قابل دسترسی است.
- متغیرهای تعریف شده درون یک تابع یا یک بلوک کد (
{}) فقط در همان تابع/بلاک قابل دسترسی هستند. - متغیرهای تعریف شده در سطح کلاس (اعضای کلاس) در کل آن کلاس قابل دسترسی هستند.
- متغیرهای Top-level (تعریف شده خارج از هر کلاس یا تابع) در کل فایل قابل دسترسی هستند.
نتیجه گیری
در این مقاله با مفهوم متغیرها در کاتلین (Kotlin Variables) آشنا شدیم و دیدیم که چگونه میتوان با استفاده از val و var متغیرهایی ساده اما قدرتمند تعریف کرد. درک درست از متغیرهای کاتلین یکی از پایههای اساسی برنامهنویسی در این زبان است و نقش مهمی در نوشتن کدهای تمیز، امن و قابل توسعه دارد. اما این فقط شروع مسیر یادگیری برنامهنویسی با کاتلین است! اگر میخواهید قدمبهقدم و بهصورت اصولی این زبان محبوب را یاد بگیرید، پیشنهاد میکنیم در دوره آموزش برنامه نویسی اندروید با کاتلین الکامکو شرکت کنید. در این دوره، همه چیز را از پایه تا پیشرفته با مثالهای کاربردی و پروژهمحور یاد میگیرید — حتی اگر هیچ تجربه قبلی نداشته باشید!
🎓 همین حالا از طریق لینک زیر وارد شوید و یادگیری کاتلین را حرفهای شروع کنید:












































































































































































































































































































































































































کاش یه بخش هم درباره اشتباهات رایج در تعریف متغیرهای کاتلین مینوشتید. مثل اشتباه در مقداردهی اولیه یا انتخاب نوع داده.
نکته خیلی خوبی گفتید. اضافه کردن بخش «اشتباهات رایج در تعریف متغییرهای کاتلین» ایده فوقالعادهایه که حتماً در نسخههای بعدی مقاله لحاظ میکنیم. ممنون که کمک میکنید محتوا کاملتر بشه.
مطالعه در مورد متغیرها در کاتلین، پایه و اساس برنامهنویسی در این زبان رو تشکیل میدن.
مطلب خوبی برای تسلط بر مفهوم متغیرها در کاتلین هستش. خسته نباشید
تشکر