2 ตัวแปรและชนิดข้อมูล
วัตถุประสงค์
เพื่อให้เข้าใจแนวคิดของตัวแปรและชนิดข้อมูล
เพื่อให้สามารถประกาศ กำหนดค่า และใช้ตัวแปรในการเขียนโปรแกรมได้
เพื่อให้สามารถเลือกใช้ชนิดข้อมูลและตัวแปรในการเขียนโปรแกรมได้อย่างเหมาะสม
เพื่อให้เข้าใจการเปลี่ยนประเภทข้อมูลและสามารถเขียนโปรแกรมเพื่อเปลี่ยนชนิดข้อมูลได้
เพื่อให้สามารถเขียนโปรแกรมในการดำเนินการกับข้อความได้
เพื่อให้สามารถเขียนโปรแกรมในการสั่งพิมพ์ผลลัพธ์ออกทางจอภาพได้
เพื่อให้สามารถเขียนโปแรแกรมเพื่ออ่านข้อมูลจากแป้นพิมพ์ได้
การเขียนโปรแกรมคอมพิวเตอร์จะต้องมีการจัดเก็บข้อมูลระหว่างการประมวลโดยอาศัยตัวแปร ดังนั้นนักเขียนโปรแกรมจึงต้องมีความเข้าใจเกี่ยวกับเรื่องตัวแปรเป็นอย่างดีและภาษาจาวาให้ความสำคัญกับเรื่องชนิดตัวแปรเป็นอย่างมาก ดังนั้นในการเรียนรู้หลักการเขียนโปรแกรมจึงควรเริ่มเรียนรู้เกี่ยวกับตัวแปรเป็นลำดับแรก ๆ บทที่ 1 ได้กล่าวถึงเรื่องตัวแปรในเบื้องต้นไว้บ้างแล้ว ในบทนี้จะให้ความรู้เกี่ยวกับตัวแปรในรายละเอียดที่มากยิ่งขึ้น
2.1 แนวคิดเกี่ยวกับตัวแปร
ตัวแปร คือ ที่เก็บข้อมูลเพื่อใช้ในการทำงานในโปรแกรม โดยมีชื่อของตัวแปรคือสัญลักษณ์ที่แทนตำแหน่งที่เก็บข้อมูลในหน่วยความจำ ดังนั้นในการระบุถึงตำแหน่งที่เก็บข้อมูลแต่ละตำแหน่งได้อย่างถูกต้องนั้นตัวแปรแต่ละตัวจะต้องมีชื่อที่ไม่ซ้ำกัน เราสามารถกำหนดค่าให้กับตัวแปรและค่าที่เก็บอยู่ในตัวแปรสามารถถูกแก้ไขได้โดยการใส่ค่าใหม่ไปเก็บไว้แทนค่าเดิม ตัวแปรสามารถเก็บค่าข้อมูลได้ทีละ 1 ค่าเท่านั้น ตัวแปรเป็นการจองพื้นที่ในหน่วยความจำไว้เพื่อเก็บข้อมูลและค่าในตัวแปรอาจเป็นค่าคงที่หรือค่าที่เปลี่ยนแปลงได้
เครื่องหมาย = ในภาษาจาวาไม่ใช่การเท่ากันทางคณิตศาสตร์แต่เป็นการกำหนดค่าให้กับตัวแปรทางด้านซ้ายของเครื่องหมาย = โดยนำผลของการคำนวณทางขวาหรือค่าทางขวาไปใส่หรือเก็บในตัวแปรทางซ้าย ตัวอย่างเช่น
\(x = 20\) หมายถึง ให้นำค่า 20 ไปเก็บในตัวแปร x หรือการกำหนดค่าให้ตัวแปร x
\(x = 15 + 30\) หมายถึง การนำผลการคำนวณ 15 + 30 ซึ่งได้ผลลัพธ์เป็น 45 ไปเก็บที่ ตัวแปร x ดังนั้นเมื่อทำคำสั่งนี้แล้วทำให้ x มีค่าเป็น 45
นอกจากนี้ควรเข้าใจว่าตัวแปรในโปรแกรมไม่ใช่ตัวแปรทางคณิตศาสตร์ซึ่งใช้แทนสิ่งที่ไม่ทราบค่า ในทางคณิตศาสตร์สามารถเขียนสมการ เช่น 10 + x = 15 ได้ หมายความว่า 10 + x เท่ากันกับ 15 ดังนั้น x จึงมีค่าเท่ากับ 5 แต่ในการเขียนคำสั่งในโปรแกรมเป็นการผิดหลักไวยากรณ์ ด้านหน้าของเครื่องหมาย = ควรเป็นตัวแปรที่นักเขียนโปรแกรมต้องการนำข้อมูลไปจัดเก็บไว้
จากแนวคิดที่ว่า
เครื่องหมาย = เป็นการนำค่าทางขวาของ = ไปใส่ตัวแปรทางด้านซ้าย
เราสามารถเรียกใช้ค่าที่เก็บในตัวแปรด้วยการเรียกชื่อตัวแปร
หากมีการคำนวณให้คำนวณค่าทางขวาของเท่ากับให้เสร็จก่อนแล้วจึงนำผลลัพธ์ไปใส่ในตัวแปรที่อยู่ทางด้านซ้ายของเครื่องหมาย = และ
ค่าที่เก็บในตัวแปรสามารถเปลี่ยนแปลงได้ ดังนั้น ถ้า x = 1 และให้ x = x + 5 แสดงว่าเราต้องทำการคำนวณค่าทางขวาก่อนคือตอนนี้ตัวแปร x มีค่าเท่ากับ 1 เมื่อนำไปบวกกับ 5 ผลการคำนวณที่ได้คือ 6 จากนั้นจะนำ 6 ไปเก็บในตัวแปร x (ทำให้ตัวแปร x เปลี่ยนเป็นค่าใหม่คือ 6) ทำให้เมื่อสิ้นสุดการทำงานตัวแปร x จะมีค่าเท่ากับ 6
จากตัวอย่างที่ 2.1 ในบรรทัดที่ 3 เป็นการประกาศหรือสร้างตัวแปรชื่อ x เพื่อใช้เก็บข้อมูลชนิดจำนวนเต็ม (integer) ในบรรทัดที่ 3 ยังไม่ได้มีการกำหนดค่าให้ตัวแปร x ดังนั้นจึงยังไม่มีค่าใดเก็บอยู่ในตัวแปร x บรรทัดที่ 4 ของโปรแกรมมีการนำค่า 20 ไปเก็บในตัวแปร x บรรทัดที่ 5 มีการคำนวณ 15 + 30 ได้ผลลัพธ์คือ 45 ผลลัพธ์ที่ได้นำไปกำหนดค่าให้ตัวแปร x ดังนั้นเมื่อทำคำสั่งบรรทัดที่ 5 เสร็จแล้วตัวแปร x จะมีค่า 45 เก็บอยู่ ในบรรทัดที่ 6 มีการเรียกใช้ตัวแปร x มาดำเนินการบวกกับ 5 หมายถึงการนำค่าในตัวแปร x คือ 45 มาบวกกับ 5 ผลลัพธ์ที่ได้คือ 50 แล้วนำค่า 50 ไปเก็บในตัวแปร x ทำให้ตัวแปร x เปลี่ยนค่าเป็น 50 เมื่อทำคำสั่งบรรทัดที่ 6 เสร็จแล้ว และสุดท้ายในบรรทัดที่ 7 เป็นการเรียกใช้ค่าในตัวแปร x มาพิมพ์ออกทางจอภาพ ดังนั้นโปรแกรมจะพิมพ์ว่า x = 50 ออกทางจอภาพ
2.2 การประกาศตัวแปร
ในการเขียนโปรแกรมภาษาจาวานักเขียนโปรแกรมจะต้องทำการสร้างหรือประกาศตัวแปรก่อนจึงจะกำหนดค่าให้กับตัวแปรและใช้ตัวแปรนั้นได้ ไวยากรณ์ในการประกาศตัวแปรในภาษาจาวาเป็นดังนี้
ขั้นตอนการประกาศตัวแปรมี 3 ขั้นตอน คือ
ระบุชนิดของตัวแปร
ตั้งชื่อตัวแปร
ใส่เครื่องหมายอัฒภาค ;
ในกรณีที่ต้องการประกาศตัวแปรมากกว่า 1 ตัวที่เป็นชนิดเดียวกันให้ขั้นตัวแปรแต่ละตัวด้วยเครื่องหมายจุลภาค (,) จากตัวอย่างข้างต้นจะเห็นว่า
2.3 ชนิดข้อมูลและตัวแปร
ตัวแปรในภาษาจาวาให้ความสำคัญกับชนิดข้อมูล เนื่องจากตัวแปรหนึ่งตัวไม่สามารถเก็บข้อมูลได้ทุกชนิด ตัวแปรจะเก็บค่าเฉพาะค่าที่อยู่ในชนิดเดียวกันตามประกาศไว้หรือชนิดข้อมูลที่ใกล้เคียงกันเท่านั้น เช่น ตัวแปรที่เก็บค่าเลขทศนิยมสามารถเก็บเลขจำนวนเต็มได้แต่ไม่สามารถใช้เก็บตัวอักษรได้ เป็นต้น การประกาศตัวแปรเป็นการจองเนื้อที่ในหน่วยความจำเพื่อใช้จัดเก็บข้อมูลในขณะการประมวลผล โดยเนื้อที่ที่จองไว้สำหรับใช้จัดเก็บข้อมูลแต่ละชนิดมีขนาดเนื้อที่ที่ไม่เท่ากัน ทำให้ช่วงของข้อมูลที่สามารถจัดเก็บในตัวแปรแต่ละชนิดไม่เท่ากันด้วย ดังตารางที่ 2-1
ตารางที่ 2.1 ชนิดข้อมูลในภาษาจาวา
ชนิดข้อมูล | เนื้อในหน่วยความจำที่ใช้ (บิต) | ช่วงของข้อมูลที่จัดเก็บได้ |
---|---|---|
boolean | - | true หรือ false |
char | 16 | ใช้กับอักขระที่มีรหัสตั้งแต่ \(0-65535\) |
byte | 8 | \(-128\) ถึง 127 |
short | 16 | \(-32768\) ถึง 32767 |
int | 32 | \(-2147483468\) ถึง 2147483467 |
long | 64 | \(-2^{63}\) ถึง \(2^{63}-1\) |
float | 32 | เลขทศนิยม \(1.4\times 10^{-45}\) ถึง \(3.4028235\times 10^{38}\) |
double | 64 | เลขทศนิยม \(4.9\times 10^{-324}\) ถึง \(3.4028235\times 10^{308}\) |
ตัวอย่างที่ 2.2 แสดงถึงโปรแกรมที่แสดงค่าสูงสุดและต่ำสุดที่ตัวแปรที่เก็บข้อมูลชนิดตัวเลขสามารถจัดเก็บได้ ตัวอย่างเช่น ตัวแปรชนิด byte สามารถเก็บค่าจำนวนเต็มที่น้อยที่สุดคือ -128 และค่าที่มากที่สุดคือ 127 ดังนั้นค่าตัวเลขที่จัดเก็บในตัวแปร byte ต้องมีค่าอยู่ในช่วง -128 ถึง 127 เท่านั้น เป็นต้น
จากผลลัพธ์ของโปรแกรมในตัวอย่างที่ \(2-2\) ค่า \(1.4 \mathrm{E}-45\) ในภาษาจาวาหมายถึง \(1.4 \times 10^{-45}\) \(3.4028235 \mathrm{E} 38\) หมายถึง \(3.4028235 \times 10^{38}\) ดังนั้นตัวแปรชนิด float จะสามารถเก็บค่าตัวเลขทศนิยมในช่วง \(1.4 \times 10^{-45}\) ถึง \(3.4028235 \times 10^{38}\) แสดงความละเอียดของทศนิยมได้ 7 หลัก ส่วนตัวแปรชนิด double จะ สามารถเก็บค่าตัวเลขทศนิยมในช่วง \(4.9 \times 10^{-324}\) ถึง \(3.4028235 \times 10^{308}\) แสดงความละเอียดของทศนิยมได้ 16 หลักทำให้ทศนิยมชนิด double มีความละเอียดกว่าทศนิยมชนิด float
ตัวแปรคือที่เก็บข้อมูลหากเราเปรียบเทียบตัวแปรเป็นเหมือนกล่องใส่ของ กล่องแต่ละใบย่อมมีขนาด และรูปร่างที่แตกต่างกัน เช่น กล่องขนาดใหญ่ กล่องขนาดเล็ก กล่องทรงสูง กล่องทรงเตี้ย เป็นต้น ดังนั้นตัว แปรที่เปรียบเสมือนกล่องที่เอาไว้ใส่ค่าข้อมูล ตัวแปรแต่ละชนิดก็จะมีลักษณะแตกต่างกันเช่นเดียวกับกล่องใส่ ของ ดังภาพที่ \(2-1\)
เราสามารถแบ่งชนิดของตัวแปรในภาษาจาวาตามประเภทของข้อมูลได้ ดังภาพที่ 2-2
การเก็บข้อมูลประเภทข้อความที่มีตัวอักษรได้มากกว่า 1 ตัว จะไม่สามารถใช้ตัวแปรชนิด char ได้ เนื่องจากตัวแปรชนิด char สามารถเก็บข้อมูลตัวอักษรได้เพียงตัวเดียว ภาษาจาวาจึงได้สร้างคลาสที่ชื่อว่า String เพื่อช่วยอำนวยความสะดวกในการจัดเก็บข้อมูลที่เป็น “ชุดของตัวอักษร” หรือข้อความ และช่วยในการดำเนินการกับข้อมูลประเภทข้อความได้ ดังนั้น String ในภาษาจาวาจึงไม่ใช่ชนิดข้อมูลแต่เป็นคลาสของภาษาจาวาที่เตรียมไว้นักเขียนโปรแกรมใช้ในการดำเนินงานกับข้อความ
2.4 การตั้งชื่อตัวแปร
จากหัวข้อที่ 2.2 ในการประกาศตัวแปรจะต้องตั้งชื่อตัวแปรด้วย เนื่องจากในการเขียนโปรแกรมตัวแปรจะทำหน้าที่เป็นที่เก็บข้อมูลไว้ในหน่วยความจำหลักหรือแรมในขณะที่มีการดำเนินการโปรแกรม ชื่อของตัวแปรจะเป็นสัญลักษณ์ที่แทนตำแหน่งที่ใช้เก็บข้อมูลในหน่วยความจำทำให้นักเขียนโปรแกรมไม่ต้องอ้างถึงหมายเลขหน่วยความจำโดยตรง ดังนั้นในการระบุถึงตำแหน่งที่เก็บข้อมูลแต่ละตำแหน่งได้อย่างถูกต้องนั้นตัวแปรแต่ละตัวจะต้องมีชื่อที่ไม่ซ้ำกัน และควรตั้งชื่อให้สื่อความหมายถึงข้อมูลที่จัดเก็บอยู่ในตัวแปรนั้นเพื่อให้สามารถอ่านหรือทำความเข้าใจโปรแกรมที่เขียนขึ้นได้ง่าย การตั้งชื่อตัวแปร ชื่อคลาส และชื่อเมท็อดในภาษาจาวามีกฎเกณฑ์เป็นดังนี้
ชื่อตัวแปรสามารถประกอบไปด้วยตัวอักษร (A-Z, a-z) ตัวเลข (0-9) เครื่องหมายขีดล่าง (“_”) ได้
ชื่อตัวแปรต้องขึ้นต้นด้วยตัวอักษรหรือเครื่องหมายขีดล่างเท่านั้น
ห้ามมีช่องว่างในชื่อตัวแปร
ห้ามใส่สัญลักษณ์พิเศษในชื่อตัวแปร ยกเว้นเครื่องหมาย $ (ดอลลาร์)
ห้ามตั้งชื่อตัวแปรซ้ำกับคำสงวน (reserve words)
ห้ามตั้งชื่อตัวแปรซ้ำกัน
นอกจากกฎเหล่านี้แล้วยังมีสิ่งที่นักเขียนโปรแกรมควรทราบ คือ ภาษาจาวาไวต่อตัวอักษรใหญ่เล็ก (case sensitive) การตั้งชื่อด้วยตัวอักษรพิมพ์ใหญ่พิมพ์เล็กในภาษาจาวาจึงมีความแตกต่างกัน เช่น Student, student, STUDENT และ StuDent เป็นคนละชื่อกัน
ภาษาจาวาไม่ได้จำกัดความยาวของชื่อตัวแปรแต่การตั้งชื่อตัวแปรยาวเกินไปจะทำให้เสียเวลาและยุ่งยากในเขียนโปรแกรม จึงไม่ควรตั้งชื่อให้ยาวเกินความจำเป็นหรือสามารถปรับลดให้เหมาะสม เช่น customerTelephoneNumber อาจใช้เป็น cusTel, studentEmailAddress อาจใช้เป็น stdEmail เป็นต้น
การตั้งชื่อตัวแปรชื่อตัวแปรสามารถประกอบไปด้วยตัวอักษร (A-Z, a-z) ตัวเลข (0-9) เครื่องหมายขีดล่าง (“_”) ตัวอย่างเช่น
การตั้งชื่อตัวแปรชื่อตัวแปรต้องขึ้นต้นด้วยตัวอักษรหรือเครื่องหมายขีดล่างเท่านั้น ตัวอย่างเช่น
ห้ามมีช่องว่างในชื่อตัวแปร ตัวอย่างเช่น
การตั้งชื่อตัวแปรที่มีคำมากกว่า 1 คำ เพื่อหลีกเลี่ยงเว้นวรรคนิยมเขียนคำติดกันโดยให้ตัวอักษรตัวแรกของคำเป็นตัวพิมพ์ใหญ่ ยกเว้นคำแรกที่นิยมใช้อักษรพิมพ์เล็ก เช่น examSore, totalScore, classParticipationScore, customerName, myTelephoneNumber เป็นต้น
ห้ามใส่สัญลักษณ์พิเศษในชื่อตัวแปร ยกเว้นเครื่องหมาย $ (ดอลลาร์) ตัวอย่างเช่น
ตัวอย่างคำสงวนในภาษาจาวา เช่น abstract, asset, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum, extends, final, finally, float, for, goto, if, implements, import, instnaceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while
2.5 การให้ค่าตัวแปรและการใช้ตัวแปร
เครื่องหมาย = ในภาษาจาวาเป็นตัวดำเนินการกำหนดค่าให้กับตัวแปรทางด้านซ้ายของเครื่องหมาย = โดยนำค่าหรือผลการคำนวณทางด้านขวาของเครื่องหมายเท่ากับมากำหนดค่าหรือใส่ค่าในตัวแปรทางซ้ายของเครื่องหมายเท่ากับ นอกจากนี้แล้วในการกำหนดหรือใส่ค่าให้ตัวแปรจะต้องคำนึงถึงชนิดของข้อมูลและช่วงของข้อมูลที่สามารถจัดเก็บได้ในตัวแปรแต่ละชนิด เช่น ตัวเลขจำนวนเต็ม 3400 ไม่สามารถใส่ค่าตัวแปรชนิด byte ได้ เนื่องจากตัวแปร byte จะสามารถเก็บค่าของเลขจำนวนเต็มได้ไม่เกิน 127 เท่านั้นดังได้กล่าวถึงก่อนหน้านี้แล้ว
การกำหนดค่าให้กับตัวแปรสามารถกำหนดค่าเริ่มต้นให้กับตัวแปรได้ทันทีพร้อมกับการประกาศตัวแปร หรือจะกำหนดค่าภายหลังจากการประกาศตัวแปรแล้วก็ได้ ดังตัวอย่างที่ 2.3
จากโปรแกรมตัวอย่างที่ 2.3 บรรทัดที่ 3 ประกาศตัวแปรชื่อ price ให้เป็นชนิด double แล้วกำหนดค่าเริ่มต้นให้เท่ากับ 34500 ส่วนตัวแปร count มีการประกาศตัวแปรในบรรทัดที่ 6 ให้เป็นชนิด int แต่มีการกำหนดค่าในบรรทัดที่ 9 ให้มีค่าเท่ากับ 10 และตัวแปร num มีการประกาศตัวแปรในบรรทัดที่ 7 และนำค่าคือ 7 ไปใส่ในตัวแปร num ที่บรรทัดที่ 8
นอกจากนี้แล้วจากโปรแกรมตัวอย่างที่ 2.3 การให้ค่าตัวแปรชนิด float จะต้องใส่ตัวอักษร f พิมพ์เล็กต่อท้ายด้วยเพื่อให้รู้ว่าเป็นเลขทศนิยมชนิด float เพราะการเขียนเลขทศนิยมโดยทั่วไปภาษาจาวาจะมองว่าเป็นตัวเลขชนิด double และเช่นเดียวกับการกำหนดค่าให้กับตัวแปรชนิด long จะต้องใส่ตัวอักษร l พิมพ์เล็กต่อท้ายตัวเลขด้วยเพื่อให้รู้ว่าเป็นจำนวนเต็มชนิด long
ตัวอย่างการกำหนดค่าให้กับตัวแปรในกลุ่มตัวเลขเป็นดังตัวอย่างที่ 2.4
โปรแกรมตัวอย่างที่ 2.5 เป็นตัวอย่างของการให้ค่าตัวแปรชนิด boolean ซึ่งในภาษาจาวาจะมีค่าได้ 2 แบบเท่านั้นคือ true แทนจริง และ false แทนเท็จ บรรทัดที่ 8 เป็นการเปรียบเทียบว่า num1 มากกว่า num2 หรือไม่ แล้วนำผลไปใส่ในตัวแปร x ซึ่ง 5 > 10 เป็นเท็จ (false) ดังนั้นตัวแปร x จึงมีค่าเท่ากับ false บรรทัดที่ 9 เป็นการเปรียบเทียบว่า num1 น้อยกว่า num2 หรือไม่ แล้วนำผลไปใส่ในตัวแปร y ซึ่ง 5 < 10 เป็นจริง (true) ดังนั้นตัวแปร y จึงมีค่าเท่ากับ true
ตัวอย่างที่ 2.6 เป็นโปรแกรมที่แสดงการกำหนดค่าให้กับตัวแปรชนิด char จะเห็นได้ว่าการกำหนดค่านั้นตัวอักษรจะต้องอยู่ในเครื่องหมายอัญประกาศเดี่ยว (’ ’) และในการดำเนินการ + สำหรับข้อมูลชนิดตัวอักษรหมายถึงการนำตัวอักษรหรือข้อความมาต่อกัน
2.6 ตัวแปรค่าคงที่
การกำหนดตัวแปรให้มีค่าคงที่ซึ่งทำให้ตัวแปรนั้นไม่สามารถเปลี่ยนแปลงค่าได้ มีรูปแบบการประกาศตัวแปรดังนี้
ตัวอย่างที่ 2.7 โปรแกรมจะเกิดข้อผิดพลาดที่บรรทัดที่ 4 เนื่องจากตัวแปร vat เป็นค่าคงที่หรือตัวแปรแบบ final ไม่สามารถนำเอาข้อมูลใหม่มาใส่ได้หรือไม่สามารถเปลี่ยนค่าได้ ค่าของตัวแปร vat จะต้องมีค่าเป็น 0.07 ตลอดทั้งโปรแกรม
ตัวอย่างของข้อความแจ้งข้อผิดคลาดจากโปรแกรมในตัวอย่างที่ 2.7 คือ error: cannot assign a value to final variable vat
การใช้ตัวแปรใช้เพื่อเก็บข้อมูลในหลายหน้าที่ เช่น การเก็บข้อมูลนำเข้าที่รับจากผู้ใช้งาน การเก็บข้อมูลเพิ่มเติมอื่น ๆ ที่ใช้ในระหว่างประมวลผล และการเก็บข้อมูลผลลัพธ์เพื่อนำไปแสดงผล
2.7 คุณสมบัติและข้อควรรู้เกี่ยวกับตัวแปร
สรุปคุณสมบัติของตัวแปรและข้อผิดพลาดเกี่ยวกับตัวแปรที่พบบ่อย เช่น
ห้ามตั้งชื่อตัวแปรซ้ำกัน ตัวอย่างข้อความแจ้งข้อผิดพลาดในกรณีนี้ คือ error: …. is already defined in main(java.lang.String[])
ต้องประกาศหรือสร้างตัวแปรก่อนการเรียกใช้ตัวแปรโดยสามารถประกาศที่ใดก็ได้แต่ต้องประกาศก่อนการเรียกใช้ ตัวอย่างข้อความแจ้งข้อผิดพลาดในกรณีนี้คือ error: cannot find symbol variable ….
ตัวแปรที่ยังไม่ข้อมูลเก็บอยู่หรือยังไม่ได้กำหนดค่าให้กับตัวแปร ตัวแปรนั้นจะเรียกใช้ไม่ได้ ตัวอย่างข้อความแจ้งข้อผิดพลาดในกรณีนี้คือ error: Variable … might not have been initialized.
ไม่สามารถใส่ข้อมูลตัวหนังสือลงไปในตัวแปรชนิดตัวเลขได้ ตัวอย่างข้อความแจ้งข้อผิดพลาดในกรณีนี้คือ error: incompatible types
ข้อมูลตัวเลขชนิดที่มีนัยสำคัญสูงกว่าหรือมีขนาดใหญ่กว่าจะนำมาใส่ในตัวแปรที่มีนัยสำคัญหรือขนาดเล็กกว่าไม่ได้ เช่น ตัวเลขทศนิยมชนิด double ไม่สามารถนำไปเก็บในตัวแปรชนิด int ได้ เป็นต้น ตัวอย่างข้อความแจ้งข้อผิดพลาดในกรณีนี้คือ
error: possible loss of precision
ถ้าจะนำตัวเลขชนิดที่มีนัยสำคัญต่ำกว่ามาเก็บในตัวแปรชนิดที่มีนัยสำคัญต่ำกว่านักเขียนโปรแกรมจะต้องทำการแปลงหรือเปลี่ยนชนิดข้อมูลเสียก่อนแต่ถ้านำข้อมูลชนิดตัวเลขที่มีนัยสำคัญต่ำกว่ามาใส่ในตัวแปรที่มีนัยสำคัญสูงกว่าสามารถทำได้
2.8 การเปลี่ยนประเภทข้อมูล
การเปลี่ยนประเภทหรือชนิดของข้อมูลในภาษาจาวามี 2 ประเภทคือ
- การเปลี่ยนชนิดข้อมูลโดยปริยาย (implicit type conversion) เป็นการแปลงชนิดข้อมูลที่ภาษาจาวาทำให้โดยอัตโนมัติ ตัวอย่างเช่น เมื่อนำข้อมูลตัวเลขจำนวนเต็มชนิด int ไปเก็บในตัวแปรชนิด double ข้อมูลจะถูกเปลี่ยนเป็นตัวเลขทศนิยมชนิด double โดยอัตโนมัติ หรือการนำข้อมูลชนิด byte ไปใส่ในตัวแปรชนิด int เป็นต้น สำหรับข้อมูลในกลุ่มตัวเลขนั้นการนำข้อมูลชนิดที่มีนัยสำคัญต่ำกว่าไปเก็บในตัวแปรที่มีนัยสำคัญสูงกว่าภาษาจาวาจะเปลี่ยนชนิดข้อมูลให้แบบอัตโนมัติ นัยสำคัญของชนิดข้อมูลเป็นดังตารางที่ 2.2
ตารางที่ 2.2 นัยสำคัญของชนิดข้อมูลในภาษาจาวา
- การเปลี่ยนชนิดข้อมูลแบบชัดแจ้ง (explicit type conversion) หรือ casting เป็นการเปลี่ยนชนิดข้อมูลที่ต้องกำหนดชนิดข้อมูลเอง โดยการเปลี่ยนชนิดข้อมูลประเภทนี้นักเขียนโปรแกรมต้องกระทำเอง เช่น หากต้องการนำข้อมูลตัวเลขขนาดใหญ่กว่าไปเก็บในตัวแปรที่มีขนาดเล็กกว่าจะทำให้สูญเสียข้อมูลบางส่วนไป หรือข้อมูลตัวเลขเดิมมีขนาดเล็กกว่าแต่ต้องการเปลี่ยนชนิดให้เป็นข้อมูลขนาดใหญ่ขึ้น เป็นต้น
วิธีการเปลี่ยนประเภทข้อมูลตัวเลขไปเป็นตัวเลขอีกชนิดหนึ่งทำได้โดยให้ใส่ชนิดข้อมูลที่ต้องการเปลี่ยนในวงเล็บ ( ) แล้ววางไว้ด้านหน้าข้อมูลหรือตัวแปร เช่น เปลี่ยนจาก double ไปเป็น int ให้ใส่ (int) หน้าข้อมูลชนิด double ที่ต้องการเปลี่ยนเป็น int, เปลี่ยนจาก int ไปเป็น double ให้ใส่ (double) หน้าข้อมูลชนิด int ที่ต้องการเปลี่ยนเป็น double เป็นต้น ดังตัวอย่างต่อไปนี้
จากตัวอย่างที่ 2.8 การนำค่าในตัวแปร x ชนิด int คือ 45 ไปเก็บในตัวแปร mean ที่เป็นชนิด double เป็นการเปลี่ยนชนิดโดยปริยาย ทำให้ค่า 45 เมื่อเปลี่ยนเป็นชนิด double โดยอัตโนมัติคือ 45.0 ซึ่งเป็นชนิด double สำหรับการนำค่าในตัวแปร score ที่เป็นชนิด double ไปเก็บในตัวแปร netScore ที่เป็นชนิด int ได้มีการเปลี่ยนประเภทข้อมูลแบบชัดแจ้งคือมีการบังคับเปลี่ยนชนิดจาก double ไปเป็นข้อมูลชนิด int ทำให้จากเดิมมีข้อมูลคือ 79.65 เมื่อเปลี่ยนชนิดแล้วได้ข้อมูลคือ 79 สูญเสียค่าในส่วนของเศษที่เป็นจุดทศนิยมไป
การเปลี่ยนประเภทตัวแปรจาก int ไปเป็น String จะใช้เมท็อด toString จากคลาส Interger ตัวอย่างคำสั่ง เช่น
จากตัวอย่างข้างต้น String ชื่อ content จะมีค่าข้อความคือ 85 เก็บอยู่ซึ่งข้อความนี้ไม่สามารถนำไปใช้คำนวณค่าทางคณิตศาสตร์ได้
นอกจากนี้การเปลี่ยนข้อมูลชนิดตัวเลขไป String สามารถทำได้โดยนำค่าตัวเลขนั้นไปบวก (+) กับข้อความว่าง “” เพราะในการต่อข้อความกับตัวเลขจะทำการเปลี่ยนตัวเลขไปเป็น String ก่อนแล้วเอามาต่อกันกับข้อความว่า ตัวอย่างคำสั่ง เช่น
การเปลี่ยนข้อมูลชนิดข้อความไปเป็นตัวเลขจำนวนเต็มชนิด int ใช้เมท็อด parseInt จากคลาส Interger ตัวอย่างคำสั่ง เช่น
จากตัวอย่างข้างต้นเป็นการเปลี่ยนข้อความ 94 ใน String ชื่อ content ให้เป็นตัวเลขจำนวนเต็มชนิด int ที่สามารถนำไปใช้ในการคำนวณได้ซึ่งจัดเก็บไว้ที่ตัวแปร price
การเปลี่ยนข้อมูลชนิดข้อความไปเป็นตัวเลขทศนิยมชนิด double ใช้เมท็อด parseDouble จากคลาส Double ตัวอย่างคำสั่ง เช่น
จากตัวอย่างข้างต้นเป็นการเปลี่ยนข้อความ 3.14 ใน String ชื่อ text ให้เป็นตัวเลขทศนิยมชนิด double ที่สามารถนำไปใช้ในการคำนวณได้ซึ่งจัดเก็บไว้ที่ตัวแปร pi
String คือข้อมูลที่ประกอบด้วยตัวอักษร และสัญลักษณ์ต่าง ๆ ได้มากกว่าหนึ่งตัว หรือเรียกว่าข้อความ หรือชุดของตัวอักษร ข้อมูลแบบ String จะต้องเขียนอยู่ในเครื่องหมายอัญประกาศคู่ (““) เช่น”Hello, world!“,”Chongkolnee Rungruang” เป็นต้น ตัวอย่างการใช้งาน เช่น
String ไม่ใช่ชนิดข้อมูลพื้นฐานในภาษาจาวาแต่ถือเป็นข้อมูลแบบอ็อบเจกต์ String จะมีการจัดเก็บอยู่ในหน่วยความจำในตำแหน่งที่ต่อเนื่องกันทีละตัวโดยนับตัวอักษรแรกเป็นตำแหน่งที่ 0 ภาษาจาวาได้กำหนดรูปแบบไว้ในคลาส String และมีบริการหรือเมท็อดให้ใช้งานที่น่าสนใจ เช่น
เมท็อด length() ให้ค่าความยาวของข้อความ มีรูปแบบการเรียกใช้ ดังตัวอย่างต่อไปนี้
เมท็อด substring(i, j) ให้ข้อความใหม่ที่ตัดมาจากข้อความเดิมในตำแหน่งที่ i ถึงตำแหน่งที่ j-1 โดยภาษาจาวาตำแหน่งของข้อความจะเริ่มต้นที่ตำแหน่งที่ 0 ตัวอย่างเช่น
จากตัวอย่างเป็นการตัดข้อความตั้งแต่ตัวอักษรตำแหน่งที่ 0 ถึงตำแหน่งที่ 2 (ตัดหน้าตำแหน่งที่ 0 และหน้าตำแหน่งที่ 3)
เมท็อด substring(i) ให้ข้อความใหม่ที่ตัดมาจากข้อความเดิมในตำแหน่งที่ i ถึงสุดท้ายของข้อความ ตัวอย่างเช่น
จากตัวอย่างเป็นการตัดข้อความตั้งแต่ตำแหน่งที่ 4 จนถึงตำแหน่งสุดท้าย
การดำเนินการต่อกัน (concatenation) ของข้อความใช้เครื่องหมายบวก (+) ตัวอย่างเช่น
คำสั่งและการจัดรูปแบบการพิมพ์ผลลัพธ์
ภาษาจาวาใช้ System.out หมายถึงอุปกรณ์ส่งออกมาตรฐาน (standard output device) ซึ่งโดยทั่วไปคือจอเฝ้าคุม (console) หรือจอภาพ การแสดงผลทางจอภาพอย่างง่ายใช้เมท็อด println เพื่อแสดงค่าหรือข้อความทางจอภาพ โดยมีรูปแบบคำสั่งในการพิมพ์ข้อความทางจอภาพ คือ
เป็นการพิมพ์ค่าหรือข้อความในวงเล็บออกทางจอภาพเมื่อพิมพ์เสร็จแล้วจะขึ้นบรรทัดใหม่หรือย้ายตัวชี้ตำแหน่ง (cursor) ไปยังบรรทัดถัดไป (next line) ส่วนเมท็อด print เป็นการแสดงค่าหรือข้อความในวงเล็บแล้วจะไม่มีการขึ้นบรรทัดใหม่ ตัวอย่างเช่น
การจัดรูปแบบโดยแทรกอยู่ในข้อความสามารถใช้อักขระหลีก (escape characters) รวมกับอักขระที่ตามมาเพื่อให้ตัวแปรโปรแกรมเข้าใจว่าไม่ใช่การแสดงผลข้อความตามปกติ แต่จะมีความหมายพิเศษตามที่กำหนด เช่น
\n หมายถึง การขึ้นบรรทัดใหม่
\t หมายถึง การเว้นวรรคเหมือนกับการกดปุ่มแท็บ
การพิมพ์สัญลักษณ์พิเศษ เช่น
\" ใช้สำหรับการสั่งพิมพ์เครื่องหมาย " ออกทางจอภาพ
\’ ใช้สำหรับการสั่งพิมพ์เครื่องหมาย ‘ ออกทางจอภาพ
\\ ใช้สำหรับการสั่งพิมพ์เครื่องหมาย \ ออกทางจอภาพ
2.9 การอ่านข้อมูลจากแป้นพิมพ์
ภาษาจาวาใช้ System.in หมายถึงอุปกรณ์นำเข้าข้อมูลมาตรฐาน (standard input device) ซึ่งโดยทั่วไปคือแป้นพิมพ์ เราสามารถใช้คลาส Scanner เพื่อสร้างอ็อบเจกต์ในการอ่านค่าจาก System.in ทางแป้นพิมพ์ซึ่งต้องมีการนำเข้าใช้ในโปรแกรมก่อน ด้วยคำสั่ง ดังนี้
โดยสร้างค่า scanner เป็นอ็อบเจกต์ในการอ่านค่าข้อมูล นอกจากนี้ก่อนการใช้งานคลาส Scannerจะต้องมีการนำเข้าเครื่องมือหรือคลาสนี้เข้าในโปรแกรมด้วยการใส่ import java.util.Scanner; ไว้ก่อน public class และสร้างต้องสร้างตัวรับข้อมูลที่กล่าวมาแล้วข้างต้นด้วย เมท็อดในการอ่านค่าแต่ละชนิด ได้แก่
สำหรับการอ่านค่ามาเก็บในตัวแปรชนิด char สามารถใช้ nextLine().charAt(0) เป็นการอ่านข้อความทั้งบรรทัดแล้วเอาเฉพาะตัวอักษรตัวแรกก็คืออักษรตำแหน่งที่ 0 มาเพียงตัวเดียว
โปรแกรมตัวอย่างที่ 2.10 มีการนำเข้าคลาส Scanner ในบรรทัดที่ 1 และสร้างตัวรับค่าขื่อมูลชื่อ sc ในบรรทัดที่ 5 การสั่งทำงานโปรแกรมบรรทัดที่ 7 จะแสดงข้อความว่า Enter a string เพื่อแจ้งให้ผู้ใช้ทราบว่าจะต้องดำเนินการป้อนข้อความ หลังจากนั้นบรรทัดที่ 8 จะรอจนกว่าผู้ใช้จะป้อนข้อความทางแป้นพิมพ์แล้วกดปุ่ม enter จึงจะทำให้โปรแกรมทำงานต่อในบรรทัดที่ 10 ซึ่งแสดงข้อความ Enter a character เพื่อให้ผู้ใช้ทราบว่าต้องป้อนตัวอักษร แล้วบรรทัดที่ 11 จะรอจนกว่าผู้ใช้จะป้อนข้อมูลและกดปุ่ม enter โปรแกรมจึงจะทำงานอีกครั้งในบรรทัดต่อไปเป็นเช่นนี้ไปเรื่อย ๆ ในส่วนบรรทัดอื่น ๆ ที่มีการแสดงข้อความและรับค่าข้อมูลทางแป้นพิมพ์ ผลลัพธ์ของข้อความและค่าที่แสดงผลออกทางจอภาพจะขึ้นกับสิ่งที่ผู้ใช้ป้อนทางแป้นพิมพ์ หากผู้ใช้ป้อนข้อมูลไม่ตรงตามประเภทที่กำหนดจะทำให้เกิดข้อผิดพลาดของโปรแกรมขณะดำเนินงาน และโปรแกรมจะหยุดการทำงาน
แบบฝึกหัด
- ให้ระบุว่าข้อใดเป็นชื่อตัวแปรที่ตั้งชื่อได้ถูกต้องหรือไม่ถูกต้องโดยใส่เครื่องหมายถูก (/) หรือเครื่องผิด (x) หน้าข้อ และหากข้อใดเป็นชื่อตัวแปรที่ผิดให้แก้ไขให้ถูกต้องด้วยโดยเขียนตอบในส่วนที่เว้นว่างไว้
1.1 ______ double ______________________
1.2 ______ #Age ______________________
1.3 ______ *true* ______________________
1.4 ______ name ______________________
1.5 ______ 3Degree ______________________
1.6 ______ Money$ ______________________
1.7 ______ public ______________________
1.8 ______ First Name ______________________
1.9 ______ strName ______________________
1.10 ______ _grade ______________________
- ให้ระบุว่าข้อใดเป็นการประกาศตัวแปรที่ถูกต้องหรือไม่ถูกต้องโดยใส่เครื่องหมายถูก (/) หรือเครื่องผิด (x) หน้าข้อ และหากข้อใดเป็นการประกาศตัวแปรที่ผิดให้แก้ไขให้ถูกต้องด้วยโดยเขียนตอบในส่วนที่เว้นว่างไว้
2.1 _________ char gender = “Female” _______________________________________________________________________
2.2 _________ float price = 2.0; _______________________________________________________________________
2.3 _________ long num = 125.50 _______________________________________________________________________
2.4 _________ int age = 25, int score = 15; _______________________________________________________________________
2.5 _________ String grade = ‘B+’; _______________________________________________________________________
- ให้หาผลลัพธ์ของค่าของตัวแปร result จากส่วนของโปรแกรมต่อไปนี้
result =______________
result =______________
result =______________
result =______________
result =______________
- ให้เติมส่วนของโปรแกรมลงในช่องว่างให้สมบูรณ์เพื่อให้ได้ผลลัพธ์ตามที่กำหนดให้
- ให้เขียนผลลัพธ์ที่พิมพ์ออกทางจอภาพจากการดำเนินการในส่วนของโปรแกรมที่กำหนดให้ต่อไปนี้
- ให้เขียนโปรแกรมรับค่าคะแนนสอบกลางภาคและคะแนนสอบปลายภาคแล้วนำมาหาผลรวมคะแนนสอบจากโจทย์ในตัวอย่างที่ 1.3 โดยให้มีหน้าจอในส่วนโต้ตอบผู้ใช้และการตั้งชื่อตัวแปรดังนี้
ให้เขียนโปรแกรมเพื่อรับยอดซื้อสินค้าทั้งหมดและยอดเงินจากคูปองส่วนลด แล้วคำนวณหายอดเงินที่ต้องจ่ายหลังหักส่วนลดจากคูปองแล้ว พร้อมทั้งแสดงผลลัพธ์ออกทางจอภาพ
ให้เขียนโปรแกรมโดยประกาศตัวแปร (กำหนดชนิดและตั้งชื่อให้เหมาะสม) เพื่อเก็บข้อมูลลูกค้าดังต่อไปนี้ คือ เลขประจำตัวประชาชน, ชื่อ, สกุล, ส่วนสูง, อายุ, อีเมล และหมายเลขโทรศัพท์ โดยให้ทำการรับค่าทางแป้นพิมพ์มาใส่ในตัวแปรที่ประกาศขึ้นนี้ และพิมพ์ข้อมูลในแต่ละตัวแปรออกทางจอภาพโดยให้ออกแบบรูปแบบการแสดงผลให้มีความเหมาะสมและสวยงาม