본문 바로가기

void

C / C++ 비교 정리...

유튜브 최호성님 강의 들으면서 정리

https://www.youtube.com/watch?v=kq6b5zBkQ28



1.

c++은 객체지향 언어!


객체지향은 서양철학과 깊은 연관이 있다!?

클래스와 객체의 관계...

미인 -> 설현;

(이데아(개념, 추상)) -> 실체(구현)

동물 > 사람, 사자...

조류 > 앵무새, 까마귀...

펭귄 > 뽀로로...


설계와 구현을 분리한다!

설계를 제대로 할 줄 아는 개발자가 돼야한다.


프로그래밍은 시간이 갈수록 글쓰기와 비슷해지고 있다.

글은 말보다 정확하게 써야한다.


모든 장치는 file로 추상화된다.

파일 I/O를 통해 장치를 제어한다.


문자열 출력 비교해보면,

c언어에서는 내가, 함수 사용법을 잘 알고 잘 사용해야 한다.

세탁이라면, 빨래를 내가 직접 하는 꼴. 자영업.

printf("Hello World");

형식문자 형식을 맞춰줘야함.. %d, %s 등등..


c++에서는 행위주체와 이용주체가 분리. 나는 행위주체에게 넘겨주면 '알아서' 처리된다. -> 구조가 간결해진다.

세탁소에 빨래 맡기는 꼴. 프랜차이즈.

std::cout << "Hello World";

문자를 넣든 숫자를 넣든 알아서 출력해준다. 

구조만 해놓고, 세세한 디테일은 나중에 구현해도 되는 형태도 개발이 가능하다. 이것이 큰 장점!


c언어 : 사용자(개발자) 스스로 '잘' 해야함. 물건 사용자가 잘 써야함.

c++ : 사용자 이해도가 떨어져도 된다. 물건을 잘 만들어놓는게 중요. 사용자는 쉽게 접근만 해서 쓰면 됨.







2.

효율(유지보수)면에선 c++이 유리

비용절감/성능은 c가 좋지


namespace 는 소속으로 번역하자. 이름공간 노노.


변수 선언 및 정의

c 스타일

int a = 10;


c++ 스타일

int a(10);

int b(a); 이것도 가능. 이때는 복사!

int (10); 이것도 됨. 이름이 없는 인스턴스 선언 및 정의 가능...

auto b(a); a 자료형을 따라간다. c++ 11버전에서 추가된 것. 자료형을 몰라도 된다는 장점이 있음.

형식 얘기 한번만 해주면 그 뒤론 알아서 해준다.. 허허..

이게 언제 대박이냐면 함수형 포인터 쓸때

c에서는

void TestFunc(int, char*){}

void(*pfTest)(int, char*) = TestFunc;


c++에서는

auto pfTest2(TestFunc); 

한방에 된다.

이것이 어마어마하게 큰 편의성을 제공해준다.








3.

메모리 동적할당

c

malloc();

free();


malloc 함수에는 사이즈 인수를 넘겨줘야 하지. only 크기에만 관심을 가지는 함수.

메모리 확보 후 반환해주는 것만 신경 씀. 용도는 관심 없음. 사용자가 알아서 해라.

여기서 애매한 부분... 왜 이걸 할당했는지 포인터 주소만 봐서는 알수가 없다.

포인터가 주관적이다.

int* 접근하면 -> 실제 포인터 주소가 char형이든 뭐든 상관 없이 지멋대로 해석 가능. 좋은말로는 자유도가 높다.

단점은 초보자가 다루기 위험할 수 있다. 회칼같은 존재... 안전장치가 없음.


ms dos 시절의 c언어... 램이 512kb 막 이랬던 시절. 메모리가 부족해서 정말 조심조심 썼어야 함..

하지만 요즘은? 메모리 자체도 늘어났지만, OS가 달라졌다!

windows95정도부터.. ring 시스템이 들어가면서

레벨이 생김

커널/유저 영역으로 나눠짐.

메모리 체계도 가상 메모리 체계로 바뀜.

이미 있는 메모리 사용허가를 받는다는 개념으로 변화. '임대'.

