Think of McDonald’s as an object. There’s a well known public method to order a BigMac.
Internally there’s going to be a few zillion other calls to actually GET the materials for making that Bigmac. They don’t want you to know how their supply chain works, so all you get is the public Gimme_a_BigMac() call, and would never ever allow you to get access to the Slaughter_a_cow() or Buy_potatoes_for_fries() methods.
For your own code, that no one will ever see, go ahead and leave everything public. But if you’re doing a library for others to reuse, then you go and protect the internal details. That leaves McDonald’s free to switch to having Scotty beam over a patty rather than having to call up a Trucking company to deliver the meat by land. The end-user never knows the difference – they just get their BigMac. But internally everything could fundamentally change.