awt에서는 Componenet 자신을 그리기 위해서 paint()를 override하여서 사용하였습니다. 만약, Component가 java.awt.Container였다면 super.paint(Graphics g)를 호출해야하였습니다.
그 이유는 update() 또는repaint()가 호출되는 경우 상위의 heavyweight ancestor로부터 paint()가 호출되며 하위 children의 paint()까지 호출하기 위해서였습니다.
이러한 구조가 Swing에와서는 더블버퍼링, UI delegate나 border의 지원 등을 위해서 구조가 변경되었고 swing에서의 paint() 메소드는 좀 더 세분화되게 되었습니다. 효율성과 확장성을 위해서 paint() 자체에 여러기능이 들어갔습니다.
예를 들면, java.awt.Container에서 하위 children까지 그리기 위한 부분이 paint()로 포함되었습니다. Swing에서는 paint()를 위해서는 paintComponent()를 사용하도록하고 있으며 좀더 많은 확장컴포넌트를 만들경우 paintChildren()이나 paintBorder()를 override하도록 하고 있습니다.
※ paint()와 paintComponent()가 잘정리되어 있는 사이트
http://java.sun.com/products/jfc/tsc/articles/painting/index.html#lw
※ 참고: 오역가능성 농후.. 책임못짐 ^^, 틀린내용있으면 말씀해주세요