슬라이드 1

Download Report

Transcript 슬라이드 1

C++언어의 소개
윤홍란
[email protected]
01. C++언어의 소개
 C언어를 기반으로 객체지향 패러다임을 더하여 만든 언어
 분산 시스템, 임베디드 시스템, 시스템 프로그램, 과학 계산용 프로그램 등
의 다양한 분야에 대해서 적용됨.
 많은 운영체제에서 C++언어로 개발이 가능한 개발환경이 갖추어져 있음.
 국제 표준이 존재하므로, 국제 표준에 의거해 작성된 프로그램은 어디에서
든지 같은 의미를 지닌다.
 낮은 레벨의 접근이 가능하므로 손쉽게 시스템 레벨의 프로그램을 작성할
수 있도록 지원한다.
 명령형과 객체지향의 개념뿐만 아니라 제네릭 프로그래밍, 함수형 프로그
래밍 등의 다양한 패러다임을 지원함.
프로그래밍개론
2
ISO/IEC 14882 – Programming Language C++
 국제적으로 명망과 인지도가 있는 각국의 프로그래밍 언어 전문가들에 의
해서 만들어진 C++ 언어의 공통된 협약
 C++에 대한 국제표준으로 ISO/IEC에서 만든 공통 협약으로 갱신될 때마다
버전이 바뀌며, 현재 최종 버전은 14882:2003 이다.
 C++ 언어의 표준안은 ANSI (American National Standard Institute)에서
처음 시도되었으며, 1989년 ANSI C++ 표준이 제공됨.
 일반적으로 C++ 프로그램은 이 국제표준이 제정하고 있는 규약을 만족하
는 프로그램만을 의미한다.
 C++ 프로그램을 작성하고 실행하는 환경 간의 차이를 최소화하고, 각국의
전문가들과 공통된 언어로 의사소통이 가능함.
 국제 표준을 따를 경우 의사소통과정에서 발생할 수 있는 불필요한 자원의
낭비를 줄이고, 이식성을 높일 수 있다는 장점이 있다.
컴퓨터프로그래밍
3
멀티 패러다임
 프로그래밍 언어의 패러다임 – 프로그래밍 언어에서 추구하는 대상이나 강
조하는 기본 개념
 C++언어는 하나의 언어에서 명령형, 객체지향 및 함수형, 제네릭, 메타 프
로그래밍 등을 제공하는 멀티 패러다임 을 지원함.
 C++언어의 주요 패러다임
방식
설명
일련의 순서로 구성되며, 나열된 순서대로 프로그램이 수행
명령형
(Imperative)
함수의 형태로 프로그램을 작성함
함수형
(Functional)
객체지향(OO) 프로그램을 객체의 집합으로 구성하여, 메시지의 상호교환을 통한 처리
수행
제네릭
(Generic)
코드의 재사용과 일반적인 개념을 추상화하기 위한 개념
메타(Meta)
컴파일 시간에 모든 실질적인 계산이 끝나 실행 시간에 영향을 최소화
컴퓨터프로그래밍
4
C언어와 C++언어
 C++언어는 C언어의 패러다임과 언어적인 부분까지 포함하는 좀 더 큰 범
위를 차지함.
 C++언어는 초기에 만들어질 때 C언어의 언어적인 부분을 가져오고 클래스
의 개념을 확장하는 것으로 시작했음.
 현재 C언어와 C++언어는 독립적으로 표준화가 계속되고 있으며, 표준화의
추진 그룹 역시 상호간에 많은 영향을 미치고 있음.
컴퓨터프로그래밍
5
02. C++언어와 객체지향 프로그래밍
 소프트웨어의 위기 해소 및 생산성 증대를 위해서 제안된 많은 기술 중에서
객체지향 설계/개발 기법이 가장 큰 성과를 거두었음.
 C++언어는 C언어에 당시 Smaltalk, Eiffel등의 언어에서 지원하던 객체지
향의 개념을 접목하여 태동됨.
 클래스, 상속, 오버로딩, 오버라이딩 등의 C++언어의 많은 기술적 요소들이
객체지향을 지원하기 위해서 존재함.
 C++언어에서 지원하는 객체지향 개념은 구조적 방법에 의한 프로그램에
