개발자
C : 데니스 리치와 켄 톰슨
C++ : 비야네 스트롭스트룹(덴마크어: Bjarne Stroustrup)
C 언어의 등장 배경
C 언어 등장 이전에 프로그램은 기계어와 1:1로 대응되는 Assembly 언어 기반으로 작성되었습니다.
Assembly는 하드웨어 종속적 기호언어이기에 다른 종류의 하드웨어로 이식할 수 없는 호환성 Zero의 언어였습니다.
하나의 프로그램을 CPU 종류만큼의 여러번 작성해야 했습니다.
이 한계를 극복하고자 하드웨어의 구성에 맞추어 자동으로 어셈블리어를 생성하는 C언어가 등장하게 됩니다.
Build
소스코드를 실행 가능한 프로그램으로 만드는 과정
Compile
일반적으로, 자연어에 가까운 소스코드를 하드웨어에 맞춘 바이너리 코드로 변경하는 작업을 의미한다.
C 언어의 특징
C 언어는 단순하고, 하드웨어 독립적이며, 실용성에 중점을 두어 강제성이 낮은 언어입니다. 낮은 강제성만큼 프로그래머의 역량에 따른 책임이 높은 언어입니다. 그리고 절차적 프로그래밍, 함수를 이용한 구조적 프로그래밍의 특징을 가진 언어입니다.
C++ 등장 배경
C언어 한계는, 큰 프로그램을 함수와 같이 작은 단위로 프로그램을 쪼개서 동작하는 Top-Down 방식을 사용했는데
이는 커다란 프로그램을 쪼개서 작은 실행단위인 함수를 이용해, 기능의 순서에 초점을 맞춘것이다.
문제는, 세월이 흐르고 프로그램이 발전하고, 소프트웨어의 복잡도가 커질수록 C 언어는 이를 적절히 해결하지 못했다.
C++ 는 멀티 페러다임 언어다
OOP : 객체를 바탕으로 객체간의 관계를 정의해 프로그램을 처리하는 Bottom-Up 방식의 페러다임 전환
Generic : 데이터 형식에 의존하지 않고, 여러 다른 타입을 가질 수 있는 기술에 중점을 두어 재사용성을 높이는 방식
Template, Container, meta.(컴파일시 프로그래밍) 등 포함
C 언어와 C++의 공통점, 차이점
1. 두 언어는 뿌리가 같다.
C++의 개발의도가 C 언어의 제약을 극복하자는 취지에서 개발되었고, C++ 컴파일러가 C 컴파일이 가능하다.
(C와 C++ 모두 각자의 방향으로 발전, 그리고 여러 컴파일러로 분화되어 동일하다고 할 수 없다. -> 유사하다.)
1. 표준 라이브러리가 다르다. (eg. stdio.h & iostream)
2. C는 함수를 사용하지만, C++은 객체를 사용한다. ( printf() & std::cout )
3. malloc()은 함수이고 new는 연산자이다.
C
malloc()은 메모리 할당 후, memset을 통해 초기화 해야한다.
calloc()은 자동 0으로 초기화되므로, malloc()보다 간단하고 빠르다.
realloc()은 첫번째 매개변수가 NULL이면 malloc과 같이 동작한다.
free()를 통해 해제해야 한다.
C++
new 연산자를 통해 생성자를 호출하여 메모리를 할당하는 것과 더불어, 생성자를 통한 초기화가 가능하다.
C++ 입장에서
pointer보다 reference, smart pointer를
char* 보다 std::string을
array 보다 std::vectror와 같은 container를 사용해야 한다.
Class와 Struct의 차이
- C 언어와 차이점
1. C++ 기능(상속, 템플릿, 접근 지정자) 사용 가능
2. 함수 선언 가능
- 구조체의 기본 접근제어 지시자는 public, 클래스는 private
- 구조체 안에서 함수 선언이 가능한데, 하나의 함수를 공유하고, inline으로 작동한다.
- 위 2가지를 제외하면 클래스와 구조체의 차이는 없다. (생성자 사용 등)
C++ 초기화 방법 3가지
- 첫째, 대입 연산자(=)를 사용한 복사 초기화(copy initialization)
int nValue = 5; // copy initialization
- 둘째, 소괄호()를 사용한 직접 초기화(direct initialization)
int nValue(5); // direct initialization
- 셋째
C++ 11 이상, 중괄호({})를 사용한 유니폼 초기화(uniform initialization)
int value{5};
빈 {}로 변수를 초기화하면 기본 초기화(defulat initialization)가 된다. 기본 초기화는 변수를 0으로 초기화 한다.
int value{}; // default initialization to 0
형 변환을 허용하지 않는다.
int value{4.5}; // error: an integer variable can not hold a non-integer value
- 넷째
생성자 멤버 초기화 리스트 (Constructor member initializer list)
class Something
{
private:
int m_value1;
double m_value2;
char m_value3;
public:
Something()
{
// 이것은 모두 할당이지 초기화가 아니다. C++ 언어의 문법에서는 유효하지만, 초기화보다 효율적이지 않다.
m_value1 = 1;
m_value2 = 2.2;
m_value3 = 'c';
}
};
public:
Something() : m_value1(1), m_value2(2.2), m_value3('c') // 멤버 초기화 리스트 직접 초기화
{ // 세미콜론 ;으로 끝나지 않는다.
// 멤버 변수를 여기서 할당할 필요가 없다.
}
const 및 reference 변수의 경우, 선언과 동시에 초기화되어야 하지만, 생성자에서 할당하는 방법을 통한 선언의 경우, 불가능하다.
class Something
{
private: const int m_value;
public:
Something()
{
m_value = 1; // error: const 상수 변수는 할당할 수 없다.
}
};
https://boycoding.tistory.com/246
변수, 포인터, 참조 특징과 차이점
all by value (값에 의한 호출): 값을 복사해서 사용
- 함수는 매개변수를 이용해 실인수를 넘겨 받을때, 복사해서 사용한다.
call by reference (참조에 의한 호출) : 값의 메모리 공간 참조
- const reference
call by address(주소에 의한 호출) : 값의 메모리 공간 참조
const, #define, enum
값을 변경 할 수 없게하는 키워드
#define의 경우 의도치 않은 결과를 유발하는 전처리기의 사용으로, 주의가 필요하다.
enum 상수 집합의 열거형
enum
https://blockdmask.tistory.com/405
C언어에서 enum의 문제점
enum은 별도의 이름공간(namespace)를 가지고 있지 않는 것
enum class를 통해 극복
스마트 포인터
자바,C# GC(garbage collector)
C에서 malloc, free
C++은 new, delete
메모리 누수(memory leak) 방지하기 위해 스마트 포인터가 클래스 템플릿으로 메모리를 자동으로 해제해 준다.
즉, delete를 자동으로 수행한다.
c++11 추가
memory 헤더파일을 include해야 사용 가능하다.
shared_ptr
unique_ptr
weak_ptr
const 사용에 따른 값 변경 경우의 수
포인터와 배열
포인터 변수란, 주소값을 담고있는 4byte 크기의 변수일 뿐이다.
* 포인터를 사용한다. == 메모리 주소값을 사용한다.
1. 배열의 구조
- 배열이름 + 대괄호 + 인덱스 + 초기화
예) int arr[3] = {1, 2, 3};
2. 배열의 사용
- arr[0] 의 값은 1
3. 배열과 포인터, 배열의 이름, 배열의 주소값
- 배열의 이름은 상수라는 점을 제외하고, 포인터와 같다.
- 배열 이름 arr은 배열의 포인터 변수다.
- arr과 &arr[0]은 같다.
- 배열 이름은 포인터 연산이 가능하다.
4. 배열을 함수에서 참조하려면
- 주소값을 넘긴다.
- 많은 방법이 존재한다.
- 개발자의 입장에서는 매개변수로 포인터와 배열에 대한 차이가 없다.
- 동적 할당도 동일한 용법을 사용한다.
void change1(int *arr)
{
arr[1] = 1;
}
void change2(int *arr)
{
*(arr + 1) = 2; // 포인터 연산
}
void change3(int (*arr)[3])
{
(*arr)[1] = 3; // 눈코딩 시, 에러 확인 가능
}
void change11(int arr[3])
{
arr[1] = 11;
}
void change22(int arr[3])
{
arr[2] = 22;
change11(arr);
}
void change33(int arr[])
{
arr[1] = 33;
}
void change44(int arr[3])
{
*(arr + 1) = 4;
}
void change55(int arr[3][3])
{
arr[0][0] = 5;
}
5. 2차원 배열을 동적할당 하는 방법
포인터 배열을 이중 포인터 변수에 담아 만들어 사용
접근 제어자(Access Modifier)
- 객제지향의 특징인 Encapsulation 관련
- C++에서 접근 제어자는 private, protected, public
private
- C++ 접근제어자 기본값, default
- 오직 클래스 내부 함수에서만 접근 가능하다.
protected
- 상속받은 파생 클래스에서만 접근 가능하다.
public
- 전부
- 멤버 변수에 안좋은 사용, 생성자만 public 선언하는 경우가 많다.
- 구조체의 기본 접근 지정자다.
오버로딩, 오버라이딩
C++ 오버로딩 (다중 정의, 중복 정의)
- 동일 함수 이름
- 매개변수의 개수와 자료형을 다르게 정의하여, 다른 함수 실행
- 리턴 타입 변형 가능
C++ 오버라이딩 (재정의)
- 상속시 부모 클래스의 함수를 사용하지 않고, 함수를 재정의 하여 사용하는 것.
- 오버라이드 하고자 하는 함수가 상위 클래스에 존재해야 한다.
- 동일 함수 이름
- 매개변수 개수와 자료형이 동일해야 한다.
- 리턴 타입이 같아야 한다.
- 상위 메서드와 동일하거나 내용이 추가되어야 한다.
- C#은 virtual, override, new 필요
STL(Standard Template Library)
vector
- 자동으로 메모리가 할당되는 배열
#include <vector>
선언, 초기화
vector<type> v_name;
vector<int> v;
// 비어있는 vector v를 생성합니다.
vector<int> v(5);
// 기본값(0)으로 초기화 된 5개의 원소를 가지는 vector v를 생성합니다.
vector<int> v(5, 2);
// 2로 초기화된 5개의 원소를 가지는 vector v를 생성합니다.
vector<int> v1(5, 2);
vector<int> v2(v1);
// v2는 v1 vector를 복사해서 생성됩니다.
https://blockdmask.tistory.com/70
String
C언어의 null로 끝나는 문자열의 경우, 버퍼 오버플로를 비롯한 여러 문제때문에 보안 취약점이 있었다.
v
Callback 함수
WPF, MFC 의 차이
추상클래스, 추상함수
ASCII 숫자: 48~57대문자: 65~90소문자: 97~122