CS/C++

C++ 공부 섹션8 : 홍정모의 따배씨쁠쁠

샤아이인 2022. 1. 16.

내돈내고 내가 공부한것을 올리며, 시간을 들여 배운과정을 복습하기보다는 간결히 공부한 흔적은 남긴다 하고 생각하고 써갈 예정입니다. 모든 내용을 이곳에 올릴수는 없으며, 그중 기억남은 몇가지 내용 위주만 올리겠다.

1) 섹션8

드디어 손꼽아 기다리던 객체지향에 대하여 공부할 수 있었다. 먼저 명품 C++ 에서 3단원인 객체지향을 읽어본후 강의 까지 듣느라 시간이 좀 걸렸다. 내일도 진도를 나가기 보단 복습과 LearnCPP를 읽고 예제문제를 풀어볼 생각이다.

◆ class에서 constructor를 만들때 다음 사진과 같이 default값을 지정해줄 수 있었다.

출처 - 홍정모의 따배씨쁠쁠 강의

 또한 초기화를 할때 constructor를 사용할때 값의 대입이 아닌, 멤버 초기화 목록을 사용할 수 있었다.

출처 - 홍정모의 따배씨쁠쁠 강의

 위임생성자는 다른 생성자를 이용하는 방식이라 할수 있다.

출처 - 홍정모의 따배씨쁠쁠 강의

위의 사진을 보면 위임생성자 내부에서 타겟생성자를 이용하여 초기화 하는것을 볼 수 있다. id_in값을 0으로 고정시켜논 것이다.

 

 소멸자는 많이 사용하지는 않는다 하셨지만, 여하튼 사용될때는 끝났음을 강조해주는 것 같다.

출처 - 홍정모의 따배씨쁠쁠 강의

예를들어 위의 맴버함수에서 동적할당을 받고 있는대 이렇게 받은 메모리를 delete해주지 않는다면 메모리 leak이 생기기 마련이다.

이러한 문제를 해결해 주기위해 class 내부적으로 delete를 해주는 부분을 소멸자 부분에서 해줄수 있다.

일종의 cleanUp 과정인 것이다.

 

 This 포인터는 instance 자신의 주소를 말한다.

출처 - 홍정모의 따배씨쁠쁠 강의

인스턴스 자신의 주소를 알려면 위의 사진처럼 this를 출력해주면 자신의 주소가 나온다.

 

<this 의 원리>

위의 class를 그대로 이용해보면

Simple.simple{1};

Simple.simple(2);

std::cout << simple.getID() << endl;

 

이 코드에서 2가 추력되는 것은 타당하다. 이러한 과정에 this 포인터가 숨어있다.

simple.setID(2);는 compiler에 의해서 setID(&simple, 2);로 변환된다.

변환된 모습을 보면 단순한 함수에 인자로 주소값을 넣어주는것으로 바뀌었다.

 

이 주소는 어떻게 사용될까?

member funcion인 setID는 void setID(int id) {m_id = id;} 가 void setID(Simple* const this, int id) {this->m_id = id}; 로 변환된다.

 

compiler가 normal member function을 compile 할때는 암시적으로 새로운 parameter인 this를 추가하는 것 이다.

이 this 포인터에 member함수가 호출된 object의 주소가 const로 담겨져 있다.

 

또한 중요한 것은 member function안에서 변수나 함수가 사용될때는 prefix로 "this->"가 각각의 앞에 암시적으로 붙는다.

class내부의 m_id 는 사실 this->m_id 인 것이다.

 

 와 이건 진짜 뇌리에 박혀버린 방식이다. 우선 난 Python에서 class를 사용할때 여러 method를 dot연산자를 사용해 호출할수 있다는 것은 알고 있었다.

하지만 C나 C++에서는 이러한 방식을 사용할수 없는 줄 알았다. 하지만 우회하여 사용하는 방식이 있었다.

 

이러한 방식을

Chaining member function이라고 한다.

출처 - 홍정모의 따배씨쁠쁠 강의

맴버함수가 this의 역참조, 즉 instance가 가리키는것을 반환하고 이를 참조형으로 반환하는 것 이다.

이렇게 하면 위의 사진에서처럼

cal.add(10).sub(1).mult(2),print(1)과 같은 방식으로 사용할 수가 있다.

 

 const의 사용은 사실 너무 당연한것이라 당연하게 받아들이면 된다.

출처 - 홍정모의 따배씨쁠쁠 강의

다만 주의할것이 있었는대, Something class가 const가 값을 바꿀수 없는것은 당연하지만, const 멤버함수는 호출이 가능하다는점 명심해야 겠다.

추가로 copy constructor와 const 오버로딩에 대하여 배웠는대 중요한 내용이고 너무 방대해 여기에 기제하지는 않겠다.

 

 static함수의 경우 내부에서 this포인터를 사용할수가 없다. 따라서 이와 관련된 모든 기능을 사용할수가 없다.

출처 - 홍정모의 따배씨쁠쁠 강의

다만 static 변수인 s_value는 사용할수가 있다. s_value는 instance마다 따로 생성되는 변수가 아닌 class 내부에 박힌 공용변수라고 생각하는것이 편한것 같다. 붕어빵이 아닌 붕어빵틀에 박힌것 이다. 따라서 s_value는 This 포인터가 필요없으며 사용이 가능하다.

 

 각 instance를 생성하면 맴버변수들은 다 새로 생성된다. 서로다른 인스턴스들은 맴버변수의 이름은 같지만 다른 주소값을 같는 것이다. 하지만 함수의 경우 포인터를 사용하여 모두 같은 함수를 사용하는 것 이다.

출처 - 홍정모의 따배씨쁠쁠 강의

 

 private로 선언된 변수는 원래 직접 사용할수가 없다. 하지만 friend로 선언해주면 사용할수가 있어진다.

출처 - 홍정모의 따배씨쁠쁠 강의

 주석의 방식처럼 A a;로 새로운 인스턴스를 생성하는 것 이 아닌, A()와 같은 방식으로 일시적으로 만들어 사용하는 것 이다.

출처 - 홍정모의 따배씨쁠쁠 강의

2) 나의 현황

 오늘 공부한 내용도 새롭고 재미있는 내용이 많았다. 다행이 이해못하는 내용은 하나도 없었다.

다만 오늘 처음보는 내용들이 벌써부터 많은 내용을 까먹은것 같다.

내일 눈 뜨자마자 LearnCPP 한번씩 다 쭉 읽어보고, 명품 C++ 객체지향 연습문제를 풀어야 겠다.

진도보다는 오늘 배운 객체 지향을 어느정도 소화하고 나가야 겠다.

​아 물론 진도도 벌써 절반이나 나갔다. 하루에 한강씩 꼭 완주하다 보니 진도가 훅훅 나갔다.

C를 안배운 상태였다면 더 오래걸렸겠지만, C를 6개월 가량 공부하고난 후 인지라, 어느정도 개념들이 손쉽게 훅훅 받아들여진다.

 

이글의 모든 사진과 내용의 출처는 홍정모 교수님께 있습니다.

홍정모 교수님 블로그:

 

홍정모 연구소 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

댓글