WEBVTT 00:00:00.869 --> 00:00:03.313 Oke, saya mau merekam satu video terakhir hari ini 00:00:03.313 --> 00:00:07.989 Saya baru terpikir ini ketika membuat video tentang bagaimana objek berkomunikasi antara satu dengan lainnya 00:00:07.999 --> 00:00:13.419 Ada prinsip penting tentang bagaimana variabel dilewatkan sebagai argumen ke fungsi lainnya 00:00:13.433 --> 00:00:16.573 yang belum disampaikan di video-video sebelumnya 00:00:16.573 --> 00:00:18.611 Jadi, saya pikir saya tidak punya contoh untuk ini 00:00:18.611 --> 00:00:19.469 Saya hanya akan diag... 00:00:19.469 --> 00:00:21.597 Sampaikan kepada Anda melalui ini dan memperlihatkan susunannya 00:00:21.597 --> 00:00:25.122 dan kita akan lihat apa yang belum dibahas dan apa yang perlu ditambahkan dan apa yang membingungkan 00:00:25.122 --> 00:00:28.204 Saya akan mengarang suatu fungsi konyol 00:00:28.204 --> 00:00:30.513 suatu fungsi yang tidak ada gunanya 00:00:30.513 --> 00:00:32.093 Saya akan menyebutnya 00:00:32.093 --> 00:00:34.004 "change" (ubah) 00:00:34.265 --> 00:00:36.682 dan (fungsi) ini akan menerima 00:00:36.682 --> 00:00:39.321 suatu angka (val) sebagai argumennya 00:00:39.324 --> 00:00:41.914 dan di dalam fungsi ini 00:00:42.430 --> 00:00:48.280 val = val x 2 00:00:48.280 --> 00:00:52.625 oke, jadi fungsi ini menerima suatu angka 00:00:52.625 --> 00:00:55.251 dan mengkalikan angka tersebut dengan dua 00:00:55.251 --> 00:00:57.000 dan menyimpan hasilnya di dirinya sendiri (val) 00:00:57.000 --> 00:00:58.975 Jadi, kalau saya bilang "int x" 00:00:58.975 --> 00:01:00.152 Kamu bisa lihat tidak? 00:01:00.152 --> 00:01:01.142 Tidak. Saya tulis lebih rendah deh. 00:01:01.142 --> 00:01:04.419 "int x = 50" 00:01:04.419 --> 00:01:08.808 lalu saya bilang "change(x)" 00:01:08.808 --> 00:01:13.324 lalu saya bilang "println(x)" 00:01:13.324 --> 00:01:16.490 Apa hasil dari "println" ini? 00:01:16.490 --> 00:01:17.710 Yuk pikirkan ini 00:01:17.710 --> 00:01:19.959 Nilai "x" adalah 50 00:01:19.959 --> 00:01:23.629 "change(x)" artinya (nilai) x masuk ke "val" 00:01:23.629 --> 00:01:26.073 jadi sekarang nilai "val" adalah 50 00:01:26.073 --> 00:01:27.918 lalu "val = val x 2" 00:01:27.918 --> 00:01:31.323 jadi sekarang "val" nilainya 100 00:01:31.323 --> 00:01:34.983 tapi ketika saya cetak "x", apakah saya akan lihat "100" atau "50"? 00:01:34.983 --> 00:01:37.241 Pikirkan itu 00:01:37.241 --> 00:01:42.191 sebagai desainer bahasa pemrograman, terserah kamu memutuskan ini harusnya gimana 00:01:42.191 --> 00:01:46.791 Bahasa pemrograman Java, yang mana Processing dibangun di atasnya, 00:01:46.791 --> 00:01:49.058 Yang akan kita lihat adalah angka 50. 00:01:49.058 --> 00:01:54.225 Kenapa? Ini dikenal sebagai "pass by copy" (melewatkan argumen dengan menyalin nilai) 00:01:54.225 --> 00:01:56.665 Saat kau melewatkan suatu nilai primitif: 00:01:56.665 --> 00:02:00.285 angka, integer, float, dan sebagainya 00:02:00.285 --> 00:02:02.911 ke suatu fungsi 00:02:02.911 --> 00:02:05.138 kau melewatkan salinan dari nilai tersebut 00:02:05.138 --> 00:02:06.850 artinya, dalam memori komputer, 00:02:06.850 --> 00:02:12.704 "x" mereferensikan suatu tempat di memori dengan nilai 50 00:02:12.704 --> 00:02:18.924 lalu "val" mereferensikan tempat lain di memori komputer dengan apa? 00:02:18.924 --> 00:02:21.454 nilai 50 disalin ke sana 00:02:21.454 --> 00:02:25.027 lalu di sini, "val" dikalikan 2 00:02:25.027 --> 00:02:27.033 "val" sekarang nilainya 100 00:02:27.033 --> 00:02:29.835 tapi "x", yang menunjuk ke 50, tidak terpengaruh 00:02:29.835 --> 00:02:31.718 "Pass by Copy" (melewatkan argumen dengan salinan nilai) 00:02:31.718 --> 00:02:35.934 Alasan kenapa saya bahas ini dan sadar bahwa ini sangat penting 00:02:35.934 --> 00:02:39.870 Jika kau melewatkan suatu objek ke fungsi, cara kerjanya tidak seperti ini. 00:02:39.870 --> 00:02:45.250 Cara kerjanya disebut "Pass by Reference" 00:02:45.250 --> 00:02:48.327 Kita anggap ada objek Particle buatan, 00:02:48.327 --> 00:02:51.679 di mana objek Particle itu cuma punya "x" dan "y" 00:02:51.679 --> 00:03:01.279 Jadi "Particle p = new Particle(50, 100);" 00:03:01.279 --> 00:03:05.399 lalu saya bilang "change(p);" 00:03:05.399 --> 00:03:09.803 lalu ada fungsi yang disebut "void change" 00:03:09.803 --> 00:03:14.990 yang menerima objek Particle, yang disebut 00:03:14.990 --> 00:03:18.551 "blah". Cuma butuh nama variabel yang berbeda. (nama) ini jelek. 00:03:18.551 --> 00:03:23.083 ah... sebal saya buat nama variabel "blah" mari pikirkan sesuatu... 00:03:23.083 --> 00:03:25.851 saya mau menyebutnya "aP" 00:03:25.851 --> 00:03:28.851 "a Particle". "aP" 00:03:28.851 --> 00:03:35.141 kalau saya bilang "aP.x = 300;" 00:03:35.141 --> 00:03:37.657 Apa yang terjadi? 00:03:37.667 --> 00:03:43.995 oke, jadi (bagian) ini setara dengan "int x = 50; change(x);" 00:03:43.995 --> 00:03:47.358 sekarang saya nyatakan "Particle p = new Particle; change(p);" 00:03:47.358 --> 00:03:48.741 fungsi "change()" ini, 00:03:48.741 --> 00:03:53.031 alih-alih mengkalikan dengan 2, saya set nilainya jadi 300 00:03:53.031 --> 00:03:57.680 dan ingat sebelumnya bahwa x = 50 dan y = 100 00:03:57.680 --> 00:04:00.372 Jadi, di sini saya punya partikel p 00:04:00.372 --> 00:04:02.759 dan "p" menunjuk ke suatu tempat di memori komputer 00:04:02.759 --> 00:04:06.589 di mana "50" dan "100" disimpan 00:04:06.589 --> 00:04:09.966 sekarang di sini saya buat partikel baru namanya "aP" 00:04:09.966 --> 00:04:13.114 - 00:04:13.114 --> 00:04:16.384 Saya tidak membuat objek baru. 00:04:16.384 --> 00:04:20.753 Saat kau melewatkan objek ke suatu fungsi, kau memberikan referensinya 00:04:20.753 --> 00:04:26.055 Lokasi data dalam memori, bukan salinan datanya. 00:04:26.055 --> 00:04:29.058 Jadi, "aP" sebenarnya menunjuk ke sini... 00:04:29.058 --> 00:04:34.392 dan jika saya mengubah aspek, parameter, data objek tersebut 00:04:34.392 --> 00:04:39.085 misal "x" jadi "300". Saya mengubah variabel asalnya juga. 00:04:39.085 --> 00:04:41.094 "Pass by Reference" (mengoper dengan referensi) 00:04:41.094 --> 00:04:42.404 Jadi, di Java 00:04:42.404 --> 00:04:46.704 saat kau mengoper nilai primitif ke suatu fungsi, sebagai argumennya, 00:04:46.704 --> 00:04:50.034 kau membuat salinannya dan variabel aslinya tidak terpengaruh 00:04:50.034 --> 00:04:52.954 ketika kau melewatkan objek ke suatu fungsi, 00:04:52.954 --> 00:04:55.504 kau hanya kirim referensinya saja 00:04:55.504 --> 00:04:59.004 dan jika kau ubah objeknya di fungsi itu, ini juga akan berubah 00:04:59.004 --> 00:05:03.217 Izinkan saya menunjukkan skenario di mana hal ini penting 00:05:03.217 --> 00:05:06.077 Jadi, kalau kita kembali ke sini... 00:05:07.162 --> 00:05:10.381 ... Ini adalah contoh di mana saya cuma mengganti warna latar belakangnya... 00:05:10.381 --> 00:05:16.461 Jadi saya akan simpan ini sebagai "ver_2" 00:05:16.461 --> 00:05:20.554 saya cuma mau buat suatu fungsi yang dipanggil "p1.overlaps(p2)" 00:05:20.554 --> 00:05:24.496 dan ini tidak akan mengembalikan "true" atau "false" lagi 00:05:24.496 --> 00:05:28.867 oke, dan di fungsi tersebut, ini hanya void 00:05:28.867 --> 00:05:32.764 ini akan mengerjakan sesuatu jika mereka overlap 00:05:32.764 --> 00:05:34.328 dan apa yang akan saya lakukan? 00:05:34.328 --> 00:05:39.468 saya akan beri partikelnya dengan "color" (warna) 00:05:39.468 --> 00:05:45.944 dan warnanya akan menjadi hitam pada awalnya 00:05:45.944 --> 00:05:49.170 dan isi dengan warna itu 00:05:49.170 --> 00:05:57.530 dan ketika ini tumpang-tindih, "other.col" menjadi merah 00:05:57.530 --> 00:06:01.723 jika tidak, "other.col" sama dengan hitam 00:06:01.723 --> 00:06:04.072 Jadi, saya tahu saya melakukan ini dengan cepat 00:06:04.072 --> 00:06:06.985 mungkin kamu bisa mengikuti atau tidak... 00:06:06.985 --> 00:06:11.595 Tapi izinkan saya menunjukkan kenapa ini SANGAT PENTING 00:06:11.893 --> 00:06:15.224 Perhatikan saat mereka tumpang-tindih, partikel ini akan berubah warnanya 00:06:15.224 --> 00:06:19.464 Saya melewatkan p2 ke fungsi tersebut 00:06:19.464 --> 00:06:21.063 Salinan tidak dibuat 00:06:21.063 --> 00:06:24.111 Saya memberikan referensi ke objek sebenarnya 00:06:24.111 --> 00:06:27.059 dan "p2", referensi ke objek tersebut, masuk ke "other" 00:06:27.059 --> 00:06:30.549 Dan sekarang saya mengubah nilai dari "other". 00:06:30.549 --> 00:06:35.054 Jika saya mengubah nilai "other", artinya saya sebenarnya mengubah nilai "p2" 00:06:35.054 --> 00:06:37.452 dan sekarang "p2" menjadi merah. 00:06:37.452 --> 00:06:40.410 Saya juga bisa bilang... 00:06:40.410 --> 00:06:44.830 warna objek ini adalah hijau 00:06:44.830 --> 00:06:49.380 saya beri masing-masing suatu alfa kecil 00:06:54.342 --> 00:06:57.182 Jadi jika kita perhatikan sekarang, kamu bisa lihat sekarang... 00:06:57.182 --> 00:06:58.488 Keduanya hitam... 00:06:58.488 --> 00:07:00.018 Satu berubah hijau, satu berubah merah... 00:07:00.018 --> 00:07:01.801 Satu berubah hijau, satu berubah merah... 00:07:01.801 --> 00:07:03.195 Hal lain yang perlu diperhatikan adalah 00:07:03.195 --> 00:07:07.225 sepertinya di versi program aslinya (sebelumnya), 00:07:07.225 --> 00:07:11.723 p1 overlap p2 adalah sama dengan p2 overlap p1. 00:07:11.723 --> 00:07:13.908 Tapi sekarang kalau saya ubah itu, 00:07:13.908 --> 00:07:17.698 karena saya beri p2 ke fungsi itu, p2 berubah hijau dan satunya jadi merah. 00:07:17.698 --> 00:07:21.468 Jadi, ada banyak yang asal-asalan dalam contoh buatan ini 00:07:21.468 --> 00:07:24.026 Tapi saya pikir ini penting untuk disadari 00:07:24.026 --> 00:07:25.705 bahwa jika kamu mengirimkan 00:07:25.705 --> 00:07:30.094 objek ini ke suatu fungsi, kamu bisa ubah objek itu dalam fungsi itu sendiri 00:07:30.094 --> 00:07:34.009 oke, jadi saya tidak tahu apakah ini bisa membuatmu lebih paham atau makin bingung 00:07:34.009 --> 00:07:35.729 Saya pikir saya sudah sampaikan di video terakhir 00:07:35.729 --> 00:07:40.663 Tapi saya hari ini hanya merangkum semua video dan coba buat konten kecil ekstra 00:07:40.663 --> 00:07:43.731 Video ini cuma 7 menit, yang mana tidak terlalu buruk 00:07:43.731 --> 00:07:45.031 oke, sampai jumpa