이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

코딩/C and C++

C와 C++ 차이점

이쿠우우 2020. 9. 13. 10:47
반응형

C 언어에 없던  C++ 기능


1. C++은 객체 지향 프로그래밍.

객체 지향 프로그래밍의 특징

1. 추상화(abstraction)

2. 캡슐화(encapsulation)

3. 정보 은닉(data hiding)

4. 상속성(inheritance)

5. 다형성(polymorphism)

 


2. 생성자와 소멸자 사용 가능

생성자

객체의 생성과 동시에 멤버 변수를 초기화해주는 멤버 함수

 

[생성자 특징]

1. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있음.

2. 생성자는 반환 값이 없지만, void형으로 선언하지 않음.

3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 

    오버 로딩 규칙에 따라 여러 개의 생성자를 가질 수 있음

 

[디폴트 생성자]

초기값을 명시하지 않으면 컴파일러가 자동으로 제공.

매개변수를 가지지 않음.

0 or NULL, 빈 문자열 등으로 초기화.

 

소멸자

사용이 끝난 객체를 정리해주는 기능.

소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출됨.

 

[소멸자 특징]

1. 소멸자는 인수를 가지지 않음.

2. 소멸자는 반환 값이 없지만 void형으로 선언하지 않음.

3. 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있음.

4. 소멸자는 const, volatile 또는 static으로 선언될 수는 없지만, 

    const, volatile 또는 static으로 선언된 객체의 소멸을 위해서 호출될 수는 있음.

 

 


3. 클래스 상속 사용 가능

클래스 상속이란?

기존에 정의되어 있는 클래스의 모든 멤버 변수와 멤버 함수를 물려받아, 

새로운 클래스를 작성하는 것을 의미.

 

기존에 정의되어 있던 클래스 용어          = 기초 클래스 or 부모 클래스 or 상위 클래스

상속을 통해 새롭게 작성되는 클래스 용어 = 파생 클래스 or 자식 클래스 or 하위 클래스

 

클래스 상속 장점

기존에 작성된 클래스를 재활용할 수 있음.

공통적인 부분은 기초 클래스에 미리 적성, 

파생 클래스에서 중복되는 부분을 제거할 수 있음

 

파생 클래스란?

기초 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스

 

[파생 클래스 특징]

1. 파생 클래스는 반드시 자신만의 생성자를 작성해야 함

2. 파생 클래스에는 기초 클래스의 접근할 수 있는 모든 멤버 변수들이 저장

3. 파생 클래스는 기초 클래스의 접근할 수 있는 모든 멤버 함수를 사용할 수 있음

4. 파생 클래스에는 필요한 만큼 멤버를 추가할 수 있음

 

[인스턴스 생성 방법의 차이]

1. 클래스이름 객체이름 선언법

예) Car testcar;

 

2. new 연산자를 사용한 동적할당

클래스이름 *객체이름

예)

Car *testcar;

testcar = new Car();

 

3. 두 개의 차이점

메모리의 어디에 올라가냐의 차이

동적할당을 받지 않고 객체를 생성할 경우  스택 영역에 올라감

    • 범위를 벗어날 경우 메모리가 자동 해제

동적할당을 받을 경우 힙에 올라감

    • delete를 이용해서 직접 해제해줘야 함

 


4. Virtual 함수란 사용 가능

일반가상함수

파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미

가상 함수는 반드시 재정의해야만 하는 함수가 아닌, 재정의가 가능한 함수를 가리킴

자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정

 

순수가상함수

파생 클래스에서 반드시 재정의해야 하는 멤버 함수를 의미

순수 가상 함수는 일반적으로 함수의 동작을 정의하는 본체를 가지고 있지 않음

따라서 파생 클래스에서 재정의하지 않으면 사용할 수 없음

 

추상 클래스

C++에서는 하나 이상의 순수 가상 함수를 포함하는 클래스를 추상 클래스(abstract class)라고 함

반드시 사용되어야 하는 멤버 함수를 추상 클래스에 순수 가상 함수로 선언해 놓으면,

이 클래스로부터 파생된 모든 클래스에서는 이 가상 함수를 반드시 재정의해야 함


5. 디폴트 인수 (default argument) 사용 가능

값이 미리 정의되어 있는 인수

함수를 호출할 때 인수를 전달하지 않으면 자동으로 미리 정의되어있는 

디폴트 인수값을 사용하게 됨

 

[규칙]

1. 디폴트 인수는 함수의 원형에만 지정할 수 있음

2. 디폴트 인수는 가장 오른쪽부터 시작하여 순서대로만 지정할 수 있음

3. 가운데 인수들만 별도로 디폴트 인수를 지정할 수는 없음

