C & C++

 

 

개발자 

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

 

[C++] vector container 정리 및 사용법

안녕하세요.  BlockDMask 입니다. 오늘은 C++ STL의 sequence container 중에 정말 자주 쓰는 vector에 대해서 알아보겠습니다. <목차> 1) vector container 란? 2) vector의 사용 3) vector의 생성자와 연산..

blockdmask.tistory.com

 


String

C언어의 null로 끝나는 문자열의 경우, 버퍼 오버플로를 비롯한 여러 문제때문에 보안 취약점이 있었다.

 

v

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Callback 함수

WPF, MFC 의 차이

추상클래스, 추상함수

 

ASCII 숫자: 48~57대문자: 65~90소문자: 97~122

댓글

공지사항
업데이트
인기 글
최근댓글
태그
m1 윈도우 단축키 mariadb 외부접속 fputc( ) 맥 독 반응 속도 socket networking C2027 정의되지 않은 형식 'timespec' connect() M1 Parallels Ubuntu QT 스트림 버퍼 2진법과 서수 M1 Parallels Ubuntu QT install C++ connector 실제 인터넷 속도 고정 소수점 빅엔디안 if(0) 리턴 0 이유 인터넷 속도 단위 Visual Studio에서 inet_ntoa( ) 경고 mariaDB 외부 접속 우분투 디스코드 2진법과 기수 스트림과 버퍼 c 알고리즘 버퍼란 리틀 엔디안과 빅 엔디안 표준 입출력 스트림 db 방화벽 stream buffer return 0 성공 이유 fgets( ) 개행('\0')과 NULL 처리 c언어 버퍼 효과적인 if 코드 이진수 실수표현 puts( ) 네이퍼 적립 계산 mysql 방화벽 네이버 맴버쉽 계산 mariadb 재설치 mariadb 삭제 실제 저장 용량 C networking if 가독성 포인터와 참조 우분투 독 에러 몬트레이 한영 전환 네이버 맴버쉽 적립 How to show/hide the macOS Dock instantly pointer reference littem endian M1 dock fputs( ) 몬트레이 Shift Space MK293KE/A C# 메서드 MariaDB 방화벽 네이버 제휴 카드 적립 네이버 포인트 적립 계산 A2449 2진수와 Byte m1 페러렐즈 윈도우 맥 단축키 이진수 음수표현 socket if(false) if 코드 구조 우분투 독 비활성화 c# 클래스 맥북 독 반응 네이버 페이 결제 listen() db 외부접속 socket programming ubuntu 네이버 적립 mysql 외부 Ip 2진수 실수 표현 오류 C2011 'timespec': 'struct' 형식 재정의 네이버 제휴 통장 적립 윤성우의 열렬 TCP/IP 소켓 프로그래밍 소켓 MariaDB Connector 윈도우 db MK293KH/A 독 속도 조절 m1 페러렐즈 단축키 윈도우 timespecs m1 Shift space window mysql c언어 스트림 2진수 음수 표현 Apple Silicon Mac용 터치아이디 탑재형 매직 키보드 - 미국 영어 (MK293KE/A) 우분투 qt Magic Keyboard with Touch ID #define HAVE_STRUCT_TIMESPEC m1 매직 키보드 M1 dock speed io stream 알고리즘이란 M1 독 바로 보기 MariaDB Connector/C++
«   2024/05   »
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