목록프로그램 (95)
Brise
// 7_접근지정자 74page ~ // 멤버 데이타를 private 에 놓아서 // 외부의 잘못된 접근으로 객체의 상태가 불안해 지는 // 것을 막는다! // "캡슐화(encapsulation)", "정보 은닉" struct Bike { private: int gear; public: Bike(int n = 1) { if ( n > 0) gear = n; } void changeGear(int n) { if ( n > 0 ) gear = n; } }; int main() { // Bike b = { 5 }; // C 스타일의 초기화는 멤버 데이타가 // public 인 경우만 가능.. Bike b(5); //b.gear = -10; b.changeGear(-10); } C++에서는 정보 은닉 기능을 지..
// 6_STL #include #include #include #include int main() { // char s1[10] = "hello"; // char s2[10] = "hello"; // if (s1 == s2) {} // C++ string 클래스 - 문자열을 다루는 타입 std::string s1 = "hello"; std::string s2 = "hello"; if (s1 == s2) {} // ok // 동적 배열 std::vector v(10, 0); // 10개를 0으로 초기화 v[0] = 3; // 사용법은 배열과 동일 v.resize(15); // 크기 변경도 가능 for (auto& n : v) std::cout
절차적 프로그래밍과 OOP의 차이를 알아보기 위하여 Stack 예제를 다루어 보자. // 5_Stak1 - 60 page ~ #include // 스택을 만들어 봅시다. // 버전 1. C언어 // 단점 : 스택이 2개 이상 필요하다면.... int buff[10]; int idx = 0; void push(int a) { buff[idx++] = a;} int pop() { return buff[--idx]; } int main() { push(10); push(20); std::cout idx)++] = a; } int pop(Stack* s) { return s->buff[--(s->idx)]; } int main() { Stack s1; s1.idx = 0; Stack s2; s2.idx = 0;..
예를 들어 복소수를 더하는 프로그램에 대하여 생각해보자. OOP가 아닌 절차적 프로그래밍 방식의 경우 인자로 변수를 받아 값을 더하게 된다. // 4_OOP1.cpp 57 page #include void Add(int ar, int ai, int br, int bi, // in parameter int* sr, int* si) // out parameter { *sr = ar + br; *si = ai + bi; } int main() { // 복소수 2개를 더하는 함수를 생각해 봅시다. int ar = 1, ai = 1; // 1 + 1i int br = 2, bi = 2; // 2 + 2i int sr, si; Add(ar, ai, br, bi, &sr, &si); } 객체 지향(또는 기반) 프로그..
// 3_예제 #include // Swap를 만들어 봅시다. // 1. C 버전 /* void Swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } */ // 2. C++ 레퍼런스 사용 /* void Swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } */ // 3. 템플릿 도입 template void Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } int main() { double x = 3.4, y = 2.1; //Swap(&x, &y); Swap(x, y); std::cout
// 2_메모리할당 - 52 page #include // malloc new // 함수 연산자 // void* 반환 정확한 타입으로 반환 // free 해지 delete 해지 // 생성자 호출안됨 생성자 호출 // 실패시 0반환 실패시 예외 발생 int main() { // C 스타일 int* p = (int*)malloc(sizeof(int) * 20); free(p); // C++ 스타일 int* p2 = new int; delete p2; int* p3 = new int[20]; // 배열로 할당 delete[] p3; // delete 가 아니라 delete[] 로 반환 //delete p3; // undefined(미정의 동작) 발생 } 객체 지향 언어인 C++에서는 malloc 뿐만 아니라 ..
C에서 C++로 넘어오게 되면서 큰 차이를 느끼는 문법 중의 하나가 바로 reference의 존재이다. reference의 경우 변수에 대한 별명을 부여하여 사용은 변수처럼, 동작은 포인터처럼 동작 가능한 C++에서 추가된 변수 타입이다. 물론 이를 통하여 편리함을 얻게 되었지만, 문법을 잘 아는 것이 아니라면 call by value인지 call by reference인지 헷갈리는 경우가 있다. // 1_레퍼런스.cpp 41 page #include // 핵심 1. 기존 변수(메모리)에 새로운 이름을 부여 하는 것 // 2. 레퍼런스 변수 선언시 반드시 초기값이 있어야 합니다. int main() { int n1 = 10; int n2 = n1; int* p1 = &n1; int& r1 = n1; //..
C언어에서의 NULL 의 값은 0으로 고정되어 있다. C의 특성 상 포인터 값과 변수값 사이의 변환이 상대적으로 자유롭기 때문에 포인터가 아닌 변수값에 대해서도 NULL 값을 입력할 수 있고, 포인터 값에 대해서도 0을 입력할 수 있다. // 11_nullptr1.cpp 54 page int main() { // 0의 정체 : 0은 정수지만 포인터로 암시적 형변환된다. int n1 = 0; // ok int* p1 = 0; // ok // C++11. nullptr : 포인터 0 int n2 = nullptr; // error int* p2 = nullptr; // ok } C++에서는 포인터의 NULL값을 좀 더 strict 하게 지정할 수 있는 nullptr을 사용할 수 있다. 해당 값은 포인터에만 ..