Back-end/C++

22.03.14 - 포인터형, 참조형, const형 변수

giggs 2022. 3. 18. 15:17

 

강의 흐름 

  • 전날 가볍게 살펴본 포인터형과 참조형 추가 설명
  • const형 변수가 무엇인지
  • 생성자 부분에서의 참조형과 const형의 활용과 특징

 

 


 

 

포인터형

  • C와 C++은
  • 변수가 메모리에 할당받은 주소 값을 저장하는 데이터 타입을 가지고 있다 - 그 데이터 타입이 포인터형!
  • 포인터형으로 만들어진 애들이 가지고 있는 값은 : 주소 값!

 

 

포인터형으로 만들려면 어떤 데이터 타입이 저장되어있는지 알아야 한다..

 

 

 

 

& ( 주소 연산자 ) 변수의 주소 값을 돌려준다.

int a  = 100;

&a = 2000번지; ==> int 100이 저장되어있는 변수 a의 주소 값

 

 

여기서 포인터형( * ) 은 포인터형 지정자로 사용!

 

int* ==========> ( int값을 저장하고 있는 공간의 주소 값 )을 저장할 수 있는 데이터 타입

int* pa ========> ( int값을 저장하고 있는 공간의 주소 값 )을 저장하는 변수 pa

pa = &a; ======> ( int값을 저장하고 있는 공간의 주소 값 = &a = 2000번지)를 변수 pa에 대입

int** ppa = &pa >  ( int값을 저장하고있는 공간의 주소 값 = &pa = 3000번지)를 변수 ppa에 대입

 


 

여기서 이제 반대로 ppa를 통해 a에 접근해 보자.

 

 

여기서 포인터형( * ) 은 포인터형 연산자로 사용!

 

주소 값에 ( * )를 붙이면 -- 여기 주소에 할당받은 공간을 의미

 

**ppa;

 

1차 =>

* * (&pa) ----- ppa = &pa ( ppa변수에는 pa의 주소 값 &pa 저장되어있음-3000번지)

 

2차 =>

*(*&pa) ==> *( pa ) = *pa; ----- *&pa = pa ( int저장 4byte 공간인데 3000번지에서 시작하는 애 = pa )

 

3차 =>

*(&a)----- pa = &a ( pa변수에는 a의 주소 값 &a 저장되어있음 - 2000번지)

 

4차 >

*(&a) ==> *&a = a; ------- *&a = a ( int저장 4byte 공간인데 2000번지에서 시작하는 애 = a )

 

①ppa = &pa ② *&pa = pa ③ pa = &a  ④*&a = a

 

내가 이해한 내용으로 포인터의 원리를 정리해보았다.

 

 

 


 

참조형

 

 

작동하는 내부 로직( 주소 값을 주고받는 )은 포인터형과 같지만, 차이점 check 필요!

 

 

1. 참조형 변수 refa refa는 정의와 동시에 초기화를 해야 한다! 

  • 47번 line - 정의해놓고 48번 line -  초기화하는 방법은 안된다.
  • 50번 line -처럼 정의와 동시에 초기화 필요!  

 

2. 초기화해준 주소 값에서 다른 주소 값으로 변경 불가능!

  • 50번 line - a변수의 주소 값을 참조하기로 했으면, a변수만 가리킨다.
  • 포인터형 변수는 -  pa = &b; 해주면 이제 b의 주소 값 저장하도록 변경 가능.
  • 51번 line - 초기화된 주소 값을 가지고, 그 공간의 값은 변경 가능 ( a변수의 값 변경 가능 ) 

 

3. 참조형 변수는 메모리 공간이 생기는 것이 아니다.

  • 변수가 생기는 것이 아니므로 변수를 저장할 공간이 새로 생기지 않는다.
  • a를 나타내는 별칭이 하나 더 생긴 것으로 이해하면 좋다.

 

 

 


 

const 형

 

 

 

  • 상수 constant에서 따옴.  상수형 변수라 한다. <-> ( 변수 variable )
  • 값을 변경할 수 없어서( 상수형 ) + 메모리 공간을 차지하고 있어서 ( 변수 ) 합쳐서 = 상수형 변수
  • Line 54 --- const 형 변수는 정의와 동시에 초기화 필수! 
  • Line 55 --- 한 번 지정된 값에서 다른 값으로 변경 불가능.

 


 

