insert했을 때 이렇게 들어가야함.
이 iterator 생성자인데
insert하고나서 반환하는 생성자에 뭐 넣어 주어야 할까?
우리가 insert하였을 때의 새로 생성된 iterator를 되돌려 주어야한다.
이렇게
그래야
main에서 다시 받으면 insert한 녀석이 들어가니까 병신아.
erase함수 구현은 과제이다.
연산자 오버로딩 같은 경우 안에다 구현을 하고 다른 public함수는 밖에다가 구현을 해놨는데
template의 경우 크게 상관이 없다.
그런데 자동완성을 하면 inline이라는 키워드가 붙는다.
컴파일러에게 우리가 구현한 함수에 대해서 최적화를 진행을 시켜달라.
"최적화를 진행시켜달라는 말이 무슨말"?
같은 기능이 자주 호출되면 코드 복붙해야하니까
"함수화"해서 호출을 했었다.
그런데 이게 원래는 호출을 하면 그 함수의 코드를 호출한쪽에다가 적어내는 식인것이다.
=> 너무 많이 호출하면 할 수록 해당 함수의 코드가 많이 생겨난다.
지금은 template인 경우
우리가 "특정 타입"을 요청 했을 경우, 즉시 해당 타입의 버젼의 클래스가 나와야 해서 헤더에 모든 정보가 다 있어야한다.
template이 아닌 경우, 클래스를 .h, .cpp로 따로 분리를 해서 구현을 했었다!!
헤더에는 "선언부", cpp에는 "정의부"
전역함수의 경우
헤더에 구현이 있게되면은 그 헤더파일을 참조하는 만큼 함수가 여러개가 생겨나서
"중복 정의"가 발생했었다.
클래스는 헤더에다가 구현을 해놓으면
어떻게 받아 들여지냐면은
"inline"처리하겠다라고 받아들여진다.
"inline처리"가 뭐냐?
=> 그 함수를 호출 했을 때, 호출 하는 쪽에 그 코드를 "추가"를 해버리는 것이다.❗❗
그 함수를 "호출"하는 식이 아니라 ❗❗
해당함수를 호출하는쪽에 그 기능을 그냥 그대로 붙여 넣어버리는 것이다.
=> 즉, 함수의 "호출 비용"이 생기지 않게 하겠다라는 말이다❗❗❗
이 함수들 호출을 하게되면 호출한쪽에 그대로 다 복사가 되어버리는 것이다.
그런데 내가 inline을 해놨다고 해서 컴파일러가 그렇게 다 동작은 하지 않는다.
왜냐하면 비효율적일 때도 있는데
함수가 호출이 많이 될 경우,
함수의 구문이 굉장히 길다면 호출 되는쪽마다 그 긴 함수를 다 복붙 해놓는 식임.
호출하는 쪽에 그 엄청 긴 코드를 붙여 넣는 식이면
최종빌드가 되는 부분에서 코드의 "양"이 개많아진다.
이런애들은 그래서 무조건 inline처리 되지 않는다.
컴파일러가 알아서 판단을 해서 inline처리를 할지 안할지 결정함❗
함수의 코드 줄이 짧은 경우,
inline이 아니라면 짧은 기능을 수행하기 위해서
함수 호출 스택 할당 -> 기능 수행 -> 함수 호출 스택 해제 -> 되돌아옴
그런데 코드가 두줄이면은 그냥
두줄을 복붙 하는게 좋지 않을까?
함수 호출 비용도 줄이고 굿굿.
(C# property)
get set함수는 보통 헤더에다가 구현을 해놓는다.
=> 이말 자체가 inline처리를 하겠다라는 것이다.
그 외의 함수들은 cpp에서 구현을 해서 통상적인 함수의 호출 방식을 따르게 해준다.