개요
Tuple이라는 기능은 비단 C#에서만 사용하는 기능이 아니고 C++, 파이썬등 여러 프로그래밍 언어에서 자체 지원해줄만큼 강력한 기능이다.
이 기능이 무엇이며 언제 써야하는지 간단히 적어보았다.
필요성
먼저 아래와 같은 함수가 있다고 가정해보자.
CResult Func(int a_, int b_, int c_)
{
CResult result = new CResult();
result.a = a_;
result.b = b_;
result.c = c_;
return result;
}
매개변수를 토대로 어떤 클래스를 만들어 뱉어주는 함수이다.
여기서 인자에 제한이 생겼다!
0이하의 값은 받지 않도록 수정해보았다.
CResult Func(int a_, int b_, int c_)
{
// 0이하의 값이 있으면 오류!
if ( a_ <= 0 || b_ <= 0 || c_ <= 0 )
{
return null;
}
CResult result = new CResult();
result.a = a_;
result.b = b_;
result.c = c_;
return result;
}
여기서 또다른 종류의 예외가 생겼다.
인자의 합이 100이 넘으면 오류로 처리해야한다고 한다.
CResult Func(int a_, int b_, int c_)
{
if ( a_ <= 0 || b_ <= 0 || c_ <= 0 )
{
return null;
}
// 합이 100이 넘으면 오류!
else if ( a_ + b_ + c_ > 100 )
{
return null;
}
CResult result = new CResult();
result.a = a_;
result.b = b_;
result.c = c_;
return result;
}
이제 완벽해보인다.
그런데 함수밖에서 왜 null이 나왔는지 알고 싶다고 한다.....
그러면 함수 리턴값 전용 데이터를 파서 새로 만들어야하나...?
class FuncResult
{
public CResult result = null;
public EErrorCode error = EErrorCode.UNKNOWN;
}
FuncResult Func(int a_, int b_, int c_)
{
FuncResult funcResult = new FuncResult();
if ( a_ <= 0 || b_ <= 0 || c_ <= 0 )
{
funcResult.error = EErrorCode.INVALID_PARAM;
return funcResult;
}
else if ( a_ + b_ + c_ > 100 )
{
funcResult.error = EErrorCode.TOO_MUCH_PARAM;
return funcResult;
}
CResult result = new CResult();
result.a = a_;
result.b = b_;
result.c = c_;
funcResult.result = result;
funcResult.error = EErrorCode.OK;
return funcResult;
}
이러면 매 순간 함수를 만들때마다 이상한 class나 struct가 생겨날 것이다.
이럴 때 사용하는 것이 바로 tuple!!
Tuple<EErrorCode, CResult> Func(int a_, int b_, int c_)
{
EErrorCode eErrorCode = EErrorCode.UNKNOWN;
CResult result = null;
if ( a_ <= 0 || b_ <= 0 || c_ <= 0 )
{
eErrorCode = EErrorCode.INVALID_PARAM;
goto EndProc;
}
else if ( a_ + b_ + c_ > 100 )
{
eErrorCode = EErrorCode.TOO_MUCH_PARAM;
goto EndProc;
}
result = new CResult();
result.a = a_;
result.b = b_;
result.c = c_;
eErrorCode = EErrorCode.OK;
EndProc:
return Tuple.Create( eErrorCode, result );
}
깔ㅡ끔
'Programming' 카테고리의 다른 글
Redis 랭킹 동점 처리 (1) | 2021.02.28 |
---|---|
시간복잡도 Big-O 정리 (0) | 2021.01.06 |
개인정보 처리방침/Privacy Policy (0) | 2018.10.23 |
Visual Studio 2017 단축키 정리 (0) | 2018.03.24 |