C++

c++ 참조

Barbarian developer 2024. 9. 25.

 

 

  • 참조의 기본 개념 이해: 참조의 정의, 선언 방법, 특징 등 기본적인 개념을 익혀 봅시다.
  • 참조의 활용 탐구: 함수 매개변수 전달, 반환 값, const 참조 등 다양한 활용 방법을 살펴봅시다.
  • 참조와 포인터 비교 분석: 참조와 포인터의 차이점을 비교하고 각각의 장단점을 분석해 봅시다.

참조의 기본개념 이해

참조의 정의

참조는 기존 변수에 새로운 이름(별명)을 붙여주는 기능입니다. 마치 '철수'라는 친구를 '똘똘이'라는 별명으로 부르는 것과 비슷하죠. 하지만 참조는 단순한 별명 이상의 의미를 가집니다. 한 번 생성된 참조는 항상 특정 변수를 가리키며, 그 변수를 통해 값을 변경하거나 읽어올 수 있습니다.

참조 선언 방법

#include <iostream> // 입출력을 위한 헤더 파일 포함

using namespace std;

int main() {
    int originalValue = 10;
    int& reference = originalValue; // reference는 originalValue의 참조입니다.

    cout << "originalValue: " << originalValue << endl; // originalValue 값 출력
    cout << "reference: " << reference << endl; // reference 값 출력 (originalValue와 동일)

    reference = 20; // reference를 통해 originalValue 값 변경

    cout << "originalValue: " << originalValue << endl; // originalValue 값 출력 (변경된 값)
    cout << "reference: " << reference << endl; // reference 값 출력 (originalValue와 동일)

    return 0;
}

 

참조의 특징

  • 반드시 초기화: 참조는 선언과 동시에 반드시 초기화되어야 합니다.
  • 재할당 불가: 한 번 특정 변수를 가리키도록 설정되면 다른 변수를 가리키도록 변경할 수 없습니다.
  • null 값 불가: 참조는 항상 유효한 변수를 가리켜야 하므로 null 값을 가질 수 없습니다.

참조의 활용

참조는 단순히 변수에 별명을 붙이는 것 이상의 다양한 활용 방법을 가지고 있습니다. 마치 맥가이버 칼처럼, 필요에 따라 여러 가지 작업을 수행할 수 있습니다.

 

1. 함수 매개변수 전달:

참조를 사용하면 함수에 변수를 전달할 때 값을 복사하지 않고 원본 변수에 직접 접근할 수 있습니다. 이는 큰 데이터를 다룰 때 메모리 사용량을 줄이고 성능을 향상시키는 데 도움이 됩니다. 마치 친구에게 물건을 빌려줄 때 복사본이 아닌 원본을 빌려주는 것과 같습니다.

void swap(int& a, int& b) 
{
    int temp = a;
    a = b;
    b = temp;
}

int main() 
{
    int x = 10, y = 20;
    swap(x, y); // x와 y의 값이 서로 바뀝니다.
    return 0;
}

 

2. 반환 값:

참조를 반환 값으로 사용하면 함수 외부에서 함수 내부의 변수에 직접 접근할 수 있습니다. 이는 특정 변수를 수정하거나 읽어올 때 유용하게 사용될 수 있습니다.

int& getMax(int& a, int& b) {
    return (a > b) ? a : b;
}

int main() {
    int x = 10, y = 20;
    getMax(x, y) = 30; // x와 y 중 큰 값을 30으로 변경합니다.
    return 0;
}

 

3. const 참조:

const 참조는 참조를 통해 변수의 값을 변경할 수 없도록 제한합니다. 이는 함수 내에서 실수로 변수의 값을 변경하는 것을 방지하고 코드의 안정성을 높이는 데 도움이 됩니다.

void printValue(const int& value) 
{
    cout << value << endl; // value 값을 출력만 하고 변경은 불가능합니다.
}

 

 

 

참조와 포인터의 비교

참조:

  • 별명: 기존 변수에 새로운 이름을 붙여줍니다.
  • 안전성: null 값을 가질 수 없고, 한 번 초기화되면 다른 변수를 가리킬 수 없어 안전합니다.
  • 간결성: 포인터 연산자(*)를 사용하지 않아 코드가 간결해집니다.

포인터:

  • 주소 저장: 변수의 메모리 주소를 저장합니다.
  • 유연성: null 값을 가질 수 있고, 다른 변수의 주소를 자유롭게 가리킬 수 있어 유연합니다.
  • 복잡성: 포인터 연산자(*)를 사용하여 메모리 주소를 직접 다루기 때문에 코드가 복잡해질 수 있습니다.

사용 시점:

  • 참조: 함수 매개변수 전달, 반환 값 등 변수를 직접 수정하거나 읽어올 때 유용합니다.
  • 포인터: 동적 메모리 할당, 연결 리스트, 트리 등 메모리 주소를 직접 다뤄야 하는 경우에 유용합니다.
특징 참조 포인터
선언 및 사용 int& ref = num; (주소 연산자 불필요) int* ptr = &num; (주소 연산자 필요)
접근 ref = 10; (일반 변수처럼 사용) *ptr = 10; (역참조 연산자(*) 사용)
Null 가능성 불가능 가능
재할당 불가능 (한 번 초기화되면 다른 변수를 가리킬 수 없음) 가능
안정성 높음 (Null 값 불가, 재할당 불가) 낮음 (Null 포인터 역참조 오류 가능성, 잘못된 메모리 접근 가능성)
가독성 높음 (포인터 연산자 불필요) 낮음 (포인터 연산자 사용)

'C++' 카테고리의 다른 글

' : '과 ' :: '의 차이점  (0) 2024.09.26
c++클래스(2)  (0) 2024.09.25
c++ 클래스  (3) 2024.09.25
vector와 array  (0) 2024.09.25
C++ 첫 걸음  (3) 2024.09.24

댓글