Dabei geht es um die Kapselung. Objekte sollen nie direkt über ihre Attribute=Instanzvariablen verändert werden. Anfangs mag das trivial erscheinen. Wächst dein Projekt und damit die Komplexität deiner Objekte, kann es sein, dass noch mehr geändert werden muss, als nur ein Attribut. Deshalb ein Setter, der dies indirekt durchführt.
Stell dir vor, du hast ein Objekt der Klasse "Adresse". Dieses hat eine "Postleitzahl", "Ort" und "Straße".
Jetzt kennt jemand die Klasse nicht genau und möchte in einem Objekt "12345" "Musterstadt" "Ahornstraße" den Ort ändern zu "Mülheim". Greift er jetzt direkt auf die Variable zu, so bleibt der Rest der Daten gleich aber wird falsch, d.h. inkonsistent. Die PLZ wird nämlich nicht geändert. Wäre nur der Zugriff über den Setter erlaubt, könnte dieser jetzt z.B. in einer Datenbank die Postleitzahl von Mülheim raussuchen und automatisch ändern, alles bliebe in Ordnung.
Ergo: Mehr Sicherheit bei Codeergänzungen/-änderungen, mehr Komfort und weniger Wartungsaufwand, d.h. weniger Änderungen nötig für neue gewünschte Funktionalität.