Kotlin Bài 6: Các Kiểu Dữ Liệu Trong Kotlin

Posted by
Rating: 5.0/5. From 3 votes.
Please wait...

Chào mừng các bạn đã đến với bài học Android – Kotlin thứ 6, bài học về Các Kiểu Dữ liệu của Kotlin. Đây là bài học trong chuỗi bài viết về lập trình ứng dụng Android bằng Kotlin của Yellow Code Books.

Kết thúc bài học về Dữ liệu & Kiểu dữ liệu hôm trước, bạn đã biết tại sao mà một ngôn ngữ lập trình định nghĩa ra Dữ liệu, và phân làm nhiều Kiểu dữ liệu rồi. Bạn còn sử dụng BiếnHằng để chính thức giúp chương trình của bạn có được Dữ liệu để tương tác cũng như lưu trữ. Thông qua các khái niệm và các ví dụ từ bài học cũ này, bạn đã phần nào làm quen với một vài Kiểu dữ liệu mà Kotlin hỗ trợ. Sang bài học hôm nay, bạn sẽ được làm quen cụ thể từng Kiểu dữ liệu một, xem các kiểu này là gì và có khó áp dụng không nhé.

Kiểu Nguyên Thủy & Kiểu Object?

Trước khi đi vào nói có bao nhiêu Kiểu dữ liệu mà Kotlin hỗ trợ, mình xin mạn phép làm rõ 2 khái niệm kinh điển của các ngôn ngữ lập trình mà mình biết đều đưa ra, đó là Kiểu dữ liệu Nguyên thủyKiểu dữ liệu Object. Nhưng để hiểu rõ hơn 2 khái niệm này, mình mời các bạn cùng xem lại định nghĩa các Kiểu dữ liệu Nguyên thủy bên Java trước. Sau đó mình sẽ tổng hợp lại ở các mục nhỏ dưới đây.

Bên Java, Bạn Phải Làm Quen Với Kiểu Nguyên Thủy Trước

Rõ rồi nhé. Nếu như với Java hay các ngôn ngữ lập trình khác mà mình biết, vẫn còn phân biệt Kiểu dữ liệu Nguyên thủy (Primitive Data Type) và Không nguyên thủy (Non-Primitive Data Type, hay còn gọi với tên khác như Kiểu Object). Tại sao lại phân biệt 2 kiểu này? Mình nhận thấy rằng, sở dĩ các ngôn ngữ có phân biệt vậy, là giúp các lập trình viên dễ dàng hơn trong việc sử dụng kiểu dữ liệu. Các Kiểu Nguyên thủy chỉ chứa dữ liệu thuần túy, bạn chỉ việc khai báo và dùng. Còn các Kiểu Không nguyên thủy là các đối tượng bao bọc lấy các Kiểu Nguyên thủy, rồi thêm thắt vào các phương thức hay các thuộc tính, để mở rộng hơn khả năng của kiểu dữ liệu. Các Kiểu Không nguyên thủy này do hệ thống định nghĩa sẵn hoặc bạn tự định nghĩa ra, có thể kể ra như các kiểu String, Array.

Cũng không lãng phí khi mình tóm gọn lại một chút các Kiểu Nguyên thủy của Java ở các gạch đầu dòng sau.

  • Các kiểu số nguyên: byte, short, int, long. Các kiểu này dùng để lưu trữ và tính toán các số nguyên, bao gồm các số nguyên có giá trị âm, các số nguyên có giá trị dương và số 0.
  • Các kiểu số thực: floatdouble. Các kiểu này dùng để lưu trữ và tính toán các số thực, chính là các số có dấu chấm động.
  • Kiểu char. Dùng để khai báo và chứa đựng một ký tự.
  • Kiểu boolean. Trong ngôn ngữ Java, kiểu này chỉ được biểu diễn bởi hai giá trị là true và false. Được dùng trong việc kiểm tra các điều kiện logic đúng hay sai.

Kotlin Không Còn Khái Niệm Kiểu Nguyên Thủy

