Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[연산 메소드 생성] 연쇄적 연산 (Function composition) Computer & Program

연산 메소드를 생성할 때 리턴값을 잘 결정해 주어야 합니다.

"A = B + C + D" 라는 연산이 있을 때, "A = 1", "B = 2", "C = 3", "D = 4"이고 모두 int형이라고 가정을 하면, 연산자 우선순위에 따라 "B + C"라는 연산이 가장 먼저 수행됩니다. "B + C" 연산이 끝나면 그 결과인 5를 D와 더하고 그 값이 A에 할당되게 되는 것입니다.

여기에는 엄청난 비밀이 숨겨져 있습니다. "B + C" 연산을 하고 나면, int 타입으로 5가 리턴됩니다. 왜 int 타입이냐고 물으시면 int 타입 변수 2개를 연산했기 때문입니다. 자동 타입 변환(auto casting)이 지원되는 언어라면 다른 타입과의 연산인 경우 더 큰 타입의 변수로 변환되어서 리턴 됩니다. B가 int형이고, C가 double이었다면 B가 double로 변환되어 연산된 후 double값이 리턴되는 것이지요.

말이 조금 샜는데 다시 본론으로 돌아와서, "B + C" 연산을 하면 int 타입의 5가 리턴이 된다는 것이 중요한 점입니다. 만일 값을 리턴을 하지 않는다면 다음 연산인 D와의 + 연산을 할 수 없을 뿐더러, "A = B + C"와 같은 연산에서 "B + C" 연산 이후 A에 할당할 수 있는 값이 리턴되지 않으므로 "A = B + C"와 같은 문장은 존재할 수가 없습니다. 그렇기 때문에 거의 모든 언어의 연산에는 연쇄적인 연산을 하기 위해 해당하는 연산을 마치고 나면 그에 따른 결과값을 리턴하게 됩니다. (그렇지 않을 수 있는 오래되거나 저급 언어는 논외로 합니다.) 그리고 그 결과값은 연산을 수행한 변수의 타입이 일반적입니다. 그 이유는 연산을 한다는 것은 보통 비슷한 연산을 또 할 수 있기 때문입니다. 그리고 대입과 같은 연산이 뒤따르는 경우가 많기 때문입니다.

이러한 연쇄적 연산 때문에 우리는 C나 C++에서 "if(a = 3)"과 같은 실수를 할 수 있습니다. 연산자 우선순위에 따라 a에 3을 대입(a = 3)하고, a에 대입한 결과를 리턴하고, 그 결과값이 3이기 때문(if(3))에 이 조건문은 참이 됩니다.


이러한 내용에 기반해서 연산 메소드를 만들 때 리턴값을 잘 결정해 주어야 합니다. 특히 클래스끼리의 연산을 하는 메소드일 경우가 많습니다.

class Person
{
    ...
    Person &operator =(const Person &other) {
        어떠한 연산
        return *this;
    }
    ...
};

위의 예제를 보면, = 연산을 마친 후 자기 자신을 리턴(return *this)합니다. "Person &"을 리턴(return *this)하는 이유는 위에 설명했듯이, Person 클래스 객체 A, B, C가 있을 때 "A = B = C"와 같은 연쇄적 연산을 하기 위해서 입니다.

이와 비슷하게 Java의 StringBuffer 클래스의 append 메소드를 예로 들 수 있습니다. StringBuffer의 append 메소드는 해당하는 문자열의 뒷부분에 문자열을 붙여주는 연산을 하는 메소드입니다. Java API를 보면 StringBuffer 클래스의 append 메소드는 모두 StringBuffer를 리턴합니다. 그래서 다음과 같이 append메소드를 연속적으로 호출을 할 수 있는 것입니다.

StringBuffer sb = new StringBuffer();
StirngBuffer newSb = sb.append("This ").append("is ").append("a ").append("book.");


연산 메소드가 연쇄적 연산(Function composition)을 지원하기 위해서는 다음에 어떠한 연산이 있을지 잘 생각해 보고, 그에 맞는 타입을 리턴해 주어야 합니다.

핑백

  • Sigel's house made of ice 。。。 : [Java] Java에서 문자열 비교 2009-09-09 22:30:29 #

    ... '='로 잘못 입력을 하게 되면, 다음과 같은 이유로 문제가 발생합니다. C나 C++은 '0'만이 거짓이고, '0'이 아닌 모든 값을 참으로 판별을 합니다. 그리고 연쇄적 연산을 하기 위해 대부분의 연산이나 대입이 끝난 후 그 값을 리턴하기 때문에 "type == 2"를 "type = 2"로 입력하는 경우 type값이 변할뿐더러 대입 ... more

덧글

댓글 입력 영역

Google AdSense (text/image)