티스토리 뷰

IT 기술

C++ 개념정리

cheons 2022. 7. 13. 10:27
728x90
반응형

컴파일 과정

  • Compile : 소스코드 –> 어셈블리어로 변환, CPU에 의존적임
  • Assemble : 어셈블리어 –> 목적 파일(이진 파일)로 생성, 주소 정보가 기록되지 않음
  • Linking : 목적 파일, 라이브러리 –> 실행파일로 변환, 주소 정보가 기록되어 있음. OS에 의존적임

프로그램의 메모리 공간

  • 데이터 : 전역 변수가 저장
  • 스택 : 지역변수 및 매개변수 저장
  • 힙 : 동적 메모리 저장(malloc)
  • malloc & free : malloc으로 할당된 메모리는 free하지 않으면 해제되지 않는다.

함수 오버 로딩

  • 함수 이름은 같으나, 전달 인자를 다르게 정의된 함수.
  • C++은 함수 이름과 인자를 동시에 참조하여, 호출할 함수를 결정함

Namespace

  • 이름 공간으로 함수, 클래스, 변수 명을 구분 가능

인라인 함수

  • 컴파일러에게 전 처리해달라고 요청하는 키워드
  • inline키워드가 없어도 인라인화 될 수 있음, 있어도 안될 수 도 있음.
  • 매크로 함수는 복잡한 함수 정의가 어렵지만, 인라인 함수는 정의하기 쉬움
  • 매크로 함수는 자료형에 독립적이지만, 인라인 함수는 자료형을 정해야 함. template 문법으로 해결 가능

참조형 변수

  • 동일한 주소를 가리키고 있는 변수, 별칭.
  • const 참조자 : const 참조자 변수를 이용한 값 변경을 허용하지 않겠다는 의미
  • 참조자로 Heap 영역의 접근 가능함

포인터

  • 변수의 주소(=상대 주소) 값을 저장
  • 주소 연산자(=&)를 통해 변수가 가지고 있는 주소 값을 가져올 수 있음
  • 역참조 연산자(=*)로 주소가 가리키고 있는 값을 가져올 수 있음

new, delete, malloc, free

  • new 연산자로 할당한 메모리는 free로만 해제해야 함
  • new와 malloc의 차이는 new는 연산자이고, malloc은 함수이다
  • new 키워드 사용 시, malloc함수가 호출되어 동적 메모리가 할당됨

클래스

  • C++의 struct는 C언어의 struct와 다름. C++의 struct는 class처럼 사용
  • 접근 제어 지시자는 public(어디든 접근 허용), protected(자식 클래스만 접근 허용), private(클래스 내에서만 접근 허용)

C++ 파일 분할

  • 선언은 Header파일(*. h), 정의는 Cpp파일에 정의
  • 인라인 함수는 헤더 파일과 함께 정의함

객체지향 프로그래밍

  • 사물, 대상, 행위를 실체화하는 형태의 프로그래밍

정보은닉

  • 클래스 멤버 변수 접근을 외부로부터 막는 것
  • 멤버 변수 접근을 클래스 내부에서만 접근 가능하도록 private로 선언
  • 멤버 함수에 const를 선언하여 변수 값 조작을 막을 수 도 있음
  • 외부에서 접근 수행할 경우, getter, setter 메서드로 제공

캡슐화

  • 관련 있는 모든 것을 클래스로 묶는 것

생성자와 소멸자

  • 생성자는 객체 생성 시, 딱 한 번만 호출됨
  • 생성자 호출 시, private 변수 초기화할 때 이니셜 라이저로 초기화 가능
  • 이니셜 라이저 이용 시, 변수 선언과 동시에 초기화된다고 생각하면 됨
  • 소멸자는 객체 소멸 시, 딱 한 번만 호출됨
  • 멤버 변수에 동적 메모리 할당한 변수가 있을 경우, 소멸자에서 메모리 해제 필요

this 포인터

  • 객체 그 자신의 주소 값을 가리킴. 자기 참조.

복사 생성자

  • 기존 객체로 새로운 객체를 생성하는 함수
  • 복사 생성자 호출 시점 ( 객체 초기화/함수 인자로 전달/함수에서 객체 반환)
  • 소괄호()를 이용하여 객체를 초기화할 때, 복사 가능 ex) AAA a1(a2);
  • 얕은 복사 : 멤버 대 멤버의 값만 복사, 메모리 참조값이 같을 수 있음
  • 깊은 복사 : 동적 메모리를 새로 할당하고, 값을 복사함.
  • 디폴트 복사 생성자 : 사용자 정의 복사 생성자가 없을 때, 자동으로 삽입됨. 얕은 복사 수행

explicit

  • 묵시적 형 변환을 금지하는 키워드

friend, static, const

  • const 키워는 함수 오버 로딩의 조건이 됨
  • friend로 지정된 class 또는 전역 함수에게 private 멤버 접근 허용가능 (정보 은닉을 파괴)
  • static 키워드로 선언된 멤버 변수, 멤버 함수는 프로그램 실행과 동시에 생성됨. 해당 클래스에 선언된 static은 공유함
  • Mutable로 선언된 변수는 const 함수에서 수정 가능