Sang Kotlin. Bạn nên nhớ từ dòng này, sẽ không có khái niệm Nguyên thủy hay Không nguyên thủy nữa. Vì toàn bộ các kiểu dữ liệu ở Kotlin đều là Không nguyên thủy cả. Điều này có nghĩa là thay vì làm quen với loại dữ liệu và độ lớn của các Kiểu dữ liệu như bên Java, thì với Kotlin bạn còn phải làm quen với từng thuộc tính và phương thức được thêm vào các Kiểu dữ liệu này. Mặc dù có thể bạn chưa nắm vững hướng đối tượng, và chưa hiểu thuộc tính hay phương thức là gì. Nhưng hãy cứ dạo qua các cách sử dụng các Kiểu dữ liệu ở bài này, bạn sẽ thấy chúng cũng không khó để sử dụng lắm đâu.

Mời bạn làm quen nhanh với các Kiểu dữ liệu mà Kotlin hỗ trợ, chúng ta sẽ nói rõ hơn từng Kiểu dữ liệu này ở các mục bên dưới.

  • Các kiểu số nguyên: Byte, Short, Int, Long. Bạn thấy không khác với các kiểu số nguyên của Java đúng không nào. Về công năng thì các kiểu số nguyên bên Kotlin cũng tương tự như kiểu số nguyên bên Java. Nhưng để ý kỹ, Java có kiểu byte, nhưng Kotlin là Byte. Các kiểu khác cũng vậy, chúng khác nhau ở in hoa hay in thường chữ cái đầu của Kiểu dữ liệu. Tại sao vậy? Vì như mình nói, Kiểu dữ liệu của Kotlin là các Kiểu Object, chúng là các class, chính vì vậy khi khai báo chúng phải được viết hoa chữ cái đầu. Trong khi bên Java các kiểu này là các Kiểu nguyên thủy, không phải đối tượng, nên không cần viết hoa. Ôi chắc bạn nào mới tiếp cận lập trình sẽ đau đầu chỗ này mất. Nhưng bạn bình tĩnh nhé, hoặc như mình nói, bạn nên tìm hiểu Java trước sẽ dễ hơn, còn nếu không, hãy chấp nhận các khái niệm lung tung ban đầu này, từ từ thì bạn sẽ hiểu thôi.
  • Các kiểu số thực: Float, Double. Công năng cũng như kiểu số thực bên Java. Và cũng khác nhau so với Java ở cách in hoa chữ đầu.
  • Kiểu Char. Cũng tương tự kiểu char ở Java luôn.
  • Kiểu Boolean. Cũng tương tự kiểu boolean ở Java luôn.
  • Ngoài ra Kotlin còn các Kiểu Object khác mà mình sẽ trình bày tiếp theo ở các bài sau, như kiểu String, kiểu Array. Mặc dù vậy ác kiểu này bên Java cũng có cả.

Chà, có nhiều Kiểu dữ liệu như vậy, thì chúng ta sẽ lựa chọn chúng như thế nào trong ứng dụng của chúng ta? Như bạn đã làm quen từ các bài thực hành ở bài học trước, đó là việc lựa chọn Kiểu dữ liệu cần dùng trong ứng dụng thường hay dựa trên công năng của Biến, chẳng hạn nếu bạn muốn lưu trữ ký tự, hãy chọn Char, muốn lưu trữ đúng/sai hãy chọn Boolean, hay muốn lưu trữ số hãy chọn kiểu số nguyên hay kiểu số thực. Bạn còn có thể chọn Kiểu dữ liệu dựa trên khả năng lưu trữ giá trị của Biến, như Biến lưu trữ số nhỏ thì chọn Byte, còn lưu trữ số lớn hơn Byte nhiều thì chọn Long (khả năng lưu trữ của biến sẽ được mình nói rõ ở các mục sau). Tuy nhiên nếu bạn quá đau đầu trong việc tự lựa chọn Kiểu dữ liệu cho Biến, thì có thể để cho hệ thống tự chọn vậy.

Nào để làm rõ hơn cho mục đích chọn lựa Kiểu dữ liệu này, chúng ta hãy cùng đến với cụ thể từng Kiểu dữ liệu ở Kotlin xem sao nhé.

