유튜브 최호성님 강의 들으면서 정리
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. 클래스의 생성자(함수)를 호출
c
int *pnData = (int*) malloc( sizeof(int) );
int *pnData = (int*) malloc( sizeof(int) * 5);
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;
이렇게 참조자를 쓰면, 수정이 가능하다.
책을 구입해야할듯!
'void' 카테고리의 다른 글
스티커 컬러링북 디즈니 겨울왕국2 후기 (0) | 2020.03.24 |
---|---|
델 모니터 u2415 개봉기! 16:10! (0) | 2020.03.23 |
Thinkpad s440 터치패드 두손가락 스크롤 안될때(windows 10) (0) | 2020.02.12 |
롯데몰 쥬라기월드 특별전 후기 (0) | 2020.01.12 |
티스토리로 컴백 (0) | 2016.12.19 |