상속

  • 기존 클래스를 재활용을 목적으로 사용되는 문법
  • 클래스를 상속 구조로 변경하여 변경사항을 최소화 하기도 함
  • public 상속 : 접근제어 권한 그대로 상속
  • protected 상속 : protected보다 넓은 접근 범위는 protected로 상속
  • private 상속 : private보다 넓은 접근 범위는 private로 상속
  • 클래스 간 IS-A, HAS-A 관계가 성립하면 상속으로 표현이 매우 적절함

객체 포인터의 참조 관계

  • 객체 포인터는 상속을 받은 부모 클래스를 가리킬 수 있음
  • 부모 클래스에서 자식 클래스의 멤버를 참조할 수 없음 (컴파일러는 포인터의 자료형 기준으로 판단하기 때문)

가상 함수

  • 컴파일러는 포인터 자료형을 기준으로 호출할 함수를 판단함
  • virtual로 선언된 함수는 포인터 형의 상관없이 객체의 마지막 오버 라이딩 함수를 호출함

순수 가상 함수

  • 몸체가 정의되지 않는 가상 함수를 순수 가상 함수라고 함
  • 하나 이상의 순수 가상 함수를 멤버로 두면, 추상 클래스가 됨

다형성

  • 함수 오버 로딩, 오버 라이딩, 템플릿 함수, 가상 함수 등 이름은 같으나 다른 동작을 하는 경우를 말함

가상 소멸자

  • 상속관계가 있는 클래스인 경우, 소멸자는 해당 클래스형의 소멸자만 호출함. (부모 클래스 생성 시, 동적 메모리를 할당한 경우 메모리 누수가 발생함)
  • 소멸자에 virtual 키워드를 붙여, 소멸자 호출 시, 부모 클래스의 소멸자도 호출되도록 설정함

멤버 함수와 가상 함수의 동작원리

  • 멤버 함수는 함수를 가리키는 포인터 변수이므로, 실제 멤버 함수의 정의 내용은 모두 공유함
  • 클래스 내에 가상 함수가 포함되면, V-table(Key-Value 테이블, 함수명-주소)이 생성되고 이를 참조함
  • 가상 함수 호출 시, v-table을 참조하여 함수를 실행함

다중 상속

  • 두 개 이상의 부모 클래스를 상속 (득 보다 실이 많은 문법이라고 함..)
  • 다중 상속받은 두 개 이상의 클래스가 같은 부모를 상속받을 경우, 불필요한 함수 호출과 모호성이 발생함

가상 상속

  • 다중 상속으로 인해, 불필요한 부모 클래스의 멤버 함수가 두 번 호출되는 것을 막음
  • 가상 함수 선언으로 인해, v-table이 추가적으로 생성되어 메모리가 커짐.
  • offset 기반으로 vtable ptr에서 참조할 주소를 찾아야 하므로, 이에 대한 오버헤드도 발생.

연산자 오버 로딩

  • 객체의 연산을 오버 로딩을 통해 정의 가능
  • 멤버 함수로 오버 로딩 또는 전역 함수로 오버 로딩 두 가지 방법으로 정의 가능
  • 주의사항
    1. 본래의 의도를 벗어나지 않도록 할 것
    2. 우선순위의 결함 성은 바뀌지 않음
    3. 매개변수의 디폴트 값 설정 불가능 (매개변수의 자료형에 따라 호출되는 함수가 달라 지기 때문)
    4. 연산자의 순수 기능을 뺏을 수 없음 (더하기 연산자인데, 곱하기 연산자를 사용하진 못함)

단항 연산자 오버 로딩

  • ++, – 단항 연산자를 새로 정의 가능

템플릿(Template)

함수 템플릿, 템플릿 함수

  • 전달하는 자료형이 결정되지 않은 것
  • 함수 템플릿 : 템플릿을 이용하여 정의한 함수.
  • 템플릿 함수 : 템플릿을 기반으로 컴파일러에 의해 생성된 함수
  • template , template <typename T1, typename T2,...>로 템플릿 선언
  • 함수 템플릿의 특수화 : 특정 타입의 자료형에 대해서 함수 오버 로딩처럼 로직을 구현, template <>로 선언.

클래스 템플릿

  • 클래스에서 사용하는 자료형도 템플릿화 가능함
  • 클래스 선언부 상단에 template 키워드로 선언
  • 클래스 템플릿 구현 시, 선언부와 정의부는 한 곳에 정의. 또는 템플릿을 호출하는 파일에서 선언, 정의 부 소스를 포함해야 함
  • 클래스 템플릿도 특수화 가능, 부분 특수화 (=변수 선언)도 가능
  • 특수화된 클래스는 컴파일러가 다른 자료형으로 인식함

static과 템플릿

  • 함수 템플릿 별로 static변수는 함수 템플릿 별로 독립적으로 존재함
  • 클래스 템플릿 별로 static 변수도 클래스 템플릿 별로 독립적으로 존재함

예외처리

  • try, catch, throw 구문을 이용하여 예외를 처리함

Stack Unwinding (스택 풀기)

  • throw 한 예외는 catch가 정의되어 있는 함수까지 거슬러 올라감
728x90
반응형

'IT 기술' 카테고리의 다른 글

Notion으로 업무 일정 관리하기  (0) 2022.07.15
TCP/UDP 통신의 특징  (0) 2022.07.14
코드 스멜(Code Smell) 유형 정의  (0) 2022.07.13
Springboot 빌드 및 실행하기  (0) 2022.07.13
Springboot RestfulAPI 서버 만들기  (0) 2022.07.11
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함