less than 1 minute read

class CCAImage
{
protected:
    void SetSnapRegion(int x, int y, int dx, int dy);
};

class TestingCCAImage : public CCAImage
{
public:
    using CCAImage::SetSnapRegion;
};

using 선언(declaration)으로 부모 클래스의 protected 멤버 함수를 자식 클래스에서 public 접근 권한으로 호출할 수 있게 하는 기법이다.

접근 권한을 자식 클래스에서 변경하기 때문에 께름칙하나 클래스의 private 멤버 함수를 테스트할 때 유용하게 사용된다. 그 외에는 딱히 쓸 곳도 생각나지 않고 접근 권한을 바꾸는 게 위험해 보인다. 테스트할 때만 조심조심 사용하자.

private 멤버 함수 테스트는 접근 권한을 protected로 변경하고 테스트 코드에서 상속받은 테스트 클래스의 public 멤버 함수를 호출해서 진행한다. 이 public 멤버 함수에서 부모의 protected 함수를 호출해야 하는데, 이 using 선언을 사용하면 타이핑 노가다를 줄일 수 있다.

class TestingCCAImage : public CCAImage
{
public:
    void SetSnapRegion(int x, int y, int dx, int dy)
    {
        CCAImage::SetSnapRegion(x, y, dx, dy);
    }
};

using 선언을 사용해 자동으로 delegation을 하지 않는다면 이렇게 호출해야 한다. 어휴~ 난 이제껏 몰라서 이렇게 하고 있었다. 그래도 유닛 테스트를 시작한 지 얼마 안 됐으니 위안 삼자.

그나저나 이렇게 protected 멤버 함수를 호출하는 것을 가리키는 idiom이 있을까 해서 찾아봤는데 없더라. 있으면 검색하기도 쉽고 부르기도 좋은데 말이다.

Working Effectively with Legacy Code 책에서 배운 테크닉이다.