Kiểu Số Nguyên

Kiểu số nguyên là gì thì mình có nói đến trên kia rồi. Sau đây là độ lớn của các kiểu số nguyên này. Chú ý độ lớn của từng Kiểu dữ liệu chính là giá trị tối thiểu và tối đa của một BiếnKiểu dữ liệu của Biến đó hỗ trợ, theo bảng sau.

Kiểu Dữ LiệuBộ Nhớ Lưu trữĐộ Lớn Của Biến
Byte1 byteTừ –128 Đến 127
Short2 bytesTừ –32,768 Đến 32,767
Int4 bytesTừ –2,147,483,648 Đến 2,147,483, 647
Long8 bytesTừ –9,223,372,036,854,775,808 Đến 9,223,372,036,854,775,807

Theo như bảng trên thì khi bạn thấy việc chọn lựa độ lớn cho kiểu là rất quan trọng, như với kiểu là Byte, hệ thống sẽ chỉ cấp phát cho chúng ta vùng nhớ lưu trữ đúng 1 byte dữ liệu, với vùng nhớ này bạn chỉ được phép sử dụng độ lớn của Biến từ -128 đến 127 mà thôi.

Chẳng hạn bạn có thể khai báo các BiếnHằng kiểu số nguyên như sau.

var month: Byte = 5
var salary: Int = 10000000
var bossSalary: Long = 100000000L
val maxDayOfYear: Int = 366

Với kiểu Long bạn nên khai báo hậu tố L theo sau giá trị ban đầu.

Nhưng bạn nên nhớ, nếu khai báo giá trị vượt quá giới hạn của độ lớn lưu trữ của nó, như code sau đây, bạn sẽ nhận được thông báo lỗi và trình biên dịch sẽ không build ứng dụng được đâu.

var month: Byte = 200

Qua ví dụ này, bạn có thể thấy rằng, khi chọn lựa Kiểu dữ liệu cho Biến, bạn phải cân nhắc đến độ lớn lưu trữ của chúng. Bạn không nên lúc nào cũng sử dụng Kiểu dữ liệu Long cho tất cả các trường hợp vì như vậy sẽ làm tiêu hao bộ nhớ của hệ thống khi chương trình được khởi chạy. Bạn nên biết giới hạn của Biến để đưa ra Kiểu dữ liệu phù hợp. Ví dụ nếu dùng Biến để lưu trữ các tháng trong năm, thì kiểu Byte là đủ. Hoặc dùng Biến để lưu tiền lương của nhân viên theo VND, thì dùng kiểu Int. Nhưng nếu chương trình của bạn lưu trữ toàn người giàu thì lương có thể được sử dụng kiểu Long. Nhưng mình cũng nhắc lại rằng, bạn hoàn toàn có thể để cho hệ thống tự chọn Kiểu giá trị cho Biến hay Hằng khi khai báo kèm gán giá trị ban đầu cho nó, như sau.

var month = 5
var salary = 10000000
var bossSalary = 100000000L
val maxDayOfYear = 366

Theo trang kotlinlang.org thì bạn còn có thể dùng dấu gạch dưới để tách biệt các số ra ở một số trường hợp cho dễ đọc hơn. Điều này hoàn toàn khác với một số ngôn ngữ trước đây mình từng biết, không hề có sự hỗ trợ như thế này. Bạn xem viết như sau vẫn được nhé.

var salary = 10_000_000
var bossSalary = 100_000_000L

Kiểu Số Thực

Kiểu số thực là gì thì mình cũng đã nói ở mục trên kia luôn rồi. Sau đây là bảng độ lớn của các kiểu số thực trong Kotlin.

Kiểu Dữ LiệuBộ Nhớ Lưu trữĐộ Lớn Của Biến
Float4 bytesXấp xỉ ±3.40282347E+38F
Double8 bytesXấp xỉ ±3.40282347E+38F