비해 가독성이 높으며, 소프트웨어의 생산성을 높일 수 있도록 함.
 C++언어는 객체지향뿐만 아니라 다양한 패러다임을 지원함.
컴퓨터프로그래밍
6
구조적 방법
 구조적 방법의 개념
o 문제에 대한 분할 및 정보(Divide and Conquer)의 개념으로 문제를 분해하고,
이를 단계별로 해결하는 방법
o 프로그램의 실행 흐름을 강조하므로 절차지향이라고도 하며, C언어를 비롯한
많은 프로그래밍 언어들이 이를 지원함.
 구조적 방법의 단점
o 개발자가 실세계의 문제보다 프로그램이 실행되는 기계의 관점에서 문제를 해
결해야 한다는 어려움이 있음.
o 대형 소프트웨어에서 잠재적인 오류를 증가시킬 가능성이 있음.
o 처리 절차에 대해서만 강조하기 때문에 데이터에 대한 고려가 부족해 데이터가
제대로 보호되지 못함. (전역변수)
컴퓨터프로그래밍
7
객체지향 방법
 객체지향 방법론
o 소프트웨어 시스템을 구성하는 요소를 인터페이스와 데이터를 포함한 객체의
단위로 나누고, 객체간의 메시지 전달을 통해 문제를 해결
o 실 세계의 문제를 직접 묘사할 수 있는 장점 및 재사용성에 의해 빠른 소프트웨
어의 개발 및 생산성의 증대에 도움을 줌.
o 객체지향 프로그램에서는 객체의 구성 및 객체간의 통신을 정의하는 것이 중요
함.
 객체지향의 기본 키워드
o 객체(Object) : 실세계에 존재하는 모든 사물
o 클래스(Class) : 객체를 프로그램으로 표현할 수 있도록 만든 언어적 도구
o 인스턴스(Instance) : 프로그램에서 클래스를 통해 만든 실제의 실행 객체
 클래스의 디자인의 중요한 문제
o 어느 정도 레벨까지를 클래스로 구현해야 하는가?
o 패턴(Pattern)의 적용을 고려
컴퓨터프로그래밍
8
객체지향 디자인 1
 객체지향 설계의 고려사항
o 객체의 정의 및 객체간의 통신에 대한 정의
o 캡슐화, 추상화, 상속 및 다형성 등의 핵심 개념의 적용
 캡슐화(Encapsulation)
o 데이터와 함수 등 객체와 관련된 것을 하나로 묶는 것.
o 정보 은닉(Information Hiding)과 함께 연관 지어 사용되는 개념
o 외부에서 알아야 할 필요가 없는 데이터와 연산을 외부에서 보이지 않게 숨겨
자세한 실행 흐름을 드러나지 않게 함.
 추상화(Abstraction)
o 인터페이스(Interface)와 구현(Implementation)을 분리하는 것.
o 객체가 가진 특성 중 필수 속성만으로 객체를 묘사하고 유사성을 표현하며, 세
부적인 상세 사항은 각 객체에 따라 다르게 구현되도록 함.
o C++ 언어는 가상 함수를 통한 클래스의 상속을 통하여 추상화를 제공 함.
o 기능 추상화 와 자료 추상화 가 있음.
컴퓨터프로그래밍
9
객체지향 디자인 2
 상속(Inheritance)
o 기존에 정의된 클래스를 이용하여 새로운 클래스를 정의할 수 있도록 함.
o 클래스에 상, 하 관계를 맺을 수 있도록 하고 하위 클래스는 상위 클래스에서 정
의한 모든 내용을 수정 없이 사용 가능하도록 정의함.
o 상위 클래스(Super Class), 기본 클래스(Base Class), 부모 클래스(Parent
Class)
o 하위 클래스(Sub Class), 유도 클래스(Derive Class), 자식 클래스(Child
Class)
o 다중 상속(Multiple Inheritance): 두 개 이상의 부모 클래스로부터 상속받는 것
으로 지정한 부모 클래스의 속성을 모두 물려받음.
 다형성(Polymorphism)
