티스토리 뷰
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에서 참조할 주소를 찾아야 하므로, 이에 대한 오버헤드도 발생.
연산자 오버 로딩
- 객체의 연산을 오버 로딩을 통해 정의 가능
- 멤버 함수로 오버 로딩 또는 전역 함수로 오버 로딩 두 가지 방법으로 정의 가능
- 주의사항
- 본래의 의도를 벗어나지 않도록 할 것
- 우선순위의 결함 성은 바뀌지 않음
- 매개변수의 디폴트 값 설정 불가능 (매개변수의 자료형에 따라 호출되는 함수가 달라 지기 때문)
- 연산자의 순수 기능을 뺏을 수 없음 (더하기 연산자인데, 곱하기 연산자를 사용하진 못함)
단항 연산자 오버 로딩
- ++, – 단항 연산자를 새로 정의 가능
템플릿(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
링크
TAG
- 스프링부트빌드
- AWS
- 클린코드작성원칙
- SPA
- 스프링부트 restapi
- 코드스멜 유형
- selenium
- API Gateway 캐싱
- 테스팅 자동화
- notion 업무일정관리
- springboot build
- python
- 스프링부트실행
- 클린코드작성법
- 멀티코어 멀티프로세서
- oracle pga sga
- TCP/UDP
- codesmell 유형
- MPA
- OSI 7계층
- C++
- token
- springboot 실행
- 디자인패턴
- oracle 메모리
- iframe 태그 찾기
- springboot rest api 서버
- springboot restapi
- 디자인패턴 구조패턴
- notion
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함