본문 바로가기

컴퓨터/언어,프로그래밍

[C++] 값에 의한 객체의 반환(Returning Objects by Value)

값에 의한 객체의 반환(Returning Objects by Value)

효율성을 위해서 커다란 객체들은 보통 참조(reference)에 의해서 또는 그들의 주소(address)에 의해서 함수로 전달되거나 함수로부터 반환된다. 그러나 어떤 상황들에서는 값(value)에 의해 객체를 반환하는 것이 최선의 선택인 경우들이 존재한다. 연산자 +가 이러한 상황의 한 예이다. 그것은 결과 객체를 반환해야만 하지만, 그것은 그것의 오퍼랜드들 중 어떤 것을 변경할 수 없다. 겉으로 보기에 자연스러운 선택은 결과객체(resultant object)를 빈 메모리(free store)에 할당하고 그것의 주소를 반환하는 것이다. 그럼에도 불구하고 이것은 그렇게 좋은 아이디어는 아니다. 동적 메모리 할당은 지역 메모리보다 상당히 더 느리다. 그것은 또한 실패를 하고 예외를 던질 수도 있고, 그러면 예외는 포착되어 처리되어야만 한다. 심지어 더 나쁘게, 이 해법은 그것이 누가 - 생성자 ? 또는 사용자 ? -이 객체를 삭제할 책임이 있는지 분명하지 않기 때문에 에러를 일으키기 쉽다. 또 다른 해법은 정적 객체를 사용하고 그것을 참조에 의해 반환하는 것이다. 예를 들면


class Year
{
private:
        int year;
public:
        Year(int y = 0) :       year(y) {}
        // local static Year에 대한 참조를 반환
        Year& operator + (const Year& other) const;  
        int getYear() const;
        void setYear(int y);
};


Year& Year::operator + (const Year& other) const  
{
        static Year result;
        result = Year(this->getYear() + other.getYear() );
        return result;
}


정적인 객체들은 소유권 문제를 해결하지만 그것들은 여전히 문제의 소지가 있다: 오버로드된 연산자의 각 invocation상에서, 정적 객체의 동일한 인스턴스는 변경되어 호출자(caller)로 반환된다. 동일한 객체는 그것들이 그들의 배경 뒤에서(behind their back) 방금 변경된 공유된 인스턴스를 유지하고 있다는 것을 알지 못하는 몇몇의 많은 사용자들에게 참조에 의해 반환될 수 있다. 결국, 가장 안전하고 가장 효율적인 해법은 여전히 결과하는 객체를 값에 의해 반환하는 것이다:


class Year
{
private:
        int year;
public:
        Year(int y = 0) : year(y) {}
        Year operator + (const Year& other) const; // 값에 의해서 Year 객체를 반환
        int getYear() const;
        void setYear(int y);
};


Year Year::operator + (const Year& other) const
{
        return Year(this->getYear() + other.getYear() );  
}


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...