o 서로 다른 타입에 대해 동일한 방식으로 접근할 수 있도록 하나의 인터페이스를
제공하는 것.
o C++언어에서는 가상 함수(6장), 템플릿(8장), 오버로딩(7장) 등의 방법을 이용
해서 다형성을 제공 함.
컴퓨터프로그래밍
10
03. C++ 프로그램의 구조
 C++ 프로그램은 하나 이상의 헤더 파일과 소스파일로 구성됨.
o 헤더파일 : 해당 클래스의 선언과 적용될 수 있는 데이터, 상수 정의등으로 구성
되는 확장명이 .h, .hpp 인 파일
o 소스파일 : 구체적인 실행 코드가 담기는 파일로 .cpp, .cc, .cxx등의 확장명을
가지는 파일로 구현파일이라고도 함.
 Hello World 프로그램
01 // First C++ program – print Hello
02 #include <iostream>
03 using namespace std;
04 int main()
05 {
06 cout << "Hello, world!\n";
07 }
컴퓨터프로그래밍
/* hello world 문자열을 화면에 출력함. */
11
04. C++ 프로그램의 개발 환경
 비주얼 C++
o 윈도우 환경에서 널리 사용되는 C++ 프로그램의 통합개발환경(IDE,
Integrated Development Environment)
o 하나의 개발 환경 내에서 원시코드의 편집에서 컴파일, 링크 및 실행의 전 과정
을 수행할 수 있도록 에디터, 컴파일러, 링커 및 디버거가 모두 제공이 됨.
o .Net 프레임워크에서 비주얼 C++의 기능을 통합하여 지원되고 있음.
 g++
o 유닉스나 리눅스 환경에서 C++ 프로그램의 개발을 지원하는 기본 컴파일러
o C컴파일러인 gcc와 마찬가지로 자유 소프트웨어 재단(FSF, Free Software
Foundation)과 GNU(Gnu is not Unix)에서 공급하는 무료 컴파일러
o 기본적으로 통합개발환경을 지원하지는 않으며, vi와 같은 별도의 범용에디터
를 사용해야 함.
컴퓨터프로그래밍
12
비주얼 C++의 설치 1
1. 소개화면
2. 라이센스
컴퓨터프로그래밍
13
비주얼 C++의 설치 2
3. 제품 ID 및 사용자 정보 입력
4. 설치 옵션
컴퓨터프로그래밍
14
비주얼 C++의 설치 3
5. 공통파일 설치 폴더 선택
6. 설치 안내화면 1
컴퓨터프로그래밍
15
비주얼 C++의 설치 4
7. 설치 안내 화면 2
8. 설치 프로그램 선택
컴퓨터프로그래밍
16
비주얼 C++의 설치 5
9. 설치 환경 변수
10. 설치 진행
컴퓨터프로그래밍
17
비주얼 C++의 설치 6
11. 설치 완료
컴퓨터프로그래밍
18
비주얼 C++의 실행
1. 비주얼 C++의 실행
2. 비주얼 C++ 초기화면
컴퓨터프로그래밍
19
비주얼 C++을 이용한 프로그램 개발 1
1. 새 프로젝트의 생성단계 1
2. 새 프로젝트의 생성단계 2
컴퓨터프로그래밍
20
비주얼 C++을 이용한 프로그램 개발 2
3. 신규 파일 추가
4. 프로그램의 편집
컴퓨터프로그래밍
21
비주얼 C++을 이용한 프로그램 개발 3
5. 실행 파일의 생성
6. 프로그램 실행
컴퓨터프로그래밍
22
C++언어의 기초
C++언어의 기초
01. 입출력
 C++ 언어의 표준 입출력 방법
o C++언어는 버퍼를 통한 표준 입출력을 cout, cin을 이용해서 수행함.
o 전역 객체로 정의된 cout, cin을 통하여 입력출력을 직관적이고, 안전하게 수행
할 수 있도록 함.
//C
#include <stdio.h>
void main()
{
printf("Hello, world\n");
}
//C++
#include <iostream>
using namespace std;
void main()
{
cout << "Hello, world\n";
}
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!" << "\n";
printf("Hello, World!\n");
}
컴퓨터프로그래밍
24
C++언어의 기초
표준 출력
 cout
