The ledger has to be public in order for Bitcoin to be decentralized. The designers of Bitcoin didn't want to need anyone to play the role of a "bank" who keeps all the records, and whom everyone else has to trust to do that properly.
For instance, when you keep a bank account, you are trusting your bank to keep your money and give it back to you on demand. There isn't anything that actually prevents them from just taking your money and faking their account records to make it look like you never deposited it. You could fight them in court to get it back, but they still have your money in the meantime.
But there still have to be records, and someone has to be able to see them to verify that they make sense. Bitcoin's solution is to make the records public so that anyone can verify them.
You're right that this comes at a cost in privacy. (Though from a certain point of view, in the current banking system, your bank has all your information; you're trusting them to keep it private. If they published all your bank statements in the newspaper, you could probably sue them, but the information would still be out there.)
But your "coffee shop" example isn't a very good one. Of course, if they operate with a single address posted on the wall, then others will be able to see their incoming transactions. If that's a concern, then they shouldn't use that approach; they should use a new address per transaction, as you suggest. That shouldn't be very difficult. The coffee shop is going to have to have some sort of Internet-connected device (computer, tablet, etc), in order to see whether customers have actually made their payments and can be given their coffee. If so, then that device can easily generate a new address for each customer, perhaps displaying it as a QR code on its screen.