Damit man den Zugriff auf die Attribute besser steuern kann. Nehmen wir als Beispiel einfach eine Klasse Mensch mit den Atributen Namen, Vornamen und Geburtsdatum.
Man macht eigentlicht immer alle Attribute private. Das sorgt dafür, dass anderen Klassen keinen Zugriff auf diese Attribute haben. In der Klasse Mensch hast du aber Zugriff auf dessen private Attribute. Beim Namen und beim Vornamen kann man sich noch darüber streiten aber spätestens beim Geburtsdatum dürfte klar sein warum man das macht. Niemand soll das nachträglich ändern. Es gibt nur eine Möglichkeit das Geburtsdatum zu setzen und zwar über den Konstruktor. Danach sollen andere Klassen das Geburtsdatum zwar auslesen können aber nicht selber verändern können.
Bei E-Mail Adressen hat man ein anderes Problem. Wie sorgt man dafür, dass die E-Mail Adresse auch gültig ist? Man macht das Attribute private und gibt allen anderen Klassen einen setter, der eine Exception wirft, falls die E-Mail nicht stimmt. Andere Attribute dürfen nicht leer sein oder eine Kontonummer, die mindestens X Zeichen hat usw. Gibt genügend Prüfungen in dieser Art.
Da das bei Attribute eigentlich immer der Fall ist, macht man einfach alle Attribute auf private. So ist es einheitlich und wenn sich jeder daran hält, kann man mit fremden Klassen besser arbeiten.
Fazit: Man verwendet private um etwas vor fremden Klassen zu verstecken und zu schützen. Das macht man auch mit Methoden, die nur intern genutzt werden aber anderen Klassen nicht zur verfügung stehen sollen.