El caso es que private se inventó precisamente para eso, para usarlo y saberlo diferenciar.
Si te fijas, en "funcionalidad" private no es necesario, puesto que con public puedes hacer lo mismo.
Es una cuestión mas bien de organización que de otra cosa.
Los atributos de las clases que no quieres que se editen se declaran private para eso mismo.
Normalmente todo esto esta pensado para gente que trabaja en grupo, de forma que si alguien diseña una clase y luego otra persona la usa, si esta segunda persona intenta cambiar un atributo privado, le salte error y así no se continue la ejecución.
Como ya digo, es más cuestión de organización que de otra cosa.
Normalmente se suelen declarar public atributos que vas a necesitar leer desde fuera de la clase, pero sobre todo que vas a poder modificar desde fuera de la clase.
Es lo mismo tener una variable public que declararla private y luego hacer un get() y un set() para esa variable, pero sin embargo no es lo mismo que declararla private y solo hacer un get() por ejemplo, porque te evitas que alguien pueda editar ese dato, y alomejor a ti te interesa que así sea.
Que te digo yo... alomejor estas sacando nombres de usuario de una BD y declaras la array donde los guardas como private, y luego colocas un get().
Te interesa leer los nombres, pero para nada te interesarian que esos nombres se modifiquen, porque te podrían corromper la BD.
Saludos!