Với sự thoải mái trong cấp phát bộ nhớ của kiểu số thực thì bạn không quá lo lắng đến việc phân biệt khi nào nên dùng kiểu Float hay Double. Ví dụ sau đây cho thấy trường hợp dùng kiểu số thực.

var aDoubleValue: Double = 3000.55
val pi: Float = 3.14F

Chú ý là kiểu Float bắt buộc bạn phải khai báo hậu tố F hay f theo sau giá trị nhé.

Và tất nhiên bạn có thể để hệ thống tự định nghĩa Kiểu dữ liệu số thực cho bạn như sau.

var aDoubleValue = 3000.55
val pi = 3.14F

Kiểu Char

Như trên kia cũng đã nói, kiểu này dùng để lư trữ các ký tự. Bạn nên nhớ rằng Kotlin và Java không cho phép sử dụng Char như là một số, như C/C++ đã làm. Bạn có thể ép kiểu tường minh một Char về số rồi mới sử dụng như kiểu số được (kiến thức về ép kiểu mình sẽ trình bày sau). Để khai báo Char, bạn phải sử dụng dấu nháy đơn bao lấy giá trị là một ký tự.

var thisChar: Char = 'a'
var anotherChar = '1'

Bạn phải luôn nhớ là các giá trị ở ví dụ trên đều phải nằm trong cặp nháy đơn chứ không phải nháy kép nhé. Nháy kép là dành cho String sẽ được nói đến sau. Trong dấu nháy này chỉ chứa đựng một ký tự thôi. Và nhớ là nếu không có nháy cũng sai. Ví dụ sau khai báo sai kiểu Char.

var thisFailChar: Char = a
var anotherFailChar = '100'
var otherFailChar: Char = "abc"

Ngoài việc khai báo như trên, kiểu Char còn được dùng theo mã Unicode. Mã Unicode bắt đầu bằng ‘\u0000’ và kết thúc bằng ‘\uffff’. Lưu ý là với cách dùng kiểu mã Unicode này, bạn vẫn phải dùng nháy đơn cho việc khai báo. Ký hiệu \u cho biết bạn đang dùng với mã Unicode chứ không phải ký tự bình thường. Với cách khai báo theo kiểu mã Unicode này, bạn có thể đưa vào chương trình một số ký tự đặc biệt, hãy thử thực hành code như sau trên Kotlin Playground, bạn sẽ thấy hiệu quả của Unicode nhé.

fun main() {
    var testUnicode1 = '\u2122'
    var testUnicode2 = '\u03C0'
 
	println("See this character " + testUnicode1 + " and this character " + testUnicode2)
}

Kết quả in ra console như sau.

Các dòng code và kết quả thực thi trên Kotlin Playground
Các dòng code và kết quả thực thi trên Kotlin Playground

Kiểu Boolean

Cũng giống với kiểu boolean bên Java, Boolean ở Kotlin cũng chỉ được biểu diễn bởi hai giá trị là true và false mà thôi. Kiểu dữ liệu này chỉ được dùng trong việc kiểm tra các điều kiện logic, chứ không dùng trong tính toán, do đó bạn không thể gán một kiểu số nguyên về kiểu Boolean như trong C/C++ được.

Khai báo một kiểu Boolean đúng như sau.

var male: Boolean = true
var graduated = false

Việc khai báo một biến Boolean như sau là sai.

var male: Boolean = 1

Tóm lại bài học hôm nay chúng ta đã nói qua một vài Kiểu dữ liệu mà Kotlin hỗ trợ rồi nhé. Đó là các kiểu số nguyên, các kiểu số thực, kiểu Char và kiểu Boolean. Chúng ta sẽ còn nói thêm một vài Kiểu dữ liệu khác của Kotlin ở các bài khác nữa.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:

Đánh giá 5 sao bên dưới mỗi bài nếu thấy thích.
Comment bên dưới mỗi bài nếu có thắc mắc.
Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.
Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.

Bài Kế Tiếp

Mình sẽ nói tiếp các Kiểu dữ liệu còn lại mà bài hôm nay đã quá dài để có thể nói thêm nữa rồi nhé.

Kotlin Bài 7: Đang được viết tiếp… →

Gửi phản hồi