#title C++ 개요 [[TableOfContents]] ==== 구조적 프로그래밍 ==== * 프로그램 = 데이터 + 알고리즘 * C는 절차적 언어 -> 알고리즘에 더 치중함. * FORTRAN, BASIC과 같은 절차적 언어 -> 스파게티 프로그램이 됨 -> 구조적 프로그래밍의 등장배경 * 구조적 프로그래밍은 하향식(Top-Down) 설계 -> 쪼개고 쪼개어 프로그래밍하기 위한 작은 모듈이 될 때까지 쪼갠다. * 여전히 절차적 ==== 객체지향 프로그래밍 ==== * 큰 규모에서 구조적 프로그래밍은 어려운 문제 -> 객체지향의 등장배경 * 데이터를 강조 -> 해결해야 할 문제의 특성에 맞게 데이터의 형태를 설계 * 데이터와 그 데이터를 대상으로 수행할 수 있는 동작을 정의 * 객체를 정확히 묘사하는 클래스를 설계하는 것이 처음에 할 일 -> 상향식(Bottom-Up) * 재사용, 정보은닉, 다형성, 상속성 -> 해결해야 할 작업이 아닌 개념의 표현에 주안점을 둠 * 코드의 재사용은 C++의 진정한 강점 ==== 일반화 프로그래밍 ==== * 일반화(generic)은 특정형에 구속되지 않는 코드를 작성한다는 뜻 -> C++ 템플릿 * 알고리즘을 강조 (여전히 재사용, 개념의 추상화는 OOP의 개념과 동일) ==== C++ ==== * Bell 연구소의 Bjarne Stroustrup이 1980년대 초에 개발 * C++ = C의 특성(저수준의 하드웨어 접근을 제공) + OOP특성(고수준의 추상화) ==== 프로그래밍 절차 ==== * 원시코드 작성 -> 프로그램을 짠다 * 원시코드 컴파일 -> 컴퓨터가 알아먹을 수 있는 기계어로 번역해 준다. (번역된 파일이 목적(Object) 코드라고 한다) * 링크 -> 목적코드와 라이브러리 함수에 해당하는 목적코드, 표준 시동코드를 연결해 준다. * 결과로 실행가능한 코드가 만들어진다. ==== Hello World ==== {{{ #include using namespace std; int main() { cout << "Hello World!" << endl; cin.get(); return 0; } }}} #include * 선행처리 지시자 * 소스코드가 컴파일될 때 자동으로 iostream 파일의 내용을 함께 컴파일한다. * #include 문장이 iostream 파일의 내용으로 대체된다. using namespace std; * std 이름공간을 사용한다는 뜻이다. * 같은 함수더라도 네임스페이스에 따라서 내용을 다를 수 있다. (버전, 동음이의어 등) int main() * 누가 호출하나? 운영체제가 호출한다. * { ~~ } 는 함수 몸체다. 이 안에 함수의 내용을 정의한다. * int 는 Return Type ==== Class 기초 ==== * 클래스는 사용자 정의 데이터형 * 데이터의 종류와 데이터를 대상으로 수행하는 동작을 정의 * 클래스, 객체 * 클래스는 데이터와 데이터의 사용방법을 나타내는 추상적인 개념 * 객체는 클래스의 속성에 따라 생성된 하나의 개체(객체 인스턴스 or 인스턴스 변수라고 함) * 동작을 수행하게 하려면 해당 객체에 메시지를 전달 * 메시지 전달방법 * 클래스 메소드를 사용(매개변수와 매개변수의 데이터형을 알고 있어야 한다. 즉, 메시지를 주고 받기 위한 일종의 규약이 있다는 뜻이다) * 연산자 재정의 ==== Memory Segment ==== || '''메모리영역''' || '''설 명''' || ||Code Segment||프로그램 코드에 대한 메모리의 할당/해제가 이루어지는 영역.|| ||Data Segment||static변수, 전역변수가 사용하는 메모리 영역으로 이 영역의 변수는 0으로 자동 초기화 됨. 문자열상수("Hello World")도 사용함. [[BR]]프로그램 시작시 연속적인 공간으로 할당, 단, 큰 메모리 할당을 요구하는 경우, 메모리가 부족하여 할당이 실패한다면 프로그램이 죽을 수 있음.|| ||Stack Segment||매개변수, 함수내의 지역변수가 사용하는 메모리 영역, OS가 알아서 해제한다. 이 영역의 변수들은 초기화하지 않으면 쓰레기값을 가진다.|| ||Heap Segment||malloc(), new로 동적으로 할당되는 영역, 사용자에 의해 해제된다.|| {{{ void test(int a) { cout << "Data Segment에 저장됩니다." << endl; int *p = new int[10]; delete []p; } }}} * 지역변수 p, 매개변수 a * Stack Segment를 사용 * OS가 해제 * 동적으로 할당되는 배열{{{[10]}}} 즉, 40byte * Heap Segment를 사용 * 사용자가 직접 해제 -> delete []p;