Tipe turunan (derived type) adalah tipe data buatan pengguna yang mengelompokkan beberapa nilai dengan tipe berbeda di dalam satu nama. Topik ini membahas deklarasi tipe turunan, pemilihan komponen dengan tanda persen, tipe yang bersarang di dalam tipe lain, serta array yang elemennya bertipe turunan. Satu program rekap pengeluaran disertakan dan dijalankan sungguhan, sehingga perilaku setiap konstruksi dapat diuji ulang dengan gfortran.
Mendeklarasikan tipe turunan#
Deklarasi tipe turunan dimulai dengan pernyataan type, diikuti nama tipe dan daftar komponennya, lalu ditutup dengan end type yang mengulang nama tipe tersebut. Komponen dideklarasikan seperti deklarasi variabel biasa, lengkap dengan tipe dan atributnya, sehingga satu tipe boleh memuat bilangan bulat, bilangan real, string, maupun logical sekaligus. Fragmen berikut mendeklarasikan tipe tanggal dengan tiga komponen bilangan bulat.
! tidak-dijalankan
type :: tanggal
integer :: hari
integer :: bulan
integer :: tahun
end type tanggalSetelah tipe dideklarasikan, variabelnya dibuat dengan pernyataan seperti type(tanggal) :: akhir_bulan, dan satu variabel tersebut menyimpan tiga nilai sekaligus sebagai satu kesatuan. Deklarasi tipe ditempatkan di dalam modul atau di bagian deklarasi unit program, tepat setelah implicit none. Pada posisi tersebut, deklarasi tipe terlihat oleh seluruh prosedur pada lingkup yang sama, sehingga antarmuka prosedur dapat menggunakan tipe itu sebagai tipe argumennya.
Mengakses komponen dengan tanda persen#
Akses ke satu komponen dilakukan melalui pemilih komponen (%), yaitu nama objek diikuti tanda persen dan nama komponennya, misalnya akhir_bulan%hari. Ekspresi semacam itu diperlakukan seperti variabel biasa, sehingga nilainya dibaca dalam perhitungan dan diubah melalui penugasan. Bila sebuah komponen sendiri bertipe turunan, pemilihan dirangkai sampai ke komponen terdalam, misalnya catatan(2)%waktu%hari untuk mencapai hari pada tanggal yang tersimpan di dalam catatan kedua.
Penugasan antara dua objek yang bertipe sama menyalin seluruh komponennya dalam satu pernyataan, tanpa menyalin tiap komponen satu per satu. Sifat ini membuat objek tipe turunan mudah diperlakukan sebagai satu nilai, misalnya saat disimpan ke elemen array atau diteruskan sebagai argumen prosedur. Berbeda dengan array, operator kesetaraan == tidak tersedia secara bawaan untuk tipe turunan, sehingga pembandingan ditulis per komponen bila diperlukan.
Constructor dan penugasan nilai#
Constructor struktur (structure constructor) menghasilkan satu nilai bertipe turunan dengan menuliskan nama tipe diikuti daftar nilai komponen di dalam tanda kurung, misalnya tanggal(3, 3, 2026) untuk tanggal tiga Maret 2026. Urutan nilai mengikuti urutan deklarasi komponen, dan tipe bersarang memperoleh nilainya dari constructor tipe yang ditulis di dalamnya, sebagaimana tanggal(3, 3, 2026) menjadi argumen ketiga pada pengeluaran("Beli buku catatan", 32000.0, tanggal(3, 3, 2026)). Nilai hasil constructor ditugaskan ke variabel atau elemen array seperti nilai lainnya.
Constructor yang memiliki kemampuan tambahan berupa nilai bawaan komponen dan penulisan argumen dengan nama dibahas pada topik constructor dan inisialisasi di modul ini. Bentuk dasar sudah cukup untuk topik ini, karena kekuatan utama tipe turunan terletak pada pengelompokan data, bukan pada cara membuat nilainya. Satu hal yang perlu dicatat, jumlah dan tipe nilai pada constructor harus cocok dengan deklarasi komponen, dan ketidakcocokan tersebut ditolak compiler pada saat kompilasi.
Program rekap pengeluaran#
Program berikut mengelompokkan catatan pengeluaran harian dalam satu array bertipe turunan, menghitung totalnya, lalu mencetak daftar beserta total. Tipe tanggal bersarang di dalam tipe pengeluaran, sehingga setiap catatan menyimpan keterangan, jumlah, dan tanggal sebagai satu objek.
program rekap_pengeluaran
implicit none
type :: tanggal
integer :: hari
integer :: bulan
integer :: tahun
end type tanggal
type :: pengeluaran
character(len=24) :: keterangan
real :: jumlah
type(tanggal) :: waktu
end type pengeluaran
type(pengeluaran) :: catatan(4)
real :: total
integer :: i
catatan(1) = pengeluaran("Beli buku catatan", 32000.0, tanggal(3, 3, 2026))
catatan(2) = pengeluaran("Transportasi", 15000.0, tanggal(4, 3, 2026))
catatan(3) = pengeluaran("Makan siang", 18000.0, tanggal(4, 3, 2026))
catatan(4) = pengeluaran("Pulpen dan pensil", 12500.0, tanggal(6, 3, 2026))
total = 0.0
do i = 1, size(catatan)
total = total + catatan(i)%jumlah
end do
do i = 1, size(catatan)
print '(1X, A24, F10.2, 1X, I0, A, I0.2, A, I4)', &
catatan(i)%keterangan, catatan(i)%jumlah, catatan(i)%waktu%hari, &
"/", catatan(i)%waktu%bulan, "/", catatan(i)%waktu%tahun
end do
print '(1X, A, F10.2)', "Total pengeluaran:", total
end program rekap_pengeluaran# mengompilasi program dari direktori topik
gfortran tipe-turunan.f90 -o tipe-turunan
# menjalankan program hasil kompilasi
./tipe-turunan Beli buku catatan 32000.00 3/03/2026
Transportasi 15000.00 4/03/2026
Makan siang 18000.00 4/03/2026
Pulpen dan pensil 12500.00 6/03/2026
Total pengeluaran: 77500.00Setiap baris daftar dihasilkan dari satu objek pengeluaran yang dibaca melalui pemilih komponen, yaitu catatan(i)%keterangan, catatan(i)%jumlah, dan catatan(i)%waktu%hari. Format '(1X, A24, F10.2, 1X, I0, A, I0.2, A, I4)' menyusun nilai-nilai itu menjadi kolom yang rapi, dengan editor I0.2 mencetak hari menjadi dua digit tanpa spasi kosong. Perhitungan total hanya menyentuh komponen jumlah, sedangkan komponen lain tetap utuh pada posisinya, dan tidak ada satu pun loop yang menyalin data antar array terpisah.
Kapan tipe turunan dipilih#
Tipe turunan paling bermanfaat ketika sekelompok nilai selalu bergerak bersama. Alternatifnya adalah array paralel, yaitu deretan array terpisah yang diindeks dengan cara sama, misalnya keterangan(), jumlah(), dan waktu() untuk data yang sama. Susunan itu berfungsi, tetapi setiap penyalinan, pengoperan argumen, dan pemeriksaan batas harus diulang untuk setiap array, dan satu kesalahan indeks sudah cukup membuat data tercampur antar barisnya.
Dengan tipe turunan, hubungan antar nilai dinyatakan pada deklarasi dan dijaga compiler. Satu objek pengeluaran ditugaskan, disalin, dan diteruskan sebagai satu kesatuan, sedangkan akses terperinci cukup menuliskan pemilih komponennya. Kebiasaan ini menjadi fondasi seluruh modul, karena constructor, prosedur terikat tipe, dan polimorfisme di modul ini bekerja pada objek tipe turunan, bukan pada deretan array yang terpisah.
Kesalahan umum#
Kesalahan pertama adalah memakai nama komponen tanpa pemilihnya, misalnya menulis jumlah = 32000.0 padahal yang dimaksud adalah catatan(1)%jumlah. Compiler menolak pernyataan itu karena jumlah bukan nama variabel yang terdaftar, dan pesan errornya menunjuk langsung pada nama yang tidak dikenal. Perbaikannya adalah menuliskan nama objek dan pemilih komponennya secara lengkap.
Kesalahan kedua adalah menugaskan nilai skalar ke objek tipe turunan, misalnya catatan(1) = 32000.0. Penugasan semacam ini tidak sah karena sisi kanannya bukan nilai bertipe pengeluaran, sehingga kompilasi gagal dengan pesan ketidakcocokan tipe. Nilai tersebut harus dibungkus dengan constructor pengeluaran, atau diarahkan ke satu komponen tertentu. Kesalahan ketiga adalah menugaskan dua objek yang bertipe turunan berbeda dalam satu pernyataan, karena standar tidak menyediakan konversi otomatis antara tipe buatan pengguna, sehingga penugasan itu juga ditolak pada saat kompilasi.
Ringkasan#
- Tipe turunan mengelompokkan beberapa komponen dengan tipe berbeda di dalam satu nama, dideklarasikan dengan
typedan diakses melalui pemilih komponen%. - Komponen boleh bertipe turunan lain, sehingga struktur bersarang dibangun bertahap, dan constructor struktur menghasilkan nilai lengkap dalam satu pernyataan.
- Objek bertipe sama ditugaskan dan diteruskan sebagai satu kesatuan, sehingga hubungan antar data dijaga compiler dan tidak bergantung pada disiplin indeks array paralel.
Referensi#
- Learn: tutorial resmi Fortran — fortran-lang — Kumpulan tutorial resmi komunitas Fortran yang menjadi rujukan fitur bahasa pada jalur ini.
- The GNU Fortran Compiler — GNU Project — Manual gfortran, compiler yang digunakan untuk menjalankan seluruh contoh kode pada jalur ini.