Menu
CoddyTech

Apa Itu Polimorfisme?

Dalam pemrograman, polimorfisme (polymorphism) adalah kemampuan satu potong kode, seperti pemanggilan fungsi atau nama method, untuk bekerja dengan nilai-nilai bertipe berbeda, dengan setiap tipe menyediakan perilakunya sendiri. Memanggil shape.area() menjalankan perhitungan yang berbeda untuk lingkaran dan untuk persegi.

Oleh Kevin Spektor, Co-founder & CTO

Diperbarui 24 September 2026

Di Python, len("hello") mengembalikan 5, len([4, 8, 15]) mengembalikan 3, dan len({"a": 1}) mengembalikan 1. Satu nama fungsi dipakai pada tiga tipe, dan setiap tipe menghitung dengan caranya sendiri: string menghitung karakter, list menghitung item, dictionary menghitung key. Katanya berasal dari bahasa Yunani: poly, banyak, dan morph, bentuk. Satu pemanggilan, banyak bentuk perilaku.

Cara kerja polimorfisme

Kode memanggil method lewat namanya, seperti shape.area(). Saat baris itu dijalankan, bahasa pemrograman melihat objek yang sebenarnya dan mencari area di class milik objek itu sendiri. Pencarian ini disebut dynamic dispatch, dan inilah yang membuat satu baris bisa mengerjakan hal berbeda untuk objek yang berbeda:

Circle 3.14
Square 9
Circle 12.57

Python mencari method itu di class objeknya lebih dulu, lalu di class-class induknya dengan urutan tetap yang disebut method resolution order. Kalau Square tidak punya area() sendiri, pencarian akan sampai ke Shape.area() dan memunculkan NotImplementedError, tanda bahwa setiap subclass wajib menyediakannya.

Loop itu tidak pernah memeriksa jenis bentuk apa yang dipegangnya. Untuk menambahkan segitiga, kamu menulis class Triangle dengan area()-nya sendiri, dan loop itu tetap berjalan tanpa diubah. Tanpa polimorfisme, loop itu akan butuh cabang if isinstance(...) untuk setiap bentuk, yang harus diedit setiap kali ada bentuk baru.

Jenis-jenis polimorfisme

JenisDisebut jugaBentuknyaKapan versinya dipilih
SubtypeRuntime polymorphism, method overridingSubclass menggantikan method milik induknyaSaat program berjalan
Ad hocOverloadingSatu nama, beberapa versi untuk tipe parameter yang berbeda; juga operator overloadingSaat compile time di Java dan C++
ParametrikGenerics, templateSatu potong kode yang berfungsi untuk tipe apa pun: List<T> di Java, vector<T> di C++Saat compile time

Saat orang menyebut "polimorfisme" dalam pemrograman berorientasi objek tanpa keterangan lebih lanjut, hampir selalu yang dimaksud adalah baris pertama: subtype polymorphism lewat overriding.

Python punya ketiganya dengan caranya sendiri. Overriding bekerja seperti pada contoh bentuk-bentuk tadi. Operator seperti + adalah polimorfisme ad hoc. Fungsi seperti max() dan sorted() bersifat parametrik pada intinya: keduanya menerima list berisi angka, string, atau tanggal, asalkan item-itemnya bisa dibandingkan, dan type hint seperti list[int] atau sebuah TypeVar bisa menyatakannya secara eksplisit.

Polimorfisme compile time vs runtime di Java

Java punya kedua jenisnya, dan pertanyaan wawancara kerja sering menanyakan perbedaannya:

class Animal { String sound() { return "..."; } }
class Dog extends Animal {
    @Override String sound() { return "Woof"; }
}

Animal pet = new Dog();
pet.sound();          // "Woof": chosen at run time from the object

int add(int a, int b)          { return a + b; }
double add(double a, double b) { return a + b; }
add(2, 3);            // int version, chosen by the compiler
add(2.5, 1.0);        // double version

Variabel pet bertipe Animal, tetapi versi Dog yang berjalan, karena pilihannya bergantung pada objeknya, bukan variabelnya. Kedua method add adalah overloading: compiler memilih salah satunya dari tipe argumen sebelum program berjalan. Interface memberi perilaku runtime yang sama tanpa berbagi kode: class apa pun yang mengimplementasikan Comparable bisa diurutkan oleh Collections.sort. C++ bekerja dengan cara yang sama, dengan satu perbedaan: sebuah method baru mendapat dispatch saat runtime kalau dideklarasikan virtual. Lihat polimorfisme di Java, method overloading, dan virtual function C++.