o
o
o
o
<iostream>에 선언된 표준 출력을 담당하는 전역 개체
Char 타입으로 데이터를 출력하는 ostream 클래스의 인스턴스
표준 출력장치에 연결되어 출력 업무를 수행함.
특별한 변환을 지정하지 않더라도 자동적으로 이를 변환해줌.
 cout을 이용한 표준 출력의 수행 예
#include <iostream>
using namespace std;
int main()
{
cout << "This book
const char *p = "IT
cout << "This book
cout << "This book
}
컴퓨터프로그래밍
is IT Cookbook C++ Programming!\n";
Cookbook C++ Programming! ";
is " << p << '\n';
is IT Cookbook C++ Programming" << endl;
25
표준 입력
C++언어의 기초
 cin
o 표준 입력 장치로 부터 프로그램의 내부로 데이터를 전달하는 전역개체
o Char 타입으로 데이터를 입력받는 istream 클래스의 인스턴스
o 표준 입력 장치에 연결되어 입력을 처리함.
 cin을 이용한 입력 예
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
int age;
cout << "What is your name? " << endl;
cin >> name;
cout << "How old are you? " << endl;
cin >> age;
cout
<< "Your name is " << name
<< " and you are " << age << "years old" << endl;
}
컴퓨터프로그래밍
26
C++언어의 기초
형식 지정 입출력 1
 cout, cin은 printf나 scanf와 같이 형식 지정 입출력(Formatted
Input/Output)을 지원함.
 형식지정은 헤더 <iomanip>에 정의된 조절자(Manipulator)에 의해서 이
루어짐.
 형식지정 입출력 조절자
o setw: 출력 문자열의 폭을 지정
o setprecision: 실수 출력시 유효 자리수 지정
o setioflags: 미리 정의되어 있는 플래그를 지정
 정렬지정을 위한 플래그
플래그
설명
ios_base::left
왼쪽으로 정렬
ios_base::right
오른쪽으로 정렬
ios_base::internal 기호는 왼쪽으로, 값은 오른쪽으로 정렬
컴퓨터프로그래밍
27
[예제 2-3]
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double f = 1.367;
cout << "1234567890" <<endl;
cout << setw(10) << setiosflags(ios_base::right) << setprecision(2);
cout << f <<endl;
}
컴퓨터프로그래밍
28
C++언어의 기초
형식 지정 입출력 2
 형식 지정 플래그
플래그
설명
ios_base::fixed
수치형을 실수로 표기
ios_base::scientific
지수형 표기
ios_base::showbase
수치형 표기 시 앞에 기수를 표기
ios_base::showpoint
실수형 출력 시 항상 10진수부 표기
ios_base::showpos
정수 출력 시 양수의 경우 + 부호 표기
ios_base::skipws
입력 연산 시 공백 문자 무시
ios_base::unitbuf
출력 연산마다 flush 효과
 플래그 그룹
그룹
해당 플래그
ios_base::adjustfield
ios_base::left, ios_base::right, ios_base::internal
ios_base::basefield
ios_base::oct, ios_base::dec, ios_base::hex
ios_base::floatfield
ios_base::fixed, ios_base::scientific
컴퓨터프로그래밍
29
[예제2-4]
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i;
cout << "Input Decimal Number : " ;
cin >> i;
cout << "\tDecimal: "<< setbase(10) << i << endl;
cout << "\tOctal: "<< setbase(8) << i << endl;
cout <<"\tHexa-deciaml: "<< setbase(16)<< i << endl;
cin >> resetiosflags( ios_base::basefield );
cin >> setbase(8) ;
cout << "Input Octal Number : " ;
cin >> i;
cout << "Your input number is : " << i << endl;
}
컴퓨터프로그래밍
30
C++언어의 기초
파일 입출력 1
 파일입출력을 위한 헤더: <fsstream>
o ifstream : 읽기전용으로 파일을 사용하는 경우
o ofstream : 출력 전용으로 파일을 사용하는 경우
o fstream : 입출력 양방향을 사용하는 경우
 표준 입출력(cout, cin)과 달리 직접 인스턴스를 만들어 사용해야 함.
 파일 속성을 위한 옵션
