Return과 Bool이라는 자료형에 대한 수업을 진행하였다.
Return의 경우 7일 날 예습했던 거에 수정을 하여 추가하였다.
Bool 자료형
1. 정의
- bool 자료형은 Boolean 자료형이라고 하며, 1과 0의 값만 가질 수 있다.
- 키워드로는 true와 false를 사용하며 true는 1, false는 0에 대응한다.
즉, bool 변수에 숫자를 저장하면 0 이외의 값은 true(1)로 변환되고, 0은 false(0)로 유지된다.
- bool은 참(True) 또는 거짓(False) 값만을 나타내기 위해 사용되는 전문적인 자료형입니다.
2. bool은 언제 유용하게 사용될까?
- bool 자료형은 주로 예외처리에 유용하게 사용하게 된다.
- 올바른 값이 입력되면 정상적인 처리 결과가 반환되고, 잘못된 값이 입력되면 이를 감지하여 실패 여부를 반환할 수 있다.
- bool의 핵심 역할은 프로그램의 흐름 속에서 성공, 실패의 여부를 명확하게 알려주는 것이다.
- 예외 처리를 통해, 프로그램이 예기치 않은 상황에 적정하게 대응할 수 있게 해 준다.
3. 예시 코드
#include <iostream>
bool divide(int nSrc, int nDst, int* pResult);
int main()
{
int n1{};
int n2{};
int nResult{};
n1 = 10;
n2 = 3;
if (divide(n1, n2, &nResult))
printf("%d\n", nResult);
else
printf("잘못된 값 입니다.\n");
}
bool divide(int nSrc, int nDst, int* pResult)
{
if (nSrc < nDst)
return false;
*pResult = nSrc / nDst;
return true;
}
코드 설명 :
- divide 함수는 두 정수 nSrc, nDst를 받아서 나누기를 수행한 후, 그 결과를 포인터 pResult에 저장하게 된다.
- 하지만 나눗셈이 가능한지 검사를 하기 위하여 bool을 반환하여, 조건이 충족되지 않으면 false를 반환하게 되고, 조건에 만족하게 되면 결과를 저장한 후 true를 반환하게 된다.
- 예외 처리가 추가되어, if 조건문에 나눗셈이 실패할 경우 "잘못된 값입니다"라는 메시지를 출력하게 된다.
4. 예외처리는 언제 해야 할까?
- 예외 처리는 프로그램이 실행 중 터질지 말지 모를 상황에 주로 사용을 한다.
- 모든 경우의 수를 다 검토한 후에도 확실히 들지 않는 경우, bool이나 return을 사용해 성공 여부를 명확하게 나타내는 것이 좋다.
5. 팁
- 보통 0이라는 결괏값이 나온다면 이미 프로그램이 터진 상황이라는 것을 나타낸다. 그렇기에 예외 처리가 이미 된 상태를 의미하고 추가로 예외 처리를 할 필요가 없는 것이다.
- 절대 return; 이런 거 하지 말 것, 오류 상황에서는 명확한 예외 처리나 오류 메시지를 통해 문제가 발생했음을 알려줘야 하기 때문이다.
문제 1. 배열의 총합을 구하는 함수
#include <iostream>
void arraySumTotal(const int* pData, int nLength, int *pSumTotal);
int main()
{
int arData[7]{ 10,8,5,4,3,2,1 };
int nResult{};
arraySumTotal(arData, 7, &nResult);
printf("%d\n", nResult);
}
void arraySumTotal(const int* pData, int nLength, int* pSumTotal)
{
int nSumTotal{};
for (int i = 0; i < nLength; i++)
{
nSumTotal += pData[i];
}
*pSumTotal = nSumTotal;
}
문제 2. 배열을 다른 배열에 복사하는 함수
#include <iostream>
bool copyArray(const int* pSrcData, int nSrcLength, int* pDstData, int nDstLength);
int main()
{
int arSrcData[7]{ 10,8,5,4,3,2,1 };
int arDstData[10]{1,1,1,1,1,1,1,1,1,1};
if (copyArray(arSrcData, 7, arDstData, 10))
{
for (int i = 0; i < 10; i++)
printf("%d ", arDstData[i]);
}
else
printf("Error\n");
}
bool copyArray(const int* pSrcData, int nSrcLength, int* pDstData, int nDstLength)
{
if (nSrcLength > nDstLength)
return false;
for (int i = 0; i < nDstLength; i++)
{
pDstData[i] = 0;
}
for (int i = 0; i < nSrcLength; i++)
{
pDstData[i] = pSrcData[i];
}
return true;
}
주의할 점 : 배열이나 값을 함수로 받아올 때 받아온 값이 초기화되지 않은 상태일 수도 있다는 것이다. 그렇기에 계산 오류를 방지하기 위해, 항상 값을 받아온 후에는 직접 초기화를 해주는 것이 중요하다.
초기화 여부를 사전에 알 수 없으므로, 안전하게 처리를 하기 위해 값이 청소되지 않은 상태일 가능성을 염두에 두고 명시적으로 초기화를 해야한다.
'C++' 카테고리의 다른 글
[강의] 10월 15일 수업정리 (1) | 2024.10.16 |
---|---|
[강의] 10월 11일 수업정리 (1) | 2024.10.14 |
[강의] 10월 4일 수업정리 (1) | 2024.10.05 |
[강의] 10월 2일 수업정리 (1) | 2024.10.03 |
[강의] 10월 1일 수업정리 (1) | 2024.10.01 |