Arduino Uno comes with an ATmega328 microcontroller. Like all AVR MCUs it can be programmed using an in-system programming interface (ISP or ICSP). This can be useful to upgrade the bootloader, or to completely replace it and use the full program space on the MCU.
The ATmega16U2 that drives the USB to serial interface – within orange rectangle in the figure above – can also be reprogrammed using the ICSP2 header.
The Arduino can also be programmed using the more affordable JTAGICE3.