🌈 프로그래밍/C++

[C++] 1.2.3 const의 이해

반응형

 

 

지난 포스팅에는 C++에서의 스트링과 포인터 그리고 동적 메모리에 대하여 알아보았는데요.

 

 

2021.08.18 - [C++] - [C++] 1.2.1 ~ 1.2.2 스트링 & 포인터와 동적 메모리

 

[C++] 1.2.1 ~ 1.2.2 스트링 & 포인터와 동적 메모리

안녕하세요? 수구리입니다. 지난 포스팅에서는 이니셜라이저 리스트에 대해서 알아봤었죠? 2021.08.17 - [C++] - [C++] 1.1.15 이니셜라이저 리스트 [C++] 1.1.15 이니셜라이저 리스트 안녕하세요! 수구리입

tasddc.tistory.com

 

이번 포스팅에서는 C++ 뿐만 아니라 JavaScript에서도 보았을 const에 대하여 알아보도록 하겠습니다!

 

 

C++는 대표적인 객체지향 언어로 유명하죠!

 

 

따라서 매개변수로 const를 사용하여 함수의 인자로 보내는 경우가 많다고 합니다.

 

 

시작해보겠습니다!

 

 


1.2.3 const의 다양한 용도

  • const 키워드에 대한 면접 질문으로 좋음! 잘 알아두면 좋다.
  • 각각의 용도는 서로 관련되어 있지만 미묘한 차이가 있다.

 

const 상수

  • C언어에서는 #define 구문을 사용하여 변경하지 않을 값을 정의 해주었다.
  • C++에서는 상수를 const로 정의하는것이 바람직하다!

// const 상수
const int versionNumMajor = 2;
const int versionNumMinor = 1;
const std::string productName = "Super Hyper Net Modulator";

 

const 매개변수

  • C++ 에서는 const가 아닌 변수를 const로 캐스팅이 가능하다.
  • 이를 통해서 다른 코드에서 변수를 변경하지 않도록 보호가 가능하다.

// const 매개변수 예제
void func(const std::string* someString) {
    *someString = "Test" // 컴파일 에러
}

int main() {
    std::string myString = "abc";
    func(&myString);
    return 0;
}

 

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;
}

 

 

이상입니다!

반응형