오늘은 연결형 리스트를 클래스버젼으로 만들어 볼 것이다.
연결형 리스트는 클래스로, 리스트안에 들어갈 노드는 구조체로 만들것이다.
C++ 문법 기준으로 구조체와 클래스의 차이는 없다.
클래스라는게 생겨나면서 구조체의 기능들이 생성자, 소멸자, 상속 이런게 다 가능하기 때문에
구조체는 아무것도 안 적어주면 default값이 public이고
클래스는 default값이 private이다.
(C#은 private)
LinkedListNode는 이제 더 이상 구조체가 아니라
구조체 템플릿이다.
(안에들어갈 데이터가 T여야한다)
그러면 이런 구조체 템플릿을 가르키는 포인터 타입을 멤버로 가지는
LinkedList의 입장에서는 명확하게 타입을 정해 주어야한다.
구조체는 구조체인데 data의 자료형이 T인
즉
이런 구조체에 갔을 때 T자리에있는 "뭐가"들어가있는,
그런 구조체를 가르킬 수 있는 포인터 변수를 멤버로 가지고 있어야한다.
템플릿
사용자가 T버젼의 LinkedList를 만들면 그 클래스는, 정해준 T라는 버젼으로 클래스를 만들고,
그 클래스 안에서 T타입의 구조체를 다시 만드는 방식이다.
양방향으로 만들어 보도록 하고, 이전과 다음의 노드도 T타입 포인터 여야한다.
(타입이 정해지지 않아서)
하지만 LinkedListNode에서는
이렇게 적어 주지 않아도 된다.
본인(구조체)내에서는 본인을 의미(지칭)한다고 받아 들일 수 있기 때문에 이렇게
굳이 적지 않아도된다.
구조체 본인 내부에 있기 때문에.
(사용하는 클래스 내에서는 명확하게 해야한다)
함수의 인자로는 const T& inputData인데
타입 T가 미정상태이고, 복사 비용을 줄이기 위해서 reference로 받아오고,
또한 원본자체를 수정하지 않기 위해서 const로 받아옴.
생성자, 소멸자..etc... 다 만들 수 있다.
이렇게 구조체의 생성자 만들어 준다. : 는 이니셜라이저
그리고
이렇게 인자로 받아주는 버젼
그래서 이니셜라이져로 초기화를 받아온 인자로 하겠다는 말이다.
그리고 PushBack에서 먼저 new 를 통해서 노드 만들어 주었을 때
pre, next 포인터는 nullptr로 생성자 호출해서 만들어준다.
새로 생성한 노드가 헤드가 되어야하니까
deleteNode->nextNodeAddr로 해주어야 계속 연결해서 delete할꺼 아니가 ㅄ아.
C에서 free이고 클래스는 delete이다.
C
malloc, free
C++
new, delete
가변 배열과 리스트의 iterator
std::cout << "Hello" << 10 << std::endl;
<< 이거 무슨 연산자?
=> 쉬프트 연산자.
std::cin >> value