속성
설명
ate
파일을 연 직후 맨 뒤로 이동
Binary
바이너리 형식 지정
In
입력 방향 지정
Out
출력 방향 지정
Trunk
파일이 존재할 경우, 해당 스트림 내용 삭제
app
데이터를 쓸 때마다 맨 뒤로 이동
컴퓨터프로그래밍
31
[예제2-5] 파일복사
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string temp;
ifstream in_file( "input.txt" );
ofstream out_file( "output.txt" );
while( getline( in_file, temp ) )
{
out_file << temp << endl;
}
in_file.close();
out_file.close();
}
컴퓨터프로그래밍
32
파일 입출력 2
C++언어의 기초
 바이너리 파일 다루기
o 스트림에 대한 추가적인 관리가 필요하지 않음
o 바이트 단위로 파일을 접근하게 되므로 빠르게 동작함.
o 파일의 open과정에 두 번째 매개 변수를 ios_base::binary를 지정
컴퓨터프로그래밍
33
[예제2-6]바이너리 파일다루기
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string temp;
ifstream in_file( "input_bin.txt", ios_base::binary );
ofstream out_file( "output.txt", ios_base::binary );
char buf[2];
in_file.read( buf, 2 );
out_file.write( buf, 2 );
}
컴퓨터프로그래밍
34
파일 입출력 3
C++언어의 기초
 파일 처리를 위한 함수
o 파일에서의 읽기: istream& istream::read(char *s, streamsize n);
o 파일에 쓰기: ostream& ostream::write(char *, streamsize n);
o 파일에서의 위치 이동: tellg, seekg, tellp, seekp
컴퓨터프로그래밍
35
02. 문자열 처리
C++언어의 기초
 문자열의 개념
o 메모리의 연속된 공간에 저장된 문자의 나열로 끝이 널 문자인 것
컴퓨터프로그래밍
36
[예제2-7]문자열
C++언어의 기초
#include <iostream>
#include <cstring>
using namespace std;
void string_information( const char * str )
{
cout << str << endl;
cout << "Length : ";
cout << strlen(str) << endl;
}
int main()
{
char title[] = "IT Cookbook C++ Programming";
string_information( title );
// 널 문자를 임의로 삽입하여 문자열의 끝을 표시한다.
title[12] = '\0';
string_information( title );
}
컴퓨터프로그래밍
37
string 클래스
C++언어의 기초
 문자열 처리를 위한 헤더: <string>
o
o
o
o
o
여기에서 string클래스 제공
문자열을 다루는 많은 연산들을 멤버 함수로 가지고 있음
문자열 처리과정에서 발생하는 메모리 공간에 대한 관리를 자동으로 수행
C스타일 프로그램에서 지원하는 char 타입 문자에 대한 처리를 수행함.
wchar_t 문자에 대한 처리는 <wstring>을 이용함.
컴퓨터프로그래밍
38
[예제2-8]string
#include <iostream>
#include <string>
using namespace std;
void string_information( const string &str )
{
cout << str << endl;
cout << "Length : ";
cout << str.size() << endl;
}
int main()
{
string title = "IT Cookbook C++ Programming";
string_information( title );
title[3] = '\0';
string_information( title );
}
컴퓨터프로그래밍
39
C++언어의 기초
String의 선언 및 초기화
 String 클래스의 생성자
생성자
설명
string(const char *s)
char *s 포인터로 전달된 문자열을 이용해서 string을 초기화
string(size_type n,
char c)
n개의 요소를 가진 string 개체를 생성하고, c 문자로 채운다.
string()
크기가 0인 기본 string 개체를 생성한다.
string(const char *,
size_type n)
char *s 포인터가 지시된 문자열을 이용해서 최대 n번째 문자까
지만 저장되는 string객체를 생성한다.
 생성 코드 예
o
o
o
o
o
string str1;
string str2(“sample”);
string str3 = “initial”;
string str4(str3);
string str5(“sample”, 256);
컴퓨터프로그래밍
40
string의 크기와 용량 조절위한 메소드
C++언어의 기초
 크기
