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

CPP_1. AssortRock 9일차 오프라인 수업_220919

by 헛둘이 2022. 9. 20.
해시 테이블
  • Direct Addressing Table : 값을 인덱스로 사용하는 방식 ('A' = 65이므로 65번 인덱스로 'A'의 유무를 체크)
  • 이 방식을 다른 말로 해시테이블이라고 한다.
  • 해시테이블은 해시 함수가 있는데 문자를 넣어주면 고유의 식을 이용하여 결과물을 반환해준다.
  • 해시테이블의 장점은 암호화를 할 수 있고 속도가 빠름
  • 단점은 다른 값에 대해 동일한 해시값이 나올 수 있음
  • 그럼 해시 충돌이 발생하고 그걸 연결 리스트로 주렁 주렁 연결함
  • 이걸 해시 체이닝이라고 한다(면접 단골 질문)

 

연산자 오버로딩에 대하여
  • 사용자정의 타입에 대해 덧셈 뺄셈을 하려면 인자를 빼서 걔네끼리 더해주고 빼주고 해야 함
  • 클래스와 클래스 간의 연산을 하고 싶다면?
  • Vector2 v3 = v1 + v2
  • 반환값 operator연산자(인자)를 통해 클래스 간 연산을 구현할 수 있다.
  • ==, =! 연산을 구현해놓으면 if문에 넣을 때 굉장히 편리하다.

 

 

상속에 대한 이야기
  • 두 객체가 겹치는 데이터나 함수가 있음(예를 들면 hp, mp)
  • 두 객체의 공통분모를 다시 클래스로 빼고 두 객체로 하여금 그 클래스로부터 상속받게 함
  • class 두객체중하나 : public 그클래스
  • 상속 받으면 부모 클래스가 가진 특성들을 물려받게 된다.

 

 

 

디자인 패턴에 대한 이야기
  • 싱글턴패턴, 컴포지트패턴 여러 패턴이 있으나 따로 공부할 필요는 없다
  • 패턴 설계하는데 시간을 너무 많이 소요함
  • 객체지향으로 짤 때 함수를 먼저 고민하고 데이터를 그 후에 놓는 것처럼
  • 디자인패턴은 이후에 이력서나 포트폴리오 만들 때 집중적으로 공부할 것.

 

다중 상속에 대한 이야기
  • 잘 쓰이지 않음
  • 쓰이는 예시로는 이벤트 몬스터를 설계할 때 부모 클래스로 Monster와 Network 이런 식으로 받는 것
  • 그러나 Monster 배열에 이 이벤트 몬스터를 넣게 되면 Network는 짤리게 된다.

 

 

다이아몬드 상속 문제
  • A를 상속받은 B와 C를 D가 다중상속 받았을 때 에러가 발생함

 

생성자 소멸자 호출 순서에 대한 이야기
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Polygon
{
public:
	Polygon(){	cout << "Polygon ctor!" << endl; }
	~Polygon() { cout << "Polygon dtor!" << endl;  }
};

class Rectangle : public Polygon
{
public:
	Rectangle() { cout << "Rectangle ctor!" << endl; }
	~Rectangle() {	cout << "Rectangle dtor!" << endl;}
};

class Triangle : public Polygon
{
public:
	Triangle(){	 cout << "Triangle ctor!" << endl;}
	~Triangle(){	cout << "Triangle dtor!" << endl;}
};

int main()
{
	Rectangle rect;
	Triangle tri;

	return 0;
}

  • 생성  시 위에서부터 생성되며 생성 순서는 기본 클래스 ->파생 클래스 순으로 생성 되며
  • 소멸 시는 아래서부터 파괴됨 파괴 순서는 파생 클래스 -> 기본 클래스 순서

 

 

 

 

friend에 대한 이야기
  • 내 private 멤버에 접근 가능한 클래스를 지정하는 문법
  • 객체지향의 캡슐화를 깬다는 말들이 많은데 한편으로는 더 철저히 지키기 위해 사용된다는 의견도 있다고 함

 

 

 

 

가상함수에 대한 이야기
  • 가상 함수는 부모 클래스에 선언해주어야 한다.
  • 가상 함수를 만들면 int 멤버 2개를 가진 객체가 sizeof로 재면 16이 나온다 왜?
  • 0번째 주소에 가상함수 테이블을 가리키는 포인터가 있음
  • 상속을 받으면 부모의 가상함수 테이블을 자식의 가상함수 테이블이 덮어씌운다.
  • 그래서 자식이 물려받은 가상함수가 새로 정의한 대로 사용 가능했던 것.
  • 부모의 포인터로 받은 자식의 포인터는 부모의 소멸자만 호출되므로 가상 함수로 필히 만들어야 한다.
  • 면접 단골문제임

댓글