강의 흐름
- 전날 가볍게 살펴본 포인터형과 참조형 추가 설명
- 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형 변수의 값 변경 가능!
강의를 듣고 이해하고, 실습하고 하는 부분에서는 잘 진행되고 재밌었는데...
체크해 놓은 것과 정리해 놓은 부분을 추려서 순서에 맞게 글을 작성하는데 힘들었다.
강의의 흐름과 정리의 순서를 더 정확히 체크해 놓아야겠다.
'Back-end > C++' 카테고리의 다른 글
22.03.16 - this 포인터, 네임맹글링(오버로딩), 배열 (0) | 2022.03.24 |
---|---|
22.03.15 - 정적 멤버 변수, 정적 멤버 함수, 함수 호출 방식 (0) | 2022.03.18 |
22.03.11 - 생성자 초기화 리스트, 포인터형과 참조형 (0) | 2022.03.16 |
22.03.10 - 캡슐화, 객체, 접근 제어자, Set/Get함수 (0) | 2022.03.13 |
22.3.8. - 기초 개념 정의 (0) | 2022.03.13 |