바로가기

주메뉴

객체지향프로그래밍 (C++)

  • 금오공과대학교
  • 황준하
  • 강의담기
  • 오류접수
  • 이용안내
  • 주제분류
    공학 >컴퓨터ㆍ통신 >컴퓨터공학
  • 강의학기
    2012년 1학기
  • 조회수
    9,712
  •  
강의계획서
강의계획서
본 강좌에서는 대표적인 객체지향 프로그래밍 언어인 C++ 언어에 대해 학습함으로써 객체지향 프로그래밍 언어의 필요성 및 개념을 이해하고, 응용 문제 해결을 위한 객체지향 방식의 설계 및 구현능력을 배양한다. 본 강좌는 대상 학생들이 C 언어에 대한 학습을 완료했다고 가정하고 있으므로 본 강좌를 학습하기 전에 C 언어에 대한 학습이 선행될 필요가 있다. 단, 1차시 학습을 통해 C 언어에 대한 주요 내용을 정리하였으므로 이를 통해 C 언어의 기본적인 내용을 이해하고 부족한 경우 추가로 학습하기 바란다.

교재 : C++ 프로그래밍 입문, 한티미디어, 2007년

차시별 강의

PDF VIDEO SWF AUDIO DOC AX
1. C 언어 복습 C++ 언어는 C 언어를 기반으로 만들어진 프로그래밍 언어로서 C 언어의 문법과 라이브러리 등 대부분의 내용을 그대로 포함하고 있다. C++ 언어를 학습하는 데는 두 가지 방법이 있다. 첫 번째는 C 언어를 학습한 후 C++ 언어를 학습하는 것이고, 두 번째는 바로 C++ 언어에 대해 학습하되 당연히 C++와 C 언어에 공통적으로 포함된 내용들부터 학습하는 것이다. 본 강좌는 대상 학생들이 C 언어에 대한 학습을 완료했다고 가정하고 그 외에 C++ 언어에 추가된 다양한 특징들을 설명하고 있다. 그렇다고 바로 C++ 언어에만 존재하는 내용으로 들어가기에는 너무 무책임한 느낌이 든다. 따라서 본 강좌에서는 1차시를 할애하여 C 언어에 대한 내용을 정리하였다. 많은 내용을 깊이 있게 다루지는 못하겠지만 본 학습을 통해 C 언어의 기본적이고 중요한 내용들을 설명할 것이다. 이 내용들은 앞으로 C++ 언어를 학습하는 데 큰 도움이 되리라 생각된다. 자신이 이미 C 언어에 익숙하다고 생각한다면 바로 2차시 강좌로 넘어가도 된다. URL
2. 더 나은 C로서의 C++ (1) C++는 객체지향 프로그래밍 방식을 지향하면서도 C 언어와 같은 절차지향 프로그래밍 방식을 포함하고 있다. 따라서 기존의 C 언어 프로그래머들은 C++를 사용하더라도 기존의 프로그래밍 스타일을 그대로 사용할 수 있다. 이것은 본 강좌에서 의도하고 있는 바와 같이 C 언어를 배우고 C++ 언어를 배우는 방식의 장점이자 단점일 수 있다. 장점은 C 언어에 익숙한 경우 C++ 언어의 문법 및 사용에 금방 익숙해질 수 있다는 것이며, 단점은 C++ 언어를 사용할 경우 객체지향 관점에서 프로그램을 설계하고 구현할 수 있는데도 불구하고 C 언어를 사용하던 습관 때문에 절차지향 프로그래밍 방식으로 프로그램을 작성하게 된다는 것이다. 이를 극복하기 위해서는 C++ 언어 자체에 대한 연습과 함께 소프트웨어 설계와 관련된 연습이 뒤따라야 한다. 본 교재에서는 C++ 언어 자체에 초점을 맞추고 있으며 이것을 기반으로 객체지향적 소프트웨어 설계를 위한 학습을 진행해 나가길 바란다.
객체지향 프로그래밍에 대한 본격적인 내용은 4장부터 다룰 예정이며 2장과 3장에서는 기존의 C 언어와 관련된 내용들 중 수정되거나 추가된 내용들에 대해 다룰 것이다. 먼저 2장에서는 개선된 표준 입출력 방법을 비롯하여 C++에 새로 추가된 네임스페이스, 디폴트 매개변수, new와 delete 등에 대해 설명하며 현재 C 언어와 C++ 언어의 차이점 및 향후 발전 방향에 대해서도 생각해 볼 것이다.
URL
3. 더 나은 C로서의 C++ (2) 본 장에서는 2장에 이어 C 언어로부터 추가된 몇 가지 기능들을 소개한다. 인라인 함수는 일반 함수와는 다른 동작 방식으로 수행되는 함수로서 이미 C 언어 표준으로도 추가되었으며 향후로는 C 언어에서도 사용하게 될 것이다. 그리고 본 장의 핵심 내용이라 할 수 있는 참조의 개념 및 사용 방법에 대해서 설명할 것이다. C++에서 참조는 프로그래밍의 편의성 및 프로그램의 성능을 향상시킬 수 있는 수단을 제공해 주는 동시에 객체지향 프로그래밍을 위한 필수 요소로서 사용되고 있다. 그리고 C와 C++ 언어를 결합하기 위한 linkage 지정자에 대해서 알아보고, 선언과 정의에 대한 C와 C++ 언어의 차이점을 살펴볼 것이다. 마지막으로 4장부터 등장하게 될 객체지향 프로그래밍의 기본 개념에 대해 설명할 것이다. URL
4. 클래스와 객체 C++의 핵심은 바로 클래스이다. C++를 배운다는 것은 클래스의 작성 방법과 사용 방법을 배우는 것이라고 해도 과언이 아니다. 본 장에서는 클래스에 대한 기초에 대해 설명한다. 그리고 다음 장부터 클래스와 관련된 세부적인 사항들을 다루게 될 것이며 이 강좌의 마지막까지 클래스에 관한 얘기는 계속해서 등장하게 될 것이다. 우선 본 장에서는 멤버 변수와 멤버 함수로 구성되는 클래스의 기본 구조에 대해 설명하고 객체의 개념 및 클래스로부터 객체를 생성하는 방법을 설명할 것이다. 그리고 객체 생성 및 소멸 시 동반 수행되는 생성자와 소멸자에 대해서도 설명할 것이다. URL
5. 클래스의 활용 멤버 변수와 멤버 함수, 생성자와 소멸자 등 클래스에 대한 기본적인 내용에 대해 배웠다. 하지만 클래스를 클래스답게 사용하기까지는 아직까지 많은 고비가 남아 있다. 이제 그 첫 번째 고개를 넘으려 한다. 본 장에서는 클래스 활용과 관련된 내용으로서 먼저 객체 배열, 객체 포인터와 같이 그 자체로서 활용도가 높은 주제를 다루며, 그러고 나서 this 포인터, friend 등 향후 다른 주제들을 구현하는 데 적용될 개념들에 대해 설명한다. 그 외에도 내포 클래스, 지역 클래스, static, const 등 클래스와 관련된 다양한 용어와 주제들에 대해 다룰 것이다. URL
6. 복사 생성자 5장에서는 객체 배열, 객체 포인터, this 포인터, friend, static, const 등 클래스와 관련된 다양한 주제에 대해 설명하였다. 이제부터는 지금까지 다루지 않은 주제들 중에 복사 생성자, 연산자 오버로딩, 상속에 대해 차례로 다룰 것이다. 그런데 이 주제들은 5장의 다양한 주제들과는 달리 각 주제마다 다루어야 될 많은 내용들을 포함하고 있다. 따라서 각 주제별로 하나의 장 또는 2개의 장에 걸쳐 설명할 것이다. 먼저 본 장에서는 복사 생성자에 대해 학습해 보기로 하자. 복사 생성자는 생성자의 한 종류로서 C++ 프로그램을 작성하다 보면 자신도 모르는 사이에 이것을 사용하게 된다. 그러나 경우에 따라서는 복사 생성자를 용도에 맞게 사용해야만 프로그램이 제대로 동작하는 경우가 있다. 따라서 우리는 복사 생성자의 세부적인 작성 방법 및 사용 방법을 이해하고 있어야만 한다. 지금부터 복사 생성자가 무엇인지 어떻게 사용하는 것인지 살펴보도록 하자. URL
7. 연산자 오버로딩 복사 생성자, 연산자 오버로딩, 상속이라는 3가지 큰 주제들 중 복사 생성자에 대해 살펴보았다. 본 장에서는 연산자 오버로딩이란 주제에 대해 설명할 것이다. C++의 세부 주제들 중 중요하지 않은 것은 하나도 없지만 개인적으로는 연산자 오버로딩이 가장 재미있고, 신기하고, 실용적이라 생각된다. 아마도 제일 쉬워서 그럴지도 모르겠다. 연산자 오버로딩은 (1 + 1)과 같이 int형 값에 대한 + 연산이 가능하듯이 클래스 객체들 사이의 연산을 가능하게 해 주는 도구이다. 내부적으로는 함수가 동작하는 것이므로 함수만 작성할 수 있다면 연산자 오버로딩의 의미와 기본 동작 원리의 이해만으로도 거의 모든 연산자에 대한 응용이 가능하다. 본 장에서는 1, 2, 3절을 통해 연산자 오버로딩의 의미와 원리에 대해 설명하며 그 이후로는 다양한 연산자들에 대한 오버로딩의 예를 보일 것이다. 일관되게 얘기하는 것은 기본 원리만 제대로 이해하면 된다는 것이다. 지금부터 연산자 오버로딩이 무엇인지 하나씩 살펴보기로 하자. URL
8. 상속 지금까지 복사 생성자와 연산자 오버로딩을 비롯하여 하나의 클래스를 작성하는 방법에 대해 배웠다. 이 내용만으로도 필요로 하는 클래스, 클래스다운 클래스를 얼마든지 만들 수 있다. 그러나 유사한 클래스가 여러 개일 경우 중복되는 내용을 반복적으로 작성해야 한다면 그것은 시간 낭비일 것이다. 이런 문제를 해결할 수 있는 기술이 상속(inheritance)이다. 상속은 새로운 클래스를 작성해야 하는 경우 이미 이와 유사한 클래스가 존재한다면 해당 클래스의 내용을 다시 기술하지 않고도 그 내용을 그대로 사용할 있도록 해 주는 것이다. 그리고 필요하다면 내용을 추가할 수도, 내용을 수정할 수도 있다. 상속은 코드의 재활용을 위한 필수적인 기술 요소로 자리 잡고 있으며, 데이터 캡슐화, 상속, 다형성으로 대변되는 객체지향 프로그래밍의 3가지 요소들 중 한 요소이기도 하다. 앞으로 여러분들이 프로그램을 개발할 때 직접 상속을 사용하여 클래스들을 구성할 수도 있다. 또는 누군가가 작성해 놓은 클래스 라이브러리를 사용하는 경우에도 직접 그 클래스를 사용할 수도 있지만 해당 클래스로부터 상속받아 새로운 클래스를 만들어 사용할 수도 있다. 이처럼 다양한 측면에서 상속이라는 기술이 사용될 수 있다. 본 장을 통해 상속의 개념과 기본적인 구현 방법을 살펴보도록 하자. URL
9. 상속과 다형성 데이터 캡슐화, 상속, 다형성이라는 객체지향 프로그래밍의 3가지 특징 중 C++에서 제공하는 데이터 캡슐화와 상속에 대해서 배웠다. 이제 나머지 하나인 다형성에 대해서 배울 차례이다. 다형성의 사전적 의미는 “같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상”이라고 되어 있다. 다형성은 상속을 떼어놓고는 설명할 수 없는 개념이다. 상속 관계에 있는 클래스들의 객체가 바로 같은 종의 생물이기 때문이다. 또한 상속과 함께 포인터, 참조, 대입과 관련된 내용이 필수적으로 동반되어야 한다. 다형성에 대해 설명하기 위해 대입에 대한 얘기부터 시작할 것이다. base 클래스 객체 포인터에는 base 클래스 객체의 주소가 대입될 수도 있지만 derived 클래스 객체의 주소가 대입될 수도 있다. 그리고 base 클래스와 derived 클래스는 멤버 함수 재정의에 의해 같은 멤버 함수를 포함할 수 있다. 그렇다면 base 클래스 객체 포인터를 통해 해당 멤버 함수를 호출한다면 base 클래스의 멤버 함수와 derived 클래스의 멤버 함수 중 어떤 것이 수행되어야 할까? 바로 이것이 본 장의 주제이다. 다형성, 즉, “같은 포인터이면서도 경우에 따라 다른 함수가 수행되는 현상”을 경험하게 될 것이다. 다형성을 통해 상속의 진정한 가치를 발견할 수 있을 것이며, 아울러 프로그래밍의 유연성을 향상시킬 수 있다는 사실을 느낄 수 있을 것이다. URL
10. 템플릿 지금까지 C++에서 제공하는 객체지향 프로그래밍의 3가지 특징인 데이터 캡슐화, 상속, 다형성에 대해 알아보았다. C++는 이와 같은 객체지향 프로그래밍의 개념과는 별도로 일반화 프로그래밍(generic programming)이라는 개념을 제공하고 있다. 예를 들어 누군가가 스택(LIFO) 자료구조를 원한다고 하자. 어떤 때는 int형 값을 저장할 수 있는 스택이 될 수도 있고 어떤 때는 double형 값을 저장할 수 있는 스택이 될 수도 있다. 심지어는 CPoint 객체를 담을 수 있는 스택을 원할 수도 있다. 스택은 사실상 특정 타입과는 무관하게 표현될 수 있는 자료구조이다. 프로그램 차원에서는 스택을 라이브러리로 만들어 놓는다면 어떤 타입의 변수도 저장할 수 있도록 만들어야만 한다. 이것이 일반화 프로그래밍이며 일반화 프로그래밍을 가능하게 하는 도구가 바로 템플릿이다. 표준 C++에서 제공하는 라이브러리의 대부분이 템플릿으로 작성되어 있다고 해도 과언이 아닐 정도로 템플릿이 많이 사용되고 있다. 본 장에서는 주로 템플릿을 만드는 방법과 사용하는 방법에 대해 설명할 것이다. 그리고 13장을 통해 표준 C++에서 제공하는 템플릿 라이브러리의 사용 방법에 대해 배우게 될 것이다. URL
11. C++ 표준 라이브러리와 표준 입출력 지금까지 C++ 언어와 관련된 많은 내용에 대해 학습하였다. 객체지향 프로그래밍과 관련하여 데이터 캡슐화, 상속, 다형성에 대해 배웠으며 일반화 프로그래밍을 위한 도구인 템플릿에 대해 배웠다. 이와 같은 내용들과 함께 표준 C++ 언어를 구성하는 한 축으로 C++ 표준 라이브러리를 빼놓을 수 없다. 1980년대 초 C++ 언어가 처음 개발된 이래로 표준 C++에는 프로그래머에게 유용한 많은 라이브러리들이 추가되어 왔다. C++ 표준 라이브러리는 C 스타일의 함수를 기반으로 하는 경우도 있지만 대부분의 경우 C++의 핵심인 클래스와 템플릿을 기반으로 하고 있다. 현재에 있어서는 라이브러리의 활용 방법을 익히는 것이 C++의 문법을 익히는 것만큼 중요하다 할 수 있다. 라이브러리에 익숙해질 경우 불필요한 코드 개발을 위해 낭비하는 시간을 줄이고 주어진 문제의 해결을 위한 핵심 알고리즘을 개발하는 데 더 많은 시간을 할애할 수 있을 것이다. URL
12. 파일 입출력 표준 입출력과 더불어 프로그래밍을 위해 필수적으로 동반되어야 하는 것이 파일 입출력이다. 프로그램 실행 중에 메모리에 생성되는 변수들은 프로그램의 종료와 함께 사라져 버린다. 따라서 데이터를 영구적으로 파일에 저장하거나 키보드로부터의 입력이 아니라 파일에 저장되어 있는 데이터를 읽어와 처리할 수 있어야만 한다. C++에서는 C 언어에서 사용하는 방식을 모두 사용할 수 있다. FILE 포인터를 사용할 수 있으며 fscanf, fprintf, fread, fwrite 등의 입출력 관련 함수들도 사용할 수 있다. 그러나 C++ 프로그램 작성 시 더 이상 C 관련 파일 입출력 방법을 사용하지 않을 것이다. C++에서는 더 사용하기 편한 파일 입출력 관련 클래스들을 만들어 놓았기 때문이다. 사용자는 C++에서 제공하는 파일 입출력 클래스들의 기능을 확인하여 목적에 맞게 활용할 수 있으면 된다. 지금부터 C++에서 제공하는 파일 입출력 클래스들의 기능과 사용 방법에 대해 알아보도록 하자. URL
13. 표준 템플릿 라이브러리 10장을 통해 함수 템플릿과 클래스 템플릿을 만들고 사용하는 방법에 대해 배웠다. 템플릿은 타입에 무관한 코드를 작성할 수 있다는 점에서 라이브러리를 구축하기 위한 적절한 도구로 인식될 수 있다. 이에 따라 표준 C++에서는 유용한 라이브러리를 템플릿으로 만들어 제공하고 있는데 이 라이브러리는 표준 템플릿 라이브러리(STL)라는 이름으로 불리기도 한다. 본 장에서는 STL에 대한 기본적인 구성 원리 및 사용 방법에 대해 설명하고자 한다. STL은 템플릿을 기반으로 하고 있다. 10장에서 배운 템플릿 작성 및 사용 방법이 그다지 어렵지는 않았으리라 생각되지만, STL을 처음 접하는 프로그래머에게는 STL의 구현 원리 및 사용 방법이 그리 간단치만은 않을 것이다. 하지만 STL은 우리가 항상 필요로 하면서도 직접 작성하기에는 시간이 많이 걸리는 다양한 함수와 클래스를 포함하고 있다. 이와 같은 매력적인 함수와 클래스의 사용 방법을 익히기 위해 어느 정도의 시간을 투자하는 것이 아깝지는 않을 것이다. 본 강좌를 통해 STL의 모든 것을 다루지는 못하지만 STL을 사용하는 데 불편함이 없을 정도는 될 것이라 생각된다. STL의 기본 원리 및 사용 방법만 이해한다면 어려울 것도 없다. 지금부터 STL이 무엇인지 어떻게 사용하는 것인지 살펴보도록 하자. URL
14. 예외 처리 예외(exception)란 프로그램을 실행하는 도중에 발생하는 문제점을 의미한다. 우리는 지금까지 주어진 문제를 어떻게 해결할 것인가의 관점에서 코드를 작성하는 방법을 배웠지만 상용 프로그램을 작성하는 대부분의 프로그래머들이 실행 중 발생하는 문제점을 예측하고 이를 제거하기 위해 많은 노력을 기울이고 있다. 이 노력의 결과로 프로그램의 많은 부분이 정상적인 수행에서 벗어나는 상황을 검사하고 처리하기 위한 if문을 포함하게 되며, 그로 인해 프로그램은 점점 더 복잡해지고 해석하기 힘들어지게 된다. C++의 예외 처리는 정상적인 흐름과 예외 처리 부분을 분리함으로써 예외 상황을 보다 명확하게 처리할 수 있는 메커니즘을 제공하고 있다. 또한 C++ 예외 처리는 라이브러리를 작성하는 프로그래머에게는 예외가 발생하였음을 알려줄 수 있는 기능을 제공하며, 라이브러리를 사용하는 프로그래머에게는 이 예외를 처리할 수 있는 기회를 제공함으로써 보다 안정화된 라이브러리 제작 및 사용 환경을 만들어 주고 있다. 본 장에서는 예외 처리의 개념과 필요성을 먼저 설명한 후 예외 처리를 위한 다양한 기법들을 소개할 것이다. URL
15. 기타 주제들 본 장에서는 지금까지 다루지 못한 몇 가지 주제를 다루고자 한다. 각 주제가 앞서 다루었던 특정 주제에 포함될 수도 있겠지만 해당 주제를 설명하는 데 불필요하다고 생각되어 본 장에서 따로 설명하게 되었다. 그렇다고 본 장의 주제들이 중요하지 않다는 것은 아니다. C++를 처음 접하는 경우 사용할 기회가 많지는 않겠지만 보다 큰 프로그램을 작성할 경우 유용하게 사용될 수도 있다. 지금부터 총 4가지 주제인 auto_ptr, 변환함수, cast 연산자, RTTI에 대해 알아보자. URL

연관 자료

loading..

사용자 의견

강의 평가를 위해서는 로그인 해주세요.

이용방법

  • 강의 이용시 필요한 프로그램 [바로가기]

    ※ 강의별로 교수님의 사정에 따라 전체 차시 중 일부 차시만 공개되는 경우가 있으니 양해 부탁드립니다.

이용조건