os 가 메모리를 통제하기 시작했다는 의미.

할당 <<< 실패가능성이 떨어졌다. 


c++

malloc()이 연산자가 되어버림.

new 자료형

ex) int, int[n]

1. 메모리 동적할당이란 면에선 동일

2. 클래스의 생성자(함수)를 호출



int *pnData = (int*) malloc( sizeof(int) );

int *pnData = (int*) malloc( sizeof(int) * 5);

free(pnData);

c++

int *pnNewData = new int;

여기 보면 자료형을 지정해주고 있기 때문에, 크기도 자동으로 계산이 된다. 이것이 c와의 차이.

delete pnNewData;


크기 지정

int *pnNewData = new int[5];

delete [] pnNewData; // 지울때도 배열임을 명시해줘야 합니다.



c++ 에서 가장 중요한 것중 하나는 참조자 형식

int nData(10);

std::cout << nDAta << std::endl; //10출력


// 참조자는 '별명'이다. alias... 절대 변하지 않는 포인터라고 이해하면 됨.

int &rData = nData;


rData = 5;

std::cout << nDAta << std::endl; //5출력!! 헐!!


그럼 참조자를 도대체 왜 쓸까???????? 어차피 똑같은데..???????


이것을 이해하려면 포인터의 문제점을 이야기해야합니다.

변절!


int nData = 10;

int nNewData = 20;

int *pnData = &nData;

*pnData = 5; // 이건 nData = 5; 와 동일


pnData = &nNewData;

*pnData = 5; // 이건 nNewData = 5;와 동일. 같은 코드인데 다른 행위를 하네!?


포인터가 변수라는게 문제...

const를 쓰기도 한다. 이걸 극복하려고... 

결국 c++에서는 const가 붙어있다고 이해해도 될듯.




여기서 정말 중요한 이야기! 책에는 없는 이야기!


c

int a = 1;

int *pnData = &a;

int b = 2;

int c = 3;

*pnData = 5;


c++

int a = 1;

int &pnData = a;

int b = 2;

int c = 3;

pnData = 5;


디버그 모드로 실행해서 메모리 주소 확인해보면 포인터와 작동방식이 동일하다.


int nData = 10;

const int *pnData = &nData; //포인터가 가르키는 대상이 상수화됨. 근데 이게 무슨말인지 모르겠네;; nData주소를 바꿀수 없다는 얘기인가..

pnData = &b; //이건 됨

int * const pnData = &nData; //포인터의 값(주소)을 상수화.

pnData = &b; // 이게 안됨. const이므로!


아무튼 결론은 c++ 참조자는 const 포인터라는 거~~








4.

r-value 참조

c++11에서 도입

이름이 없는 임시객체를 이해해야함. -> 성능 저하. 오류 발생...


int a = 10;

int &rData = a; 


int &&rNewData = a; // 오류 발생..

int &&rNewData = 5; // 이건 됨..


int a = 10;

a가 l-value. left...location...

10이 r-value. 상수. 


3+4 인 경우 7이 연산의 중간결과. 함수의 반환값. 이게 클래스에 객체가 되면 임시객체가 됨.

이것에 대한 참조자를 선언하는 건데 이게 바로 r-value 참조.


int &&rData = nInput + 5; // 이런식으로 쓴다는데... 굳이 왜? 그냥 변수에 저장해둬도 되지 않나;;




범위 기반 for문


기존 for문의 단점

int aList[5] = {40, 30, 10, 20, 50};

for(i=0;i<5;++i)

printf("%d\t", aList[i]);


이때 배열 길이가 바뀌면, for 문도 수정해줘야한다. 인덱스 계산을 다시 해줘야 한다는거.

이 얼마나 귀찮니...


for(auto n : aList)

printf("%d\t", n);


알아서 돈다... java도 되는거네... 이러고 보니 c가 정말 날것의 언어구나 라는 생각이 든다...

단. 이때는 read만 된다. write는 불가. 실수 가능성을 줄여준다.


for(auto &n : aList)

n = 0;


이렇게 참조자를 쓰면, 수정이 가능하다. 



책을 구입해야할듯!