리팩터링/리팩터링 기법

리팩터링 기법. 클래스 인라인(Inline Class)

developer-tj 2023. 3. 28. 12:00
반응형

클래스 인라인하기(Inline Class)는 작은 클래스를 효율적으로 사용하기 위한 리팩터링 기법 중 하나입니다. 클래스 인라인하기는 클래스의 모든 기능을 클래스의 사용처에 삽입하여 호출하는 비용을 줄이는 방법입니다.
해당 리팩터링은 클래스 추출하기(Extract Class) 와 반대되는 리팩터링입니다.

클래스 인라인하기를 적용하면, 작은 클래스를 사용할 때 클래스를 생성하는 비용이 줄어들기 때문에, 성능 개선에 효과적입니다.
하지만 클래스의 크기가 너무 크거나 복잡한 경우에는 오히려 가독성이 떨어질 수 있으므로 주의해야 합니다.

클래스 인라인하기를 적용하는 방법은 다음과 같습니다.

  1. 클래스의 기능을 호출하는 모든 코드를 찾습니다.
  2. 클래스의 기능이 호출되는 곳으로 이동하여, 클래스의 기능을 호출하는 코드를 모두 제거합니다.
  3. 클래스의 모든 필드와 메서드를 호출하는 코드가 있는 위치에 인라인합니다.

클래스 인라인하기는 다음과 같은 상황에서 적용할 수 있습니다.

  • 클래스의 인스턴스 생성 비용이 높은 경우
  • 클래스의 기능이 매우 단순한 경우
  • 클래스의 기능이 자주 사용되는 경우

하지만 클래스 인라인하기를 적용할 때에는 다음과 같은 점을 고려해야 합니다.

  • 클래스의 크기가 너무 크거나 복잡한 경우 가독성이 떨어질 수 있음
  • 클래스의 기능이 바뀌는 경우 모든 호출되는 코드를 수정해야 함
  • 클래스의 기능을 여러 곳에서 사용하는 경우 코드 중복이 발생할 수 있음

클래스 인라인하기는 성능 개선에 효과적인 방법이므로, 작은 클래스에서 적극적으로 활용할 수 있습니다.
하지만 클래스의 크기와 기능에 따라서 적용할지 말지 결정해야 합니다.


다음은 클래스 인라인하기(Inline Class)를 적용하기 전의 예제 코드입니다.


Class TelephoneNumber
{
public:
    int GetAreaCode()
    {
        return areaCode;
    }

    int GetNumber()
    {
        return number;
    }

pviate:
    int areaCode;
    int number;
};

Class Person 
{
public:
    int GetOfficeAreaCode()
    {
        return officeTelephoneNumber.GetAreaCode();
    }

    int GetOfficeNumber()
    {
        return officeTelephoneNumber.GetNumber();
    }

pviate:
    TelephoneNumber officeTelephoneNumber;
};


Person 클래스 내부에서 officeTelephoneNumber라는 TelephoneNumber 클래스의 인스턴스를 가지고 있습니다.
해당 코드를 클래스 인라인 적용하면 다음과 같습니다.


Class Person 
{
public:
    int GetOfficeAreaCode()
    {
        return officeAreaCode;
    }

    int GetOfficeNumber()
    {
        return officeNumber;
    }

pviate:
    int officeAreaCode;
    int officeNumber;
};


TelephoneNumber 클래스를 제거하고, 필드를 바로 Person 클래스 내부에 추가하여 통합했습니다.
이렇게 클래스 인라인 기법을 사용하면 클래스의 수를 줄이고 코드의 가독성과 유지보수성을 높일 수 있습니다.