본문 바로가기
Languages/C++

C++ 공부

by odaebum 2024. 11. 7.
728x90

객체 지향이란?

객체 지향은 변수와 함수들의 모임인 객체 단위로 보는 것을 말한다.

특징으로 추상화, 캡슐화, 상속, 다향성이 있다.

캡슐화 : 객체 내부의 데이터와 데이터를 다루는 메서드를 하나로 묶어 외부에 제공하고, 내부 구현은 감춘다.

상속 : 기존 클래스의 특성을 상속받아 새로운 클래스를 만들 수 있다.

다향성 : 같은 이름의 메서드가 다른 기능을 할 수 있도록 허용한다. 이를 통해 같은 방식으로 호출해도 객체에 따라 다르게 동작할 수 있다.

추상화 : 중요 정보만 노출하고 불필요한 숨기는 것을 의미합니다. 객체들이 가져야할 기본 틀을 정의한다.

C#과 C++의 차이점

C++ : 성능과 시스템 수준의 제어가 필요

  • 포인터 사용가능
  • 기계어로 컴파일 된 이후 실행
  • 메모리를 프로그래머가 직접 관리

C# : 생산성과 유지 보수성을 중요시 함

  • 포인터 사용이 안됨, 참조의 개념 사용 가능
  • 중간언어로 컴파일 된 이후 기계어로 변환
  • GC가 메모리를 관리한다.

해시테이블과 MAP

해시테이블(unordered_map)과 MAP은 둘다 키-값 으로 이루어져있다.

  1. 해시테이블
    1. 정렬된 순서로 보관되지 않으며, 값을 저장한 인덱스를 찾기 위해 키를 사용함
    2. O(1)
    3. 잠재적 충돌을 고려하여 구현해야한다.
      1. 충돌되는 값을 서로 체이닝하여 이 문제를 해결한다, 특정 키에 대응되는 인덱스 위치에 모든 값을 연결리스트로 묶는 방법으로 해결한다.
  2. MAP
    1. 키 값이 이잔탐색틀리(red-black tree)로 구현된다.
    2. 데이터가 정렬된 순서로 저장된다
    3. O(logn)

스마트 포인터

new 키워드를 사용해 동적으로 할당받은 메모리는 반드시 delete 키워드를 활용해 해제해 줘야한다.

객체의 소유권을 갖고있을 경우에만 소멸자가 해당 객체 삭제 : unique_ptr

특정 객체를 참조하는 스마트 포인터가 총 몇개인지를 참조하는 포인터 , 참조 회수 0 : 삭제 shared_ptr

포인터 * vs 레퍼런스 &

포인터 : 메모리 주소를 가리키며 그 주소를 통해 변수에 접근한다.

레퍼런스 : 변수 자체를 가리키며 직접 접근하는 것과 동일한 방식으로 동작

  • 재할당 불가

오버로딩 vs 오버라이딩

오버로딩 : 같은 이름을 가진 메서드를 여러 개 정의하지만, 매개변수에 따라 각기 다른 기능을 진행함

오버라이딩 : 상속 관계에서, 부모 클래서의 메서드를 자식 클래스에서 재정의함

가상함수 virtual

가상함수는 다향성을 구현하기 위해 사용되는 함수 재정의 메커니즘입니다.

가상함수는 가상테이블에 의존하며, 포인터로 함수들을 가리킨다.

C++에서 자식 클래스에서 재정의(오버라이딩)할 것으로 기대하는 멤버 함수를 의미함

멤버 함수 앞에 virtual 키워드를 사용하여 선언함 → 실행시간에 함수의 다형성을 구현할 때 사용

C++ 빌드 과정

코드작성 → 전처리 → 컴파일 → 어셈블리 → 링크 → 실행

얕은 복사 vs 깊은 복사

얕 : 객체의 주소값만 복사하는 방식, 새로운 객체가 원래 객체와 같은 메모리 주소를 가리키는 방식

  • 장 : 복사속도가 빠르며 메모리 효율적
  • 단 : 원본객체나 복사본 중 하나에서 데이터를 변경하면 다른 객체에도 영향을 미칠 수 있다.

깊 : 실제 데이터를 복사하여, 별도의 메모리 공간을 할당 받는다.

포인터 vs 배열

배열 : 변수 선언과 함께 자신의 데이터를 저장할 공간을 배열의 크기만큼 연속적인 공간을 갖는다.

포인터 : 자신이 데이터를 저장할 공간을 갖지 않고, 저장할 공간이 있는 위치를 저장하는 메모리 주소를 저장

Class vs Struct

클래스 : 기본 한정자로 private하며, 멤버 변수 외에도 멤버 함수를 가집니다. 또한 상속을 할 수 있다.

구조체 : 멤버 함수를 가질 수 없고, 기본 한정자는 public입니다.

728x90