OOP (Object-Oriented Programming) หรือ การเขียนโปรแกรมเชิงวัตถุ คือแนวคิดในการเขียนโปรแกรมที่ มองทุกอย่างเป็น “วัตถุ” (object) ซึ่งแต่ละวัตถุจะมี
- คุณสมบัติ (Properties หรือ Attributes) เช่น ชื่อ, อายุ
- พฤติกรรม (Methods หรือ Functions) เช่น พูด, เดิน
Class และ Object คืออะไร
1. Class คือ พิมพ์เขียว (blueprint) หรือ แม่แบบ ที่ใช้สร้างวัตถุ (object) มันบอกว่า object ที่สร้างจาก class นี้ควรมี ข้อมูลอะไร (property) และสามารถ ทำอะไรได้บ้าง (method)
2. Object (อินสแตนซ์ของคลาส) สิ่งที่ถูกสร้างมาจาก class เราสร้าง object ได้หลายตัวจาก class เดียวกัน และแต่ละตัวก็อาจมีค่า property ต่างกันได้ มักจะเรียกผ่าน runtime เช่น const objectName = new ClassName()
องค์ประกอบหลักของ OOP
1. Encapsulation การซ่อนรายละเอียดการทำงานไว้ภายใน object โดยควบคุมไม่ให้โค้ดภายนอกเข้าถึงหรือเปลี่ยนแปลงได้โดยตรง สามารถป้องกันการเข้าถึงหรือเปลี่ยนแปลงข้อมูลที่ไม่ปลอดภัย โดยจำกัดขอบเขตการเข้าถึง (access modifiers เช่น private, public)
2. Inheritance การสืบทอดคุณสมบัติจากคลาสแม่ (เช่น “แมว” สืบทอดจาก “สัตว์”)
3. Polymorphism ความสามารถในการใช้ชื่อ method เดียวกับที่ Class แม่มี แต่ทำงานแตกต่างจากเดิม
4. Abstraction การซ่อนความซับซ้อน และเปิดเผยเฉพาะสิ่งที่จำเป็น คือ รู้แค่ว่ามันทำได้ แต่ไม่ต้องรู้ว่าทำอย่างไร เช่น รู้แค่ว่ารถมันขับไปข้างหน้าได้ แต่ไม่ต้องรู้ว่ามอเตอร์หมุนล้อยังไง
ตัวอย่าง OOP ใน Java
1. Class และ Object
// Person.java
public class Person {
// Properties / Attributes / filed
String name;
int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Method
public void greet() {
System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");
}
}
public class Person { … }
- เป็นการประกาศ คลาสชื่อว่า Person
- คลาสนี้คือ template หรือพิมพ์เขียว สำหรับสร้าง “วัตถุ” (object) ที่แทนคนหนึ่งคน
- Properties/Attributes/fields คือ ตัวแปรที่เก็บข้อมูลของอ็อบเจ็กต์แต่ละตัวที่สร้างมาจากคลาสนั้น
public Person(String name, int age) { … }
- เป็น constructor ซึ่งจะถูกเรียกตอนสร้าง object ใหม่จากคลาสนี้
- กำหนดค่าเริ่มต้นให้กับ Properties (fields) ของอ็อบเจ็กต์ตอนสร้างขึ้นมา
- เรียกใช้โดยอัตโนมัติทันทีตอนที่เราใช้คำสั่ง new เพื่อสร้างอ็อบเจ็กต์
- รับค่าชื่อ (name) และอายุ (age) เข้ามา แล้วกำหนดให้กับตัวแปรในคลาส
this.name = name หมายถึง
- this.name → ตัวแปรของ object ปัจจุบัน
- name (ฝั่งขวา) → คือค่าที่ส่งเข้ามาจากภายนอกตอนสร้าง object
2. Inheritance (การสืบทอด)
// Student.java
// สืบทอดจาก Person
public class Student extends Person {
String school;
public Student(String name, int age, String school) {
super(name, age); // เรียก constructor ของคลาสแม่
this.school = school;
}
public void study() {
System.out.println(name + " is studying at " + school);
}
}
public class Student extends Person { … }
- นี่คือการสร้าง คลาสลูก (child class) ชื่อ Student
- คำว่า extends Person หมายความว่า Student สืบทอด (inherit) จากคลาส Person
- ดังนั้น Student จะสามารถ ใช้คุณสมบัติ (property) และ เมธอด (method) ที่อยู่ใน Person ได้ทันที
super(name, age);
- ใช้สำหรับ เรียก constructor ของคลาสแม่ (Person)
- เพื่อให้ Person จัดการกำหนดค่า name และ age
- ถ้าไม่เรียก super(…) และคลาสแม่ไม่มี constructor แบบ default → โปรแกรมจะ Error
3. Polymorphism (พหุรูปแบบ)
// Teacher.java
public class Teacher extends Person {
String subject;
public Teacher(String name, int age, String subject) {
super(name, age);
this.subject = subject;
}
// Override method
@Override
public void greet() {
System.out.println("Hello, I'm teacher " + name + " and I teach " + subject);
}
}
- คำว่า @Override บอก Java ว่าเรากำลัง เขียนทับ (override) เมธอด greet() ของคลาสแม่
- แทนที่จะเรียกใช้ greet() ของคลาสแม่ กลับเรียกใช้ greet() ของ Teacher แทน
4. Encapsulation (การซ่อนข้อมูล)
// Account.java
public class Account {
private double balance;
public Account(double initialBalance) {
balance = initialBalance;
}
// Getter
public double getBalance() {
return balance;
}
// Setter
public void deposit(double amount) {
if (amount > 0) balance += amount;
}
}
การ “ซ่อน” ข้อมูลภายใน object โดยไม่ให้ภายนอกเข้าถึงตรง ๆ และให้เข้าถึงผ่าน “ประตูควบคุม” เช่น Getter/Setter เท่านั้น
public double getBalance()
- เป็น getter → ใช้สำหรับ “ดู” ข้อมูลที่ถูกซ่อนไว้ (ในที่นี้คือยอดเงิน)
- คำว่า getBalance() → อ่านยอดเงิน แต่ยังคงไม่เปิดเผยตัวแปร balance ตรง ๆ
public void deposit(double amount)
- เป็น setter แบบมีเงื่อนไข โดยตรวจสอบว่า if (amount > 0)
- ใช้สำหรับ เพิ่มเงินเข้าบัญชี
5. การใช้งานทั้งหมดใน Main
// Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
person.greet(); // Hello, my name is Alice and I'm 30 years old.
Student student = new Student("Bob", 20, "ABC University");
student.greet(); // Hello, my name is Bob and I'm 20 years old.
student.study(); // Bob is studying at ABC University
Teacher teacher = new Teacher("Mr. John", 40, "Math");
teacher.greet(); // Hello, I'm teacher Mr. John and I teach Math
Account acc = new Account(1000);
acc.deposit(500);
System.out.println("Current balance: " + acc.getBalance()); // Current balance: 1500.0
}
}
- Person และ Student เรียก greet() จาก class แม่ จึงมี format เหมือนกัน
- Student เรียก greet() จาก class ของตัวเอง (@Override) ทับ class แม่ จึงได้ผลลัพธ์ที่แตกต่าง (Polymorphism เหมือนการกระทำแบบเดิมแต่ได้ผลลัพธ์ที่แตกต่าง)
ตัวอย่างแบบ Abstraction (นามธรรม)
6. Abstraction (นามธรรม)
// Animal.java
// Abstract class
public abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
// Abstract method: ไม่มีรายละเอียด
public abstract void makeSound();
// Concrete method
public void sleep() {
System.out.println(name + " is sleeping...");
}
}
7. คลาสลูกที่สืบทอดและ implement method
// Dog.java
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " says: Woof Woof!");
}
}
// Cat.java
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " says: Meow!");
}
}
8. เพิ่มใน Main
// Main.java
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("Buddy");
Animal cat = new Cat("Kitty");
dog.makeSound(); // Buddy says: Woof Woof!
cat.makeSound(); // Kitty says: Meow!
dog.sleep(); // Buddy is sleeping...
cat.sleep(); // Kitty is sleeping...
}
}