효율성을 위해서 커다란 객체들은 보통 참조(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() );
}
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
C언어 함수 요약 (0) | 2009.05.15 |
---|---|
printf(), scanf() 함수와 특수 기호 사용법 (0) | 2009.05.15 |
링크드 리스트 정의, 종류 (0) | 2009.05.12 |
문자열 연산자 - strcpy, strncpy, strlen, strcat, strncat, strcmp, strncmp, strchar, strstr, atoi, atof, atol, strftime (1) | 2009.05.05 |
strlen, strcpy, strcat, strcmp 함수 구현 [소스] (0) | 2009.05.05 |