Оу, май, 4 человека ответили, и ни один не понимает, что такое инкапсуляция... деградация какая-то, алё!
Причём тут защита данных? Причём тут контроль доступа?
Сокрытие данных? Геттеры, сеттеры? private, public?
Это всё не имеет никакого отношения к инкапсуляции, это всё
побочные эффекты, либо
способы реализации в конкретном языке.
Основная задача инкапсуляции -- отделить интерфейс от реализации. Чтобы пользователя интерфейса вообще не волновало как там устроена его реализация. Чтобы там всё под капотом само подтягивалось, разрешалось, загружалось, а пользователь только передавал входные данные в интерфейс и получал выходные. Чтобы для добавления новой реализации в случае чего, разработчику достаточно было drop-in'ом закинуть эту реализацию, и она сама подтянулась, а не перелопачивать всю кодовую базу, которая сломалась от банального добавления кода.
ООП и его фишки тут не причём. Ни геттеры, ни сеттеры, ни private\public никакого отношения к этому не имеют. Инкапсуляция может быть даже статической, когда, например разрешаются модули во время компиляции, и язык вообще не должен быть объктно-ориентированным при этом. Инкапсуляция может реализовываться вообще распределённо по разным нодам, которые реализуют интерфейс. Да и ещё чёрт знает как. Скрывать данные не нужно от пользователя. Часто даже удобно обратное -- не писать кучу бойлерплейта, а просто дать возможность пользователю сконфигурировать интерфейс через изменение стейтов в его реализации напрямую, если позволяет платформа, соблюдая инварианты. Это будет более верным архитектурным дизайном, нежели городить какие-то костыли "вдруг пользователь идиот и всё поломает".
На этом всё, это и есть инкапсуляция.