생성자 부분에서의 참조형과 const형

 

 

생성자를 꼭 만들어줘야 하는 경우가 있다. 

 

멤버 변수에 참조형 / const형 있는 경우

 

 

멤버 변수에

  • 10번 Line => 참조형 변수가 있는 경우 - int& refa; 
  • 11번 Line => const 형 변수가 있는 경우 - const int MAX; 
  • 18번 Line => _refa(_value), 부분 - 기본 생성자에 참조형 변수 써야 한다면 멤버 변수 다른 거 물게 해 주면 된다.

 

18번 Line => MAX(200); 부분 - 기본 생성자에 const형 변수 MAX(200)의 값으로 초기화해주면

 

  • 78~80번 Line => 기본 생성자로 생성되는 객체들은 MAX의 값으로 모두 다 200의 값을 가진다.
  • 콘솔 출력 부분 d, e, f 객체 _MAX 값 동일한 것 체크

 

+@ 주소 값을 참조하는 _refa 멤버 변수 초기화를 위해 _value의 값을 물려줬다.

+@ 그래서 _value의 값이 변경되면 그 주소 값을 참조하고 있는 _refa값도 변경된다.

 

변경된 value 값에 따라서 그 주소 값을 참조하는 refa 변경되는 부분 체크 - _refa = _value)

 

 


 

 

참조형과 const형 변수는 생성자 초기화 리스트를 통해서 초기화해야 한다.

 

기본 생성자가 아닌 인자를 받는 생성자를 만들 경우 

참조형과 const형 변수는 생성자 초기화 리스트로 초기화!

 

 

28~29번

=> 생성자 안에서 속성 값들 넣어주는 것은 메모리 공간 할당 끝난 상태에서, 대입 연산을 통해서 넣어주는 것이다.

 

26번 Line 

=> 참조형과 const형은 메모리 할당과 동시에 값을 넣어주는 생성자 초기화 리스트를 통해서만 가능

 

 

 


 

이렇게 인자를 받는 생성자를 생성해 놓으면

 

 

참조형 멤버 변수 _refa의 초기화를 위해 다른 멤버 변수 _value의 주소 값을 대입해줬는데 ==> 이 주소 값 변경 가능

const형 멤버변수 MAX의 값을 모든 객체들이 동일하게 사용했었는데 ==> 객체마다 다른 MAX 값으로 사용 가능

 

 

콘솔 출력 창에서

 

1. a, b, c 객체의 MAX값이 다르게 입력된 것 확인 

2. a, b, c 객체가 참조하는 외부 변수의 값 변경 시 _refa 값 변경 확인

  • 외부 변수 하나 바꾸면 모든 객체의 score 값이 바뀐다.
  • score 변수의 주소 값을 참조하고 있으므로
  • 활용법 : 0일 때 객체들이 모두 행동을 멈춰야 한다고 하면 score 값만 0으로 변경해주면 됨.

 


 

 

review

후후 이번 강의에서는 C와 C++ 만의 특징 포인터형! 에 대해서 배운 것이 기억에 남았다.

강사님이 설명해주실 때는 완벽히 이해를 한 것 같았는데,
정리하려고 몇 번 바꿔보고 왔다 갔다 해보니 이해를 못 한 것도 같았다가
정리해 놓은 것을 보니 다시 이해가 되는 듯한 느낌.
ㅎㅎ 포인터 형은 점점 더 알아가야 할 듯하다.

참조형은 주소 값을 전달하는 부분에서 포인터 형과 로직이 같지만
변수의 주소 값을 저장하는 변수가 새로 생기는 것이 아닌
변수에 접근할 수 있는 별칭이 생기는 것으로 이해!

const형은 상수형 변수로 이해!
정의와 동시에 초기화 필요 - 값을 변경할 수 없다.

참조형과 const형은 기본 생성자가 필요하고
초기화 시에는 생성자 초기화 리스트로!
생성자의 매개변수들로 참조 주소 값과 const형 변수의 값 변경 가능!



강의를 듣고 이해하고, 실습하고 하는 부분에서는 잘 진행되고 재밌었는데...
체크해 놓은 것과 정리해 놓은 부분을 추려서 순서에 맞게 글을 작성하는데 힘들었다.
강의의 흐름과 정리의 순서를 더 정확히 체크해 놓아야겠다.