본문 바로가기
C++/[AssortRock] C++ 기초 다지기

CPP_1. AssortRock 7일차 오프라인 수업_220915

by 헛둘이 2022. 9. 16.
프로그래밍 공부에 대한 이야기
  • 보통 공부의 경우 이해를 하고 문제를 풀면서 연습한다
  • 코딩의 경우 이해가 안될 경우 조금씩 실습하면서 이해하는 과정이 필요하다.
  • 이해하는 과정을 겪고 다시 보면 이해가 됨

 

숙제에 관한 이야기
  • 이제 숙제 기존 4개에서 2개씩 올라감
  • 숙제의 난이도도 올라가고 수업 내용을 따라가는 것도 어려워졌으므로.

 

 

링크드리스트 숙제
  • 노드 삽입 로직에 리스트가 비어있을 때와 마지막 요소에 집어넣을 때 에러 발생
  • 그 에러를 처리할 수 있도록 로직 구현

 

 

클래스에 대한 내용
  • 링크드리스트를 구조체로 짜보니 불편한 점이 있다.
  • 링크드리스트 노드 삽입, 삭제 함수를 따로 만들어줘야 한다는 것
  • 이것을 올인원느낌으로 한 곳에 때려박는게 클래스
  • 클래스와 구조체의 가장 큰 차이는 접근제한 지시자 (클래스는 default가 private, 구조체는 public)
  • C++의 구조체는 클래스처럼 구조체 안에 함수를 집어넣을 수 있다. (생성자 소멸자 등)

 

 

접근제한 지시자에 대한 이야기
  • 접근제한 지시자를 사용하는 이유는 협업자들 간에 건들지말아야 할 부분을 지정해주기 위함

 

 

this의 존재에 대한 이야기
  • this는 객체를 가리키는 포인터로, 멤버함수의 작동원리는 this 포인터가 객체를 지정해서 함수호출하는 것.
  • 함수 뒤에 const를 붙이면 내부 값을 변경할 수 없다.
  • 그 이유는 this가 const this가 되기 때문, (const char* : 가리키는 값 변경 불가 / char* const : 포인터가 가리키는 주소 변경 불가)
  • this는 변경 불가하다 this가 변경되면 나 자신을 잃어버리는 것과 동일하기 때문
  • 그래서 this는 기본적으로 this const로 되어 있다 (가리키는 주소를 변경할 수 없게끔)

 

static_cast<type>에 대한 이야기
  • C++에서의 캐스팅 문법
  • 큰 타입에서 작은 타입으로 형변환 될 때 잃어버리는 데이터들에 대해 내부적으로 처리해준다.

 

 

생성자에 대한 이야기
  • 생성될 때 처음 자동으로 호출되는 함수
  • 객체가 생성될 때 F11을 통해 생성자로 커서가 옮겨지는 것을 확인함
  • 생성자는 우리가 만들지 않아도 자동으로 만들어 줌
  • Node() = default; 는 기본 생성자를 만들어달라고 명시적으로 요청하는 것
  • 생성자는 보통 객체의 멤버를 초기화하는 용도로 쓰임

 

멤버 이니셜라이저에 대한 이야기
  • 생성자 옆에 콜론(:) 붙이고 멤버(초기화할값) 이런 식으로 초기화
  • 멤버마다 엔터로 구분해서 병렬로 쭉 내려놓는게 가독성측면에서 좋다.

 

 

생성자 오버로딩에 대한 이야기
  • 생성자를 호출할 때 기본 생성자 외에 인자를 넘겨줄 수 있도록 함
  • Node node(argument);
  • 기본 생성자를 함수오버로딩처럼 인자값을 추가한 버전을 만들어서 사용

 

 

 

소멸자에 대한 이야기
  • 소멸자 객체가 메모리에서 해제될 때 사용한다.
  • 지역변수가 저장되는 곳은 스택이기 때문에 삭제될 때는 할당된 순서의 반대로 호출됨

 

 

 

 

복사 생성자에 대한 이야기
  • 타입이 같은 다른 객체를 인자로 넘겨서 그 인자가 가진 특징을 복사한 객체를 만들 수 있다.
  • 복사 생성자도 기본으로 만들어지는게 그건 얕은 복사로 작동하기 때문에
  • 포인터 멤버를 가지고 있는 객체가 얕은 복사 후 각각 소멸할 경우 double free 가 발생한다.
  • 이를 해결하기 위해 복사할 멤버에 포인터변수가 있다면 그 길이만큼 메모리를 할당하고
  • 메모리를 옮겨 담는 작업을 거쳐야 한다. 

댓글