4. 디폴트 인수가 설정된 함수를 호출할 때에는 인수의 전달을 건너뛸 수 없음

 

[예제]

void Display(int x, int y, char ch, int z = 4);       // 가능

void Display(int x, int y, char ch = 'a', int z = 4); // 가능

void Display(int x, int y = 2, char ch, int z = 4);   // 오류

void Display(int x = 1, int y = 2, char ch, int z);   // 오류

 


6. 함수 오버로딩(function overloading) 사용 가능

같은 이름의 함수를 중복하여 정의

매개변수의 형식을 다르게 하여 하나의 이름으로 작성할 수 있게 해 줌

객체 지향 프로그래밍의 특징 중 다형성에 해당하는 기능

 


7. 참조자 (reference) 사용 가능

c++에서는 특정 변수의 실제 이름 대신 사용할 수 있는 참조자 기능이 있음

크기가 큰 구조체와 같은 데이터를 함수의 인수로 전달해야 할 때 사용됨

class를 설계할 때도 사용됨

 

[선언 방법]

int 변수이름 // 변수 선언

int& 참조자이름 // 참조자 선엄

 

& = 주소 연산자가 아닌 타입을 식별하기 위해 사용

즉 int& 는 int형 변수에 대한 참조를 의미

 

[규칙]

1. 참조자의 타입은 대상이 되는 변수의 타입과 일치해야 합니다.

2. 참조자는 선언과 동시에 초기화되어야 합니다.

3. 참조자는 한 번 초기화되면, 참조하는 대상을 변경할 수 없습니다.

 


8. 범위 지정 연산자 ( :: ) 사용 가능

C++에서 가장 우선순위가 높은 연산자

여러 범위에 사용된 식별자는 구분

범위 지정 연산자를 변수의 이름 앞에 붙이면 해당 변수는 전역으로 사용하라는 의미로 사용

클래스에 이 연산자를 사용하면 네임스페이스 멤버를 식별하거나, 클래스의 정적 멤버를 호출할 수 있음

 


9. 배열을 더 편리하게 사용할 수 있음

C++에서는 2차원 배열의 일부 요소만 초기화가 가능

예)

int arr[3][4] = {

    {10, 20},

    {30, 40, 50, 60},

    {0, 0, 70, 80}

};

 


9. new, delete 연산자 사용 가능

C언어의 malloc(), calloc() 함수를 사용하여 메모리 동적할당을 수행할 수 있지만

C++을 new 연산자를 이용한 방법을 제공

 

(문법)

타입* 포인터 이름 = new 타입;

 

C의 경우 free() 함수를 이용하여 동적할당받은 메모리를 해제하는데

new 의 경우 delete 연산자를 사용하여 해제함

 

malloc()과 new의 차이점

1. 생성자가 있고 없고

malloc 은 함수이고

new는 연산자

malloc 은 시스템 함수로서 함수 안에서 메모리를 할당하지만

new는 연산자로 바로 메모리를 할당하는 것이 아니라 생성자를 호출해서 메모리를 할당함.

생성자를 통해서 호출하기 때문에 new로 메모리를 할당하면 생성 시 초기화가 가능한 장점이 있음

 

2. 재할당

malloc 은 realloc을 통한 재할당이 가능하지만 

new는 재할당이 기능이 없기 때문에 

새로 할당, 복사 , 해제하는 과정을 거쳐야 함

 

3. 자료형

malloc 은 해당 포인터의 타입을 모르기 때문에 리턴 값의 자료형은 (void*) 임

때문에 malloc 함수 사용 시 자료형을 앞에 선언해줘야 함

하지만 new는 type-safe로 해당 객체에 맞는 포인터를 반환해줌

type-safe 란?
컴파일러가 타입형을 확인해 주는 것

4. 에러 처리

new를 통해 객체 생성 시 에러가 발생하면 예외처리를 하지만

malloc 은 예외처리 없이 NULL 값을 반환함

 


string 클래스

srting 객체는 문자열을 배열 형태가 아닌 단순 변수로 선언

길이를 명시하지 않아도 됨

선언 후 초기화 가능

각 종 문자열 처리 함수 제공

 

(예시)

string str1;              // 문자열의 선언

str1 = "C++ Programming"; // 문자열의 초기화

string str2 = "C++";      // 문자열의 선언과 동시에 초기화

 

 

 

 

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

반응형

'코딩 > C and C++' 카테고리의 다른 글

네임드 파이프 (Named-Pipe)  (1) 2020.10.04
C++에서 JSON 사용  (4) 2020.09.13
JSON  (0) 2020.09.13
C++11 문법적 변경 사항  (0) 2020.09.13
CreateThread, _beginthreadex 차이점  (0) 2020.09.03