강의 흐름
- this 포인터 - 객체의 메모리 공간, 멤버 함수의 메모리 공간, 멤버 함수 호출
- 네임 맹글링 - 오버 로딩, 오버 로딩 가능한 함수인지 불가능한 함수인지
- 배열 - 배열 개념, 배열명,배열식,인덱스활용 for문
this 포인터
- this를 자기 참조형 포인터라고 한다.
- this를 who am I 포인터라고도 한다.
- 멤버 함수는 this 값이 필요하다. -- 객체를 통해서만 접근 가능하기 때문에.
Monster 클래스 안에는 멤버 변수, 생성자, 멤버 함수가 존재한다.
이 Monster 클래스를 이용하여 객체를 생성한 뒤 객체의 메모리 공간을 살펴보자.
여기서 알 수 있는 점!
- 생성된 객체의 메모리 공간에는 멤버 변수만 있고, 멤버 함수는 없다.
- 멤버 함수는 클래스 영역에 하나가 만들어져 있는 것이다.
- 멤버 변수들과 같이 객체에 자리잡지 않고, 클래스 영역에 만들어지고, 그것을 다 공유해서 사용하는 것
멤버 함수 호출 test
멤버 함수 info( )를 a객체와 b객체가 호출 - 값이 다르게 적용돼서 나온다.
info() 함수는 a객체가 자기를 호출했는지, b객체가 자기를 호출했는지 어떻게 구별해서 값을 주는 것일까?
클래스 영역에 있는 멤버 함수들은 어떤 객체가 자기를 호출했는지 어떻게 구별해서 값을 주는 것일까?
우리가 써주진 않았지만 this 포인터가 생략되어있던 것이다!
(( this -> )) 이것이 생략되어있던 것이다.
this를 자기 참조형 포인터라고 한다.
this를 who am I 포인터라고도 한다.
멤버 함수는 this 값이 필요하다. -- 객체를 통해서만 접근가능하기 때문에.
a 객체가 할당받은 선두 번지 주소 값과 bb 객체가 할당받은 선두 번지 주소 값이 -- this에 들어가 있다.
a 객체가 info ( ) 함수를 호출할 때 - 자신의 this 포인터를 함께 전달하는 것이다.
b 객체가 info ( ) 함수를 호출할 때 - 자신의 this 포인터를 함께 전달하는 것이다.
info( ) 함수는 a와 b의 this 포인터 주소 값으로 정확하게 접근 가능
멤버 함수는 this 값이 필요하다. -- 객체를 통해서만 접근 가능하기 때문에.
+@ this를 사용해야 되는 경우! - 이름이 같은 경우
java에서는 this . health 했던 것들!
c++에서는 this->_health = health;라고 사용
네임 맹글링 - 오버 로딩
c언어에서는 동일한 함수명 사용 불가능 - 구별 안됨.
c++에서는 동일한 함수 사용 가능
- 네임 맹글링이라는 함수 네이밍 방법을 사용하기 때문에 - 오버 로딩
- 같은 이름의 함수를 만들 수 있다. - ( 내부 로직에서는 다르다. addXX와 addYY로 호출 )
- 같은 이름의 함수를 만드는 것을 오버 로딩이라고 한다.
오버 로딩 가능한 경우와 불가능한 경우 Check
리턴 타입은 함수 네이밍에 포함되지 않기 때문에 상관 X – 같은 함수다.
1번 함수명이 같고,
2번 매개변수의 타입형이 같고
3번 매개변수의 개수가 같으면
같은 함수이다. ( 변수명은 상관없음. )
배열 - Array
- 동일한 데이터 타입의 저장공간이 여러 개 필요할 때 사용
- 배열명,배열식,인덱스,for문 이용
0부터 100까지 저장하시오. 방법은??
방법 1번 – 변수 하나하나 만들어서 저장해주기.
- int a0 = 0;
- int a1 = 1;
- ------
- int a100 = 100;
- 어렵게 저장했지만 만약 여기서 추가 요청. -- 짝수만 출력하세요 하면?
- if( a0 % 2 == 0 ) 식으로 변수 하나하나 마다 다 해줘야 됨.
- 0부터 100이 아니라 0부터 1,000/ 10,000/ 100,000 이면? OMG.
방법 2번 – 배열(Araay)
- 배열은 동일한 데이터 타입의 저장공간이 여러 개 필요할 때 사용한다.
int array [101];
- 인트 저장할 수 있는 공간 101개 만들어줘라 – 404byte의 공간을 뻥! 만들어준다.
배열명
- 배열명은 배열을 할당받은 주소의 선두 번지 주소 값. =주소 상수라고 한다. 주소 값 그 자체를 의미
- 배열명은 2000번지 할당받으면 2000이라는 주소명으로 변경된다.
- array = 100; 이런 방법으로 array라는 배열명에 값을 대입하는 식은 안된다.
- array는 주소 값이기 때문에
배열식
- array [0] => 배열 주소 값 할당받은 array로부터 0칸만큼 떨어진 공간 -> 2000번지
- array [1] => 배열 주소 값 할당받은 array로부터 1칸(4byte)만큼 떨어진 공간 -> 2004 번지
- array [3] => 2012 번지~ 2000번지 array로부터 3칸 떨어진 공간
인덱스
- 한 칸의 의미는 - 요소의 size – int니까 4byte씩
- 배열은 이런 식으로 index번호가 부여된다. 한 칸의 의미는 요소의 size
for문을 이용한 입력과 출력
- 배열식과 인덱스를 활용한다.
- 입력 : for( int i = 0; i < 101; i++ ) { array [ i ] = i };
- 출력 : for( int i = 0; i < 101; i++ ) { cout << array [i] << endl; };
총 정리
- 배열은 동일한 데이터 타입의 저장공간이 여러 개 필요할 때 사용한다.
- 배열의 size만큼 공간이 뻥! 하고 만들어 준다.
- 그 공간을 잘라서 쓰는 것이고,
- 잘라서 쓰다 보니 데이터가 인접해서 만들어진다.
- 인접하게 만들어지다 보니까 인덱스가 생기고,
- 그것을 이용해서 배열식과 for문을 사용할 수 있게 된다.
review
이번 강의에서는
this 포인터, 네임 맹글링, 배열에 대해 배웠다.
this 포인터 = 자기 참조형 포인터 = who am i 포인터
객체를 통해서 멤버 함수를 사용할 때 그냥 객체를 통해서 호출하니까
호출한 객체에 맞는 거 줘야지라며 추상적으로 생각했었는데
객체가 멤버 함수를 호출할 때 자신의 this포인터도 같이 전달해 주는 것이고,
함수는 전달된 함수의 this 포인터에 맞는 값을 전달해 주는 것이었다.
내부적으로 어떻게 작동되는지 알 수 있어서 새로웠다.
네임 맹글링 = 오버 로딩 - 내가 좋아하는 C++의 특징 파트 ~!
함수명이 동일하여도 나머지 2가지 조건이 다르면 다른 함수로 인정되어 사용 가능한 점이 신기했다.
C++에서 같은 함수가 되는 3가지 조건
1. 함수명이 같고 / 2. 매개변수의 타입형이 같고 / 3. 매개변수의 개수가 같은 함수!
변수명과 리턴 타입은 상관없다.
배열 - Array
배열의 개념은 이미 많이 듣고 배워서 알고 있다 생각했었는데
이것 또한 추상적으로 이해하고 있던 부분이었다.
배열을 만들면 index가 생기고 그것을 사용하면 되는 것이다라고 이해했었는데
배열을 만들면 왜 배열식을 이용할 수 있고, 인덱스가 생겨서 for문을 이용할 수 있는지를
이해하게 되어서 좋았다.
java를 공부할 때 그냥 이렇게 사용하는 거구나 했던 부분들 -
( 객체를 만들면 그 객체로 멤버 함수를 호출할 수 있어
배열을 만들면 배열의 요소들에게 순서가 생기고, 그것을 이용하여 관리할 수 있어 )
이처럼 추상적으로 이해했던 부분들이
왜 그렇게 멤버 함수를 호출할 수 있는지, 배열의 인덱스가 왜 생기는지를
배울 수 있는 점이 C++수업을 들으면서 나에게 가장 좋은 점이다.
'Back-end > C++' 카테고리의 다른 글
22.03.18 - 동적 객체 배열, C언어 형식 지정 문자열, 동적 객체 포인터 배열 (0) | 2022.03.25 |
---|---|
21.03.17 - 객체 배열, 동적 객체, 개념 플러스(GC,Malloc,Cin) (0) | 2022.03.24 |
22.03.15 - 정적 멤버 변수, 정적 멤버 함수, 함수 호출 방식 (0) | 2022.03.18 |
22.03.14 - 포인터형, 참조형, const형 변수 (0) | 2022.03.18 |
22.03.11 - 생성자 초기화 리스트, 포인터형과 참조형 (0) | 2022.03.16 |