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.
I have a JTAGICE mkII at work that I use to program AVR32 MCUs. It supports programming the Arduino Uno using the wiring shown below.
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.