반응형

출처 :     https://www.yes24.com/Product/Goods/9328793

C++의 인자 전달 방식

C++에서 함수에 인자를 전달하는 방식은 크게 두 가지로 나눌 수 있습니다: 값에 의한 전달과 참조에 의한 전달입니다.

1. 값에 의한 전달 (Pass by Value):
   - 값에 의한 전달은 함수에 인자를 복사하여 전달하는 방식입니다.
   - 함수 내부에서 인자의 값은 원본과 별개의 복사본으로 처리됩니다.
   - 함수 내에서 인자를 수정해도 원본 값은 변하지 않습니다.
   - 일반적으로 작은 크기의 데이터나 객체를 전달할 때 사용됩니다.

   예제:

   void add(int a, int b) {
       a = a + b;
   }

   int main() {
       int x = 5, y = 3;
       add(x, y);
       // x는 여전히 5이며, 함수 호출 후에도 변하지 않습니다.
       return 0;
   }



2. 참조에 의한 전달 (Pass by Reference):
   - 참조에 의한 전달은 함수에 인자의 참조(Reference)를 전달하는 방식입니다.
   - 함수 내에서 인자를 수정하면 원본 값도 함께 수정됩니다.
   - 큰 데이터나 객체를 효율적으로 전달할 때 사용됩니다.
   - 함수 선언 시 매개변수에 `&`를 사용하여 참조로 전달한다는 것을 명시합니다.

   예제:

   void add(int &a, int &b) {
       a = a + b;
   }

   int main() {
       int x = 5, y = 3;
       add(x, y);
       // x는 이제 8로 변경되었습니다.
       return 0;
   }



이 외에도 포인터를 이용한 인자 전달 방식도 있으며, 이것은 값에 의한 전달과 유사하게 작동하거나 포인터가 가리키는 데이터를 수정할 수 있습니다. 함수 인자 전달 방식은 프로그램의 요구사항에 따라 선택되며, 효율성과 데이터 무결성을 고려해야 합니다.

 

객체 치환 및 객체 리턴

C++에서 객체를 치환하거나 다른 함수로부터 객체를 반환하는 방법은 중요한 주제 중 하나입니다. 객체 치환 및 객체 리턴에 대한 기본적인 원칙은 다음과 같습니다:

1. 객체 치환 (Object Assignment):

   객체를 다른 객체로 치환하려면 해당 객체의 복사 생성자나 이동 생성자를 사용해야 합니다. 이는 객체를 새로운 값으로 대체하는 것을 의미합니다.

   예제:

   #include <iostream>
   
   class MyClass {
   public:
       int value;
       MyClass(int v) : value(v) {}
   };
   
   int main() {
       MyClass obj1(10);
       MyClass obj2(20);
   
       obj2 = obj1; // obj2를 obj1로 치환
       
       std::cout << obj2.value << std::endl; // 출력: 10
       
       return 0;
   }



2. 객체 리턴 (Object Return):

   함수에서 객체를 리턴하려면 해당 객체의 복사 생성자나 이동 생성자를 사용하여 반환합니다. 함수가 객체를 반환할 때, 반환된 객체는 함수 호출자에게 복사됩니다.

   예제:

   #include <iostream>
   
   class MyClass {
   public:
       int value;
       MyClass(int v) : value(v) {}
   };
   
   MyClass createObject() {
       return MyClass(30); // 객체를 생성하고 반환
   }
   
   int main() {
       MyClass obj = createObject();
       
       std::cout << obj.value << std::endl; // 출력: 30
       
       return 0;
   }



   여기서 중요한 점은 반환되는 객체가 복사되기 때문에 객체가 크고 복사가 비용이 많이 들면 성능 문제가 발생할 수 있습니다. 이런 경우 이동 생성자를 사용하여 성능을 최적화할 수 있습니다.

객체 치환 및 반환은 C++에서 중요한 개념 중 하나이며, 객체 지향 프로그래밍에서 주로 활용됩니다. 이러한 작업을 수행할 때 객체의 복사 및 이동 생성자를 올바르게 구현하고 이해하는 것이 중요합니다.

 

참조(reference) 와 함수

C++에서 참조(reference)는 함수와 밀접하게 관련된 중요한 개념 중 하나입니다. 참조는 함수의 매개변수로 전달하거나 함수의 반환 값으로 사용할 수 있으며, 함수와 관련된 여러 가지 작업을 더 효율적으로 수행하는 데 도움을 줍니다.

아래에서 참조와 함수와의 관련성에 대해 설명합니다:

1. 매개변수로의 참조 전달:
   - 함수의 매개변수로 참조를 사용하면 함수가 호출될 때 인자로 전달한 변수의 복사본이 아니라 원본 변수를 참조하게 됩니다. 이를 통해 함수 내부에서 변수를 수정하면 호출자의 변수도 변경됩니다.

   void modifyValue(int &ref) {
       ref = 42;
   }

   int main() {
       int x = 10;
       modifyValue(x); // x의 값을 변경
       // 이제 x는 42입니다.
       return 0;
   }



2. 참조를 반환:
   - 함수에서 참조를 반환할 수 있습니다. 이렇게 하면 함수 호출자는 함수 내부의 변수를 참조할 수 있으며, 반환된 값을 수정하면 함수 내부의 변수도 변경됩니다.

   int &getRef() {
       static int num = 5; // 정적 변수
       return num;
   }

   int main() {
       int &x = getRef(); // 함수에서 정적 변수의 참조를 반환
       x = 20; // 정적 변수의 값 변경
       // 이제 getRef() 함수 내부의 변수 num은 20입니다.
       return 0;
   }



참조는 복사를 피하고 메모리 및 성능을 최적화하는 데 도움이 되며, 함수에서 객체를 수정하거나 다른 함수로 전달할 때 특히 유용합니다. 그러나 주의해야 할 점은 참조를 사용할 때 NULL을 참조하거나 초기화되지 않은 메모리를 참조하는 등의 오류를 방지해야 합니다.

반응형

+ Recent posts