Polimorfisme di Python: duck typing dan operator

Python tidak mewajibkan class induk bersama. Kalau sebuah objek punya method yang dipanggil kodenya, kode itu berjalan: "kalau berjalan seperti bebek dan bersuara seperti bebek, berarti itu bebek". Operator juga bersifat polimorfis. Menulis a + b memanggil a.__add__(b), jadi class buatanmu sendiri bisa mendukung +, len(), dan print():

3 abcd [1, 2]
Vector(11, 22)
5 3 2

Inheritance adalah salah satu cara untuk mendapatkan polimorfisme, bukan syarat. Vector tidak mewarisi apa pun yang istimewa, tetapi len() dan + memperlakukannya seperti tipe bawaan. Dokumentasi inheritance Python menunjukkan jalur lewat subclass.

Kesalahan yang umum

Mengira Python melakukan overloading berdasarkan signature. def kedua dengan nama yang sama diam-diam menggantikan yang pertama:

Hi Ana Silva
Traceback (most recent call last):
  ...
TypeError: greet() missing 1 required positional argument: 'last'

Pakai argumen default saja: def greet(first, last="").

Lupa virtual di C++. Tanpa kata kunci itu, memanggil method lewat pointer ke class dasar akan menjalankan versi class dasar, bahkan saat objeknya adalah subclass.

Override yang mengubah artinya. Kalau area() di salah satu subclass mengembalikan keliling, setiap pemanggil yang memercayai area() akan rusak. Sebuah override harus menepati janji yang dibuat induknya; aturan ini dikenal sebagai Liskov substitution principle.

Pemeriksaan tipe di mana-mana. Rangkaian cabang if type(x) == ... biasanya menjadi tanda bahwa setiap tipe seharusnya membawa method-nya sendiri.

Lanjut ke mana

Polimorfisme bekerja bersama enkapsulasi, yang melindungi data setiap objek, dan abstraksi, yang mendefinisikan interface bersama yang diimplementasikan tipe-tipe itu. Latih overriding di dokumentasi class Python, atau coba kursus Java, di mana overloading dan overriding muncul berdampingan.

Pertanyaan yang sering diajukan

Apa contoh polimorfisme?
Operator + di Python: 1 + 2 menjumlahkan angka, "ab" + "cd" menggabungkan string, dan [1] + [2] menggabungkan list. Simbol yang sama bekerja pada tiga tipe, dan setiap tipe menentukan artinya sendiri. Dalam kode berorientasi objek, contoh klasiknya adalah list berisi bentuk-bentuk, di mana setiap bentuk menjawab area() dengan rumusnya sendiri.
Apa bedanya polimorfisme dan inheritance?

Inheritance membuat sebuah class bisa memakai ulang kode dari class induknya. Polimorfisme membuat kode bisa memperlakukan tipe-tipe yang berbeda lewat satu interface bersama. Inheritance adalah salah satu cara umum untuk mendapatkan polimorfisme, karena subclass bisa meng-override method induknya, tetapi duck typing di Python dan interface di Java memberi polimorfisme tanpa berbagi kode sama sekali.

Apa itu polimorfisme dalam biologi?

Dalam biologi, polimorfisme berarti dua atau lebih bentuk dari sebuah sifat atau gen ada dalam populasi yang sama, seperti golongan darah A, B, AB, dan O pada manusia. Istilah ini berbagi akar kata Yunani, "banyak bentuk", dengan istilah dalam pemrograman, tetapi kedua konsep itu tidak berhubungan.

Apakah Python mendukung method overloading?
Tidak berdasarkan tipe atau jumlah parameter, seperti di Java dan C++. def kedua dengan nama yang sama akan menggantikan yang pertama. Kode Python mendapatkan efek yang sama dengan argumen default, *args, atau functools.singledispatch, yang memilih fungsi berdasarkan tipe argumen pertama.
Kenapa polimorfisme berguna?
Polimorfisme membuatmu bisa menambah tipe baru tanpa mengubah kode yang memakainya. Program menggambar yang memanggil shape.draw() pada setiap bentuk tidak perlu diedit saat kamu menambahkan class segitiga; hanya class baru itu yang ditulis. Tanpa polimorfisme, loop itu akan terus bertambah cabang if baru untuk setiap tipe.
Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai