객체 지향이란?
객체 지향은 변수와 함수들의 모임인 객체 단위로 보는 것을 말한다.
특징으로 추상화, 캡슐화, 상속, 다향성이 있다.
캡슐화 : 객체 내부의 데이터와 데이터를 다루는 메서드를 하나로 묶어 외부에 제공하고, 내부 구현은 감춘다.
상속 : 기존 클래스의 특성을 상속받아 새로운 클래스를 만들 수 있다.
다향성 : 같은 이름의 메서드가 다른 기능을 할 수 있도록 허용한다. 이를 통해 같은 방식으로 호출해도 객체에 따라 다르게 동작할 수 있다.
추상화 : 중요 정보만 노출하고 불필요한 숨기는 것을 의미합니다. 객체들이 가져야할 기본 틀을 정의한다.
C#과 C++의 차이점
C++ : 성능과 시스템 수준의 제어가 필요
- 포인터 사용가능
- 기계어로 컴파일 된 이후 실행
- 메모리를 프로그래머가 직접 관리
C# : 생산성과 유지 보수성을 중요시 함
- 포인터 사용이 안됨, 참조의 개념 사용 가능
- 중간언어로 컴파일 된 이후 기계어로 변환
- GC가 메모리를 관리한다.
해시테이블과 MAP
해시테이블(unordered_map)과 MAP은 둘다 키-값 으로 이루어져있다.
- 해시테이블
- 정렬된 순서로 보관되지 않으며, 값을 저장한 인덱스를 찾기 위해 키를 사용함
- O(1)
- 잠재적 충돌을 고려하여 구현해야한다.
- 충돌되는 값을 서로 체이닝하여 이 문제를 해결한다, 특정 키에 대응되는 인덱스 위치에 모든 값을 연결리스트로 묶는 방법으로 해결한다.
- MAP
- 키 값이 이잔탐색틀리(red-black tree)로 구현된다.
- 데이터가 정렬된 순서로 저장된다
- O(logn)
스마트 포인터
new 키워드를 사용해 동적으로 할당받은 메모리는 반드시 delete 키워드를 활용해 해제해 줘야한다.
객체의 소유권을 갖고있을 경우에만 소멸자가 해당 객체 삭제 : unique_ptr
특정 객체를 참조하는 스마트 포인터가 총 몇개인지를 참조하는 포인터 , 참조 회수 0 : 삭제 shared_ptr
포인터 * vs 레퍼런스 &
포인터 : 메모리 주소를 가리키며 그 주소를 통해 변수에 접근한다.
레퍼런스 : 변수 자체를 가리키며 직접 접근하는 것과 동일한 방식으로 동작
- 재할당 불가
오버로딩 vs 오버라이딩
오버로딩 : 같은 이름을 가진 메서드를 여러 개 정의하지만, 매개변수에 따라 각기 다른 기능을 진행함
오버라이딩 : 상속 관계에서, 부모 클래서의 메서드를 자식 클래스에서 재정의함
가상함수 virtual
가상함수는 다향성을 구현하기 위해 사용되는 함수 재정의 메커니즘입니다.
가상함수는 가상테이블에 의존하며, 포인터로 함수들을 가리킨다.
C++에서 자식 클래스에서 재정의(오버라이딩)할 것으로 기대하는 멤버 함수를 의미함
멤버 함수 앞에 virtual 키워드를 사용하여 선언함 → 실행시간에 함수의 다형성을 구현할 때 사용
C++ 빌드 과정
코드작성 → 전처리 → 컴파일 → 어셈블리 → 링크 → 실행
얕은 복사 vs 깊은 복사
얕 : 객체의 주소값만 복사하는 방식, 새로운 객체가 원래 객체와 같은 메모리 주소를 가리키는 방식
- 장 : 복사속도가 빠르며 메모리 효율적
- 단 : 원본객체나 복사본 중 하나에서 데이터를 변경하면 다른 객체에도 영향을 미칠 수 있다.
깊 : 실제 데이터를 복사하여, 별도의 메모리 공간을 할당 받는다.
포인터 vs 배열
배열 : 변수 선언과 함께 자신의 데이터를 저장할 공간을 배열의 크기만큼 연속적인 공간을 갖는다.
포인터 : 자신이 데이터를 저장할 공간을 갖지 않고, 저장할 공간이 있는 위치를 저장하는 메모리 주소를 저장
Class vs Struct
클래스 : 기본 한정자로 private하며, 멤버 변수 외에도 멤버 함수를 가집니다. 또한 상속을 할 수 있다.
구조체 : 멤버 함수를 가질 수 없고, 기본 한정자는 public입니다.