Abstract
The objective of software refactoring is to improve the software product's quality by improving its performance and understandability. There are also different quality attributes that software refactoring can improve. This study gives a wide overview of five primary approaches to software refactoring. These are two clustering approaches at class level and two at package level, as well as one graph transformational approach at class level. The research also compares the approaches using several evaluation criteria.