You do have to supply both functions. You could do everything in the setup and leave loop empty, and for some apps that would be all that is needed. For example if your app was just a timer that was to start when the reset button was pressed for example.
However, these functions are there as a reminder of how most embedded software is structured.
You set some things up once after reset, and then you have a 'tight' loop where you do things quickly like monitor for a key being pressed, or refresh an LCD display.
So the things in the main 'loop' will be run repeatedly as frequently as possible.
And actually, since the main() function is part of a library, you can overwrite in your code. Just don't forget to call init() or delays and other built in functions wont work.