reference

보물창고·2022년 8월 12일
0

c++ basic 코드누리

목록 보기
18/50

추가 240729

: ref vs const ref
-> 언제 사용?

  • 참조 객체를 통해 원본을 수정하고 싶다면, ref 를 사용하고,
    참조 객체는 그냥 원본만 따르고 싶고, 해당 객체로 원본 수정을 불가하게 하고 싶다면 const ref 를 사용하자.

레퍼런스 초기화

: 한번 참조를 하게 된 후, 다른 객체를 참조하는 것이 아니다.
초기화 이후에는 다른 객체를 복사대입한다.

개념

: 참조하는 객체를 지칭하는 또 다른 객체

동작에 대해

: 상수포인터와 동일한 기능을 수행함.
-> 그렇다면, const ref와의 차이점이 무엇인가??

레퍼런스는 주소 연산자 이동을 못하고, 한 번 참조 후에는 다른 값을 참조하지 못한다.
const ref 는 가리키는 참조값을 수정을 못한다.

예시 코드

: 한번 설정된 객체를 그래도 따라감.
-> 이 코드를 통해서 일반 ref와 const ref 차이 알 수 있음.

  • 1번 : 일반 ref 예시
    : const ref 는 const 성을 가지기 때문에 set이 불가하다.
    : ref 는 초기화 후에도 다른 값을 넣을 수 있다. 이 때는 다른 객체를 참조하는 것이 아닌 복사대입이다.
    -> 개념이 없으면 혼동할 수 있다.

  • 실행결과를 보면, 참조 객체인 r은 초기화 이후에는 다른 변수 a를 가리키는 것은 아님을 알 수 있다.

참조에서 알아야할 점. : 240729

결과
: 참조 객체는 초기화할 때의 객체를 그대로 따름, 이후의 대입에 관해서는 값대입만 하고, 그 객체를 따르지는 않음.

  • 2번 : const ref 예시
    -> const ref는 초기화만 가능하고, 이후에 다른 데이터를 넣을 수 없다.
    ref 보다는 구체적이다 라고 할 수 있다.

    결과
    참조 ref는 가리키는 객체의 값을 변경할 수 없음.

차이

ref 의 경우,직접 ref에 접근해서 원본의 데이터를 변경할 수 있지만,
const ref 의 경우, 직접 const ref 객체에 접근해서 원본 데이터 변경 불가함.

포인터와 참조의 유사점과 차이점.

유사점

: 기존 변수를 가리킴.

차이점.

  • 초기화
    1) 포인터 변수는 변수의 주소로 초기화함.
    : null값 넣을 수 있음.
    -> 초기값 생략 가능함.
    2) 참조 변수는 , 변수명으로 초기화함.
    : null값을 넣을 수 없음.
    -> 반드시 초기값 필요함.

  • 주소
    1) 포인터의 주소는 새로운 메모리 할당됨.
    2) 참조의 주소는 참조 변수의 메모리

메모리 접근성.

1) 포인터 참조

포인터로, 참조할 경우,
: ++연산자, -- 연산자 등을 통해
외부의 메모리에 접근하는 특징이 있고, 부주의할 경우 문제 유발함.

2) lvalue 참조.

참조는 외부메모리에 접근이 불가능함. -> 상수포인터와 동일한 동작 수행함.

problem

: call by address, ref를 통해 , 위의 내용에 맞게
동작되는지 확인하라

1) call by ref

  • 데이터 초기화와 변경 후, 결과 추출

  • ++와 -- 연산을 한 후 , 출력

    -> 참조한 변수의 value 자체가 변경됨.

2) call by address

-> 원본 -91의 값이 변동 없음.
--> call by ref와 동작이 다름을 확인할 수 있음.
=> 이때는 다른 포인터로 접근을 하게되는 것임.

  • 잘못됨.
  • ++ 연산이후에 값을 대입해보자.

    -> 할당되지 않은 힙메모리를 참조했기 때문에 발생할 것임.

  • 함수안에서 포인터의 주소와 , ++연산한 데이터의 메모리 주소를
    출력해보자.

-> 포인터연산 ++이 발생됨을 확인할 수 있음.
--> 포인터의 경우, 안전하지 못함.

  • 레퍼런스로 변경해서 주소 확인해보자.

    -> 포인터 연산이 이루어지지 않음을 확인함.

  • 원본과 참조 변수의 주소를 출력하라.

    -> 동일함을 확인할 수 있음.

profile
🔥🔥🔥

0개의 댓글