반응형
안녕하세요? 수구리입니다.
지난 포스팅에서는 C++의 const에 대해서 알아봤었죠?
지난 포스팅 참고!
2021.08.18 - [C++] - [C++] 1.2.3 const의 이해
이번 포스팅에서는 면접에서 단골 질문이라는 값-전달 방식과 참조 전달 방식에 대해서 알아보고
추가로 예외처리인 익셉션에 대해서 알아보도록 하겠습니다!
1.2.4 레퍼런스(참조)
- 참조를 사용하면 기존 변수에 새 이름을 지정할 수 있다.
// 레퍼런스 사용 예제
int x = 25;
int& xReference = x;
- 변수의 타입 뒤에 &를 붙이면 그 변수는 레퍼런스가 된다.
- 내부적으로 원본 변수에 대한 포인터로 취급하므로 x와 xReference는 같은 값을 가리킨다.
- 둘 중 한 변수라도 수정이 되면 둘다 값이 바뀐다.
레퍼런스 전달 방식
- pass by value(값 전달 방식)
- 함수의 매개변수에 정수를 전달
- 함수 안에는 그 정수의 복제본 전달
- 함수 안에서는 원본 변수의 값을 변경할 수 없음
- pass by reference(레퍼런스(참조)전달 방식)
- C++에서는 값 전달 방식보다 뛰어난 방식을 사용함.
- 매개변수가 포인터값이 아닌 레퍼런스로 전달
- 함수 안에서 원본 변수의 값도 변경 가능
const 레퍼런스 전달 방식
- C++에서는 함수의 매개변수를 const 레퍼런스로 전달하는 코드를 자주 볼 것이다.
- 이를 사용하는 가장 큰 장점은 바로 성능 이다.
- 포인터를 사용하기 때문에 원본을 복제할 필요가 없고, const로 전달하기 때문에 원본 변수가 변경되지도 않는 장점이 있기 때문이다.
- 특히 객체를 다룰 때 유용하다.
// const 레퍼런스로 전달하는 예시
void printString(const std::string& myString){
std::cout << myString << std::endl;
}
int main() {
std::string someString = "Hello";
printString(someString);
printString("Hello"); // 리터럴 전달 가능
return 0;
}
1.2.5 익셉션
- 예상하지 못한 상황을 표현하는 클래스/객체를 의미한다.
- 이러한 상황에 대처하기 위해서 함수에서 nullptr이나 에러 코드와 같은 특수한 값을 리턴시켜서 알려준다.
- throw 문장이 실행되면 함수에서 값을 리턴하지 않고 즉시 실행 중단을 한다.
특정 조건을 만족해서 익셉션을 발생시키는 것을 던진다(throw) 라고 하고 이렇게 발생한 익셉션에 대한 동작을 수행하는 것을 익셉션을 잡는다(catch) 라고 표현한다.
// 익셉션 예시
double divideNum(double num, double num1){
if (num1 == 0){
throw invalid_argument("Denominator cannot be 0."); // 예외를 던지는 부분
}
return num / num1;
}
// 예외가 발생할 수 있는 함수를 호출할 때에는 try/catch 블록으로 감싼다.
try {
cout << divideNum(2.5, 0.5) << endl;
cout << divideNum(3.3, 0) << endl;
// 마지막 결과에 대한 출력은 나오지 않는다. 윗줄에서 예외가 발생하여 block을 건너뛰었기 때문이다.
cout << divideNum(6.0, 2.0) << endl;
} catch {
cout << "예외 발생! :" << exception.what() << endl; // 예외를 잡아서 처리하는 부분
}
이상으로 레퍼런스와 익셉션에 대한 내용이었습니다.
감사합니다!
반응형
'🌈 프로그래밍 > C++' 카테고리의 다른 글
[C++] 객체 지향 언어의 특성에 대하여 (0) | 2021.08.20 |
---|---|
[C++] 타입 추론에 대하여 (0) | 2021.08.20 |
[C++] 1.2.3 const의 이해 (3) | 2021.08.18 |
[C++] 1.2.1 ~ 1.2.2 스트링 & 포인터와 동적 메모리 (0) | 2021.08.18 |
[C++] 1.1.15 이니셜라이저 리스트 (0) | 2021.08.17 |