o string에 저장한 실제 문자의 총 개수
o size(), length()
 용량
o 메모리 재할당 과정 없이 입력될 수 있는 크기
o capacity()
 max_size()
o 시스템에서 할당 받을 수 있는 최대 문자의 개수를 알아냄
 reserve()
o 불필요한 메모리 관리를 생량하기 위한 용량의 조절
 empty()
o String 객체에 문자가 없는 경우 true를 반환함
컴퓨터프로그래밍
41
[예제2-9]string과 크기
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str( "sample string", 32 );
cout
cout
cout
cout
<<
<<
<<
<<
str.size() << endl;
str.length() << endl;
str.capacity() << endl;
str.max_size() << endl;
}
컴퓨터프로그래밍
42
문자열내의 데이터에 대한 접근
C++언어의 기초
 문자열내의 데이터에 대한 접근 방법
o 배열과 같이 첨자를 이용
o String의 멤버함수인 at()을 이용
 데이터 접근 예
string str(“sample”);
cout << str[5] << endl;
str[5] = ‘a’;
cout << str.at(5) << endl;
 data(), c_str()
o string 개체내의 데이터를 얻어옴
컴퓨터프로그래밍
43
[예제2-11]string의 실제 문자열 얻어오기
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str( "sample string" );
const size_t size_of_string = 256;
char get_by_c_str[ size_of_string ];
char get_by_data[ size_of_string ];
strcpy( get_by_c_str, str.c_str() );
strcpy( get_by_data, str.data() );
cout << get_by_c_str << endl;
cout << get_by_data << endl;
}
컴퓨터프로그래밍
44
C++언어의 기초
문자열의 대입, 추가, 교환
 문자열의 대입
string str1;
string str2;
str1 = "string";
str2 = str1;
 문자열의 할당(assign)
string str;
str = 'x';
string str1( "IT " );
string str2( "CookBook" );
str2.assign(str1);
str2.assign(str1, 0, 2);
컴퓨터프로그래밍
 문자열의 추가(append)
string str( "sample" );
str += " program";
 문자열의 교환(swap)
string str1( "IT " );
string str2( "CookBook" );
cout << str1 << str2 << endl;
str2.swap(str1);
cout << str1 << str2 << endl;
45
문자열의 삽입, 삭제, 치환
C++언어의 기초
 문자열의 삽입(insert)
string src_str( "World Programmer" );
string dst_str( "Best" );
cout << src_str.insert(6, dst_str) << endl;
 문자열의 삭제(erase)
cout << src_str.erase( 0, 6 ) << endl;
 문자열의 치환(replace)
string str( "You hate me" );
cout << str.replace( 4, 4, "love") << endl;
컴퓨터프로그래밍
46
복사 및 부분 문자열 얻기
C++언어의 기초
 복사(copy)
o copy(dest, pos, length)
o 지정한 위치 pos에서 길이 length만큼을 dest에 복사함.
string src_str( "TOKEN SHOULD BE SEPERATED" );
char dst_str[16]; S H O U L D
src_str.copy( dst_str, 7, 6 );
cout << dst_str << endl;
 부분 문자열 얻기(substr)
o substr(pos, length)
o 서브 스트링을 얻기 시작할 위치 pos와 길이를 인자로 받아 문자열을 반환한다.
string str( "Tell me somthing" );
cout << str.substr(5) << endl;
cout << str.substr(5, 2) << endl;
컴퓨터프로그래밍
47
문자열의 검색
C++언어의 기초
 find(str)
o 현재 문자열에서 인자로 전달한 string이 처음 나타나는 위치를 반환함.
 rfind()
o 문자열의 끝에서 검색을 시작한다는 점을 제외하고 find와 동일함.
컴퓨터프로그래밍
48
[예제2-12]문자열 내 검색
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str( "to be or not to be" );
cout
cout
cout
cout
cout
<<
<<
<<
<<
<<
str.find( "be" ) << endl;
str.find( "be" , 5) << endl;
str.rfind( "be" ) << endl;
str.rfind( "be" , 5) << endl;
str.rfind( "question" , 5) << endl;
}
컴퓨터프로그래밍
49