C로 접근하는 C++ 프로그래밍

Download Report

Transcript C로 접근하는 C++ 프로그래밍

고급객체지향프로그래밍
객체 지향으로 접근하는 C++ 프로그래밍
경희대학교
정연모
1. C++ 언어 개요
경희대학교
이대호
C++ 언어의 특징(1)
1. C 언어
 1970년대 개발
 이식성(portability)과 유연성(flexibility)
 절차 지향 언어(procedure oriented language)
2. C++ 언어
 객체 지향 언어(object oriented language)
 클래스(class)를 통해서 수행
 1989년 이후 ANSI와 ISO에 의해 C와 C++ 표준화
[email protected]
3
C++ 언어의 특징(2)
3. 객체 지행 프로그래밍
 캡슐화(encapsulation)
 자료와 자료를 처리하는 함수 등을 묶어서, 사용자가 내부의 구조를 알지 않고
도 사용법이나 인터페이스만을 알고 사용할 수 있도록 하는 것
 정보 은닉(information hiding)
 상속(inheritance)
 기존에 작성한 클래스를 이용하여 새로운 형식의 클래스를 파생하는 것
 다형성(polymorphism)
 같은 이름으로 상황에 따라서 다른 방법으로 동작하는 것
 동적 바인딩(dynamic binding)으로 실행 시간에 객체의 특성에 따라서 다른 동
작을 처리
[email protected]
4
프로그램 개발 환경(1)
1. 명령행 컴파일러(command line compiler)
 사용자의 명령어에 의해 실행 코드로 변환
2. 통합 개발 환경(IDE, integrated development environment)
 편집기, 컴파일러, 링커와 디버거(debugger) 등을 모두 포함한 프로그램
 Visual Studio 6.0, Visual Studio 2005 등
3. Visual Studio
 최신의 서비스 팩(service pack)과 MSDN 라이브러리(Microsoft Developer
Network Library)를 설치할 것을 권장
[email protected]
5
프로그램 개발 환경(2)
[email protected]
6
프로그램 개발 환경(3)
4. Visual Studio 6.0으로 프로그램 작성
 프로젝트(project) 구성
 한 개의 프로그램에서 여러 개의 원시 파일들과 기타 관련 자원들을 관리
 프로젝트 생성
 [File]-[New]
[email protected]
7
프로그램 개발 환경(4)
[email protected]
8
프로그램 개발 환경(5)
 프로젝트에 원시 파일 추가
 [File]-[New]
 컴파일과 실행
 [Build]-[Build xxx.exe] (xxx는 프로젝트 이름)
[email protected]
9
프로그램 개발 환경(6)
5. Visual Studio 2005으로 프로그램 작성
 프로젝트는 솔루션(solution)으로 관리
 프로젝트 생성
 [파일]-[새로 만들기]-[프로젝트]
[email protected]
10
프로그램 개발 환경(7)
 프로젝트에 원시 파일 추가
 [프로젝트]-[새 항목 추가]
 컴파일과 실행
 [디버그]-[디버깅하지 않고 시작]
[email protected]
11
프로그램 개발 환경(8)
6. 빌드(build)
 컴파일  링킹  실행 파일 생성
 컴파일 과정에서 오류(error)와 경고(warning)를 출력, 만일 오류가 있으면
링킹할 수 없음
 링킹 과정에서 오류와 경고를 출력, 만일 오류가 있으면 실행 파일을 생성
할 수 없음
 컴파일은 위에서 아래로 진행하므로 항상 상위에서 발생한 오류를 먼저 수
정
 오류와 경고는 반드시 읽어보고 수정하는 습관이 필요
[email protected]
12
C++ 프로그램 구조(1)
1. C++ 프로그램의 일반적인 형식
 주석(comment)
 컴파일 되지 않는 설명
 전처리기(preprocessor)
 #으로 시작
 컴파일하기 전에 먼저 동작
 전역 선언(global declaration)
 프로그램의 모든 영역에서 사용 가
능한 것을 선언
 main 함수
 반드시 한 개 필요한 함수
 사용자 정의 함수(user-defined
function)
 사용자가 작성한 함수
[email protected]
13
C++ 프로그램 구조(2)
2. main 함수
 프로그램을 실행하면 자동으로 호출(call, 불려서 실행됨)되는 함수
 int main()
 반환(return, 함수가 종료하고 돌려줌)이 정수(int)
 함수 이름이 main
 ( ) : 매개변수(parameter)가 없음
 {…}
 함수의 몸체(body), 함수의 동작을 작성
 return 0;
 함수가 종료되면 0을 반환
[email protected]
14
C++ 프로그램 구조(3)
3. 아무런 처리도 하지 않는 프로그램
// 아무런 처리도 하지 않는 프로그램
int main() {
return 0;
}
4. 주석
 블록 주석(block comment)
 /*로 시작해서 */로 끝남
 줄 주석(line comment)
 //로 시작해서 작성
[email protected]
15
C++ 프로그램 구조(4)
5. #include 전처리기
 전처리기: 컴파일하기 전에 동작
 include: 컴파일하기 전에 지정된 파일(헤더 파일)을 원시 코드에 포함
[email protected]
16
C++ 프로그램 구조(5)
// C 헤더 파일
<stdlib.h> <ctype.h>
<math.h> <string.h> <stdio.h> ...
// 표준화된 C++의 헤더 파일
<cstdlib> <cctype> <cmath>
[email protected]
<cstring>
17
<cstdio> ...
C++ 프로그램 구조(6)
6. 식별어(identifier)
 사용자가 필요에 따라서 선언한 것으로 다른 것과 구분할 수 있는 이름
 변수, 상수, 함수, 클래스, 구조체 등의 이름
 식별어의 조건




asm
const
double
extern
int
private
return
switch
typename
volatile
영문자(A-Z, a-z), 숫자(0-9), 밑줄(_)로 구성
영문자는 대소문자를 구분
식별어의 첫 자는 영문자 또는 밑줄
예약어는 사용할 수 없음
auto
bool
break
case
catch
char
class
const_cast
continue
default delete
do
dynamic_cast
else
enum
explicit
export
false
float
for
friend goto
if
inline
long
mutable namespace
new
operator
protected
public
register
reinterpret_cast
short
signed sizeof
static static_cast
struct
template
throw
true
try
typedef typeid
union
unsigned
using
virtual void
wchar_t while
[email protected]
18
자료형(1)
1. 상수(constant)
 수행되기 전에 자료의 값을 미리 정하여 수행 도중에 값이 변하지 않는 숫
자나 문자(문자열)
 리터럴(literal)
 수식에서 표현된 숫자나 문자 그 자체
 정의된 상수(defined constant)
 #define로 지정
 메모리 상수(memory constant)
 변수를 상수형으로 지정
#define PI 3.141592
// 정의된 상수
int main() {
const double Pi = 3.141592; // 메모리 상수
cout << PI*5*5 << endl;
cout << Pi*5*5 << endl;
}
// 5 – 리터럴
return 0;
[email protected]
19
자료형(2)
2. 정의된 상수
 컴파일하기 전에 상수이름을 사용한 곳이 상수값으로 수정
#define PI = 3.141592
int main() {
double area;
area = PI*5*5;
return 0;
}
#define PI
}
3.141592;
int main() {
double area;
area = PI*5*5;
return 0;
}
[email protected]
전처리
→
전처리
→
20
}
int main() {
double area;
area = = 3.141592*5*5;
return 0;
int main() {
double area;
area = 3.141592;*5*5;
return 0;
자료형(3)
3. 변수(variable)
 프로그램 수행 도중에 값이 변할 수 있는 자료
 변수를 위해 미리 정해 놓은 자료형은 변하지 않음
 선언 시에 반드시 그 자료형을 지정
4. C++의 자료형
[email protected]
21
자료형(4)
5. 변수의 선언(declaration)
6. 자료형의 종류와 지정어
종류
빈형
불형
기본 지정어
void
bool
문자형
char
정수형
int
부동 소수점형
float,
double
[email protected]
선언에 사용되는 지정어
void
bool
char
unsigned char: 부호 없는 char
int: 정수(16비트 또는 32비트)
short (int): 16비트 정수
unsigned (int): 부호 없는 int
unsigned short: 부호 없는 16비트 정수
long (int): 32비트 정수
unsigned long: 부호 없는 32비트 정수
float: 단정도 부동 소수점형(32비트)
double: 배정도 부동 소수점형(64비트)
long double: 10byte 부동 소수점형
22
자료형(5)
7. 메모리 상수
8. 참조 변수
[email protected]
23
자료형(6)
9. 대입(assignment)
 =: 대입 연산자(assignment operator)
int a, b, c;
// 변수 선언
a = 10;
b = a + 10;
c = a + b;
// 대입
// 대입
// 대입
int d = 50;
// 선언과 초기화
int a, b;
// 변수 선언
a = b = 3;
// a = (b = c);와 동일
[email protected]
24
자료형(7)
10. 연산과 자료형 변환
 묵시적 형변환(implicit type conversion)
 명시적 형변환(explicit type conversion)
 C 형식의 형변환
[email protected]
25
자료형(8)
 C++의 형변환
이름
static_cast
reinterpret_cast
dynamic_cast
const_cast
설명
컴파일 시간에 형변환
서로 관련이 없는 형 사이의 변환
(서로 다른 포인터나, 포인터와 정수 사이)
실행 시간에 형변환
const를 없애는 형변환
// 3에 대한 형변환
(double)3/2
static_cast<double>(3)/2
[email protected]
// C 형식의 형변환
// static cast
26
자료형(9)
11. 표준 입/출력 스트림
이름
설명
cout
표준 출력
cerr
표준 오류 출력(버퍼 사용하지 않음)
clog
표준 오류 출력(버퍼 사용)
cin
표준 입력
11. 표준 출력 스트림
 cout 객체와 삽입 연산자(insertion operator, <<)에 의해 수행
cout << 100;
cout << 10+2;
cout << (10.5+3.5)/2.5;
cout << 100 << 10+2 <<(10.5+3.5)/2.5;
[email protected]
27
자료형(10)
13. 표준 입력 스트림
 cin 객체와 추출 연산자(extraction operator, >>)에 의해 수행
int x, y;
cin >> x >> y;
[email protected]
28
연산자(1)
1. 연산자의 종류와 기능
 연산자(operator)
 피연산자에 대한 덧셈, 뺄셈 등의 연산을 표시하는 기호
 피연산자(operand)
 연산이 수행되는 대상
[email protected]
29
연산자(2)
종류
기능
예
산술 연산자(arithmetic operator)
산술적인 연산을 수행
+, -, *, /, %
증감 연산자
(increment/decrement operator)
1 증가/감소 연산을
수행
++, --
관계 연산자(relational operator)
대소 관계를 비교
<, >, <=, >=
동등 연산자(equality operator)
동등 관계를 비교
==, !=
논리적인 연산을 수행
&&, ||, !
대입을 수행
=, +=, -=, *=,
/=, …
비트 단위의 연산을 수행
&, |,
<<, >>
조건적으로 수행
?:
논리 연산자(logical operator)
대입 연산자
(assignment operator)
비트 연산자(bitwise operator)
조건 연산자(conditional operator)
^,
,(콤마), sizeof,
cast, *, &, …
기타 연산자
[email protected]
~,
30
연산자(3)
 산술 연산자
종류
형식
+
A+B
A와 B를 더함
-
A-B
A를 B로 뺌
*
A*B
A와 B를 곱함
/
A/B
A를 B로 나눔
%
A%B
A를 B로 나눈 나머지
종류
형식
+
+A
A에 양수를 취함
-
-A
A에 음수를 취함
[email protected]
의미
의미
31
연산자(4)
 증감 연산자
종류
형식
의미
++
++a, a++
a를 1 증가
--
--a, a--
a를 1 감소
 관계 연산자
종류
형식
<
A<B
<=
A<=B
>
A>B
>=
A>=B
의미
A가 B보다 작은가?
A가 B보다 작거나 같은가?
A가 B보다 큰가?
A가 B보다 크거나 같은가?
 동등 연산자
종류
형식
==
A==B
A와 B가 같은가?
!=
A!=B
A와 B가 같지 않은가(다른가)?
[email protected]
의미
32
연산자(5)
 논리 연산자
종류
형식
의미
&&
A&&B
A와 B의 논리곱
||
A||B
A와 B의 논리합
!
!A
A의 부정
A
B
A && B
A || B
!A
거짓
거짓
거짓
거짓
참
거짓
참
거짓
참
참
참
거짓
거짓
참
거짓
참
참
참
참
거짓
[email protected]
33
연산자(6)
 대입 연산자
종류
=
형식
A=B
B를 A에 대입
+=
A+=B
A = A + (B)
-=
A-=B
A = A – (B)
*=
A*=B
A = A * (B)
/=
A/=B
A = A / (B)
%=
A%=B
A = A % (B)
<<=
A<<=B
A = A << (B)
>>=
A>>=B
A = A >> (B)
&=
A&=B
A = A & (B)
^=
A^=B
A = A ^ (B)
|=
A|=B
A = A | (B)
[email protected]
의미
34
연산자(7)
 비트 연산자
종류
형식
~
~A
&
A&B
A와 B의 비트 단위 논리곱(bitwise and)
|
A|B
A와 B의 비트 단위 논리합(bitwise or)
^
A^B
A와 B의 비트 단위 배타적 논리합(bitwise exclusive
or)
<<
A<<B
A를 B 비트만큼 좌로 이동(left shift)
>>
A>>B
A를 B 비트만큼 우로 이동(right shift)
[email protected]
의미
비트 단위 보수(10, 01),
비트 단위 부정(bitwise not)
35
연산자(8)
 조건 연산자
종류
형식
? :
A?B:C
의미
A가 참이면 B이고 거짓이면 C
 기타 연산자
연산자
형식
,
A, B
sizeof
sizeof(A)
&
&A
[email protected]
의미
콤마 연산자, A를 수행하고 B를 수행
A가 기억 장치에 저장되는 크기(byte 단위)
A가 기억 장치에 저장된 주소
36
제어문(1)
1. 문장과 제어문
 문장(statement)
 ;으로 구분된 명령어 코드
 제어문(control statement)





[email protected]
처리를 구분하거나 반복적인 수행 또는 분기
선택문(selection statement)
반복문(repetition statement)
분기문(branch statement)
제어문에서 조건에 의해 수행되는 문장은 기본적으로 하나의 문장
만일 여러 문장을 동시에 수행하는 경우에는 {}로 묶어 복합 문장(compound
statement)으로 작성
37
제어문(2)
2. if문
[email protected]
38
제어문(3)
3. switch문
[email protected]
39
제어문(4)
switch(n) {
case 1:
x = 1;
// 문장(1)
break;
// switch를 벗어남
case 2:
x = 2;
// 문장(2)
break;
// switch를 벗어남
default:
x = 3;
// 문장(3)
}
switch(n) {
case 1:
case 3:
x = 1;
// n 이 1이거나 3이면
break;
// switch를 벗어남
case 2:
case 4:
x = 2;
// n 이 2거나 4이면
break;
// switch를 벗어남
default:
x = 3;
}
[email protected]
40
제어문(5)
4. 선택문과 반복문
[email protected]
41
제어문(6)
5. while문
6. for문
7. do…while문
[email protected]
42
제어문(7)
8. break문
 반복문이나 switch문을 강제로 벗어남
9. continue문
 아래의 반복되는 문장을 처리하지 않고 다시 반복을 수행하게 하는 분기문
[email protected]
43
제어문(8)
10. goto문
 사용자가 지정한 레이블의 위치로 분기
 레이블은 프로그램의 특정 위치를 지정한 식별어
[email protected]
44
함수(1)
1. 함수(function)
 main 함수
 표준 라이브러리 함수(standard library function)
 사용자 정의 함수(user-defined function)
2. 함수의 형식
 인수(argument): 함수의 매개변수에 전달되는 값
 매개변수(parameter): 인수를 받는 값
 반환형: 함수가 종료될 때 전달되는 값의 자료형
[email protected]
45
함수(2)
3. 함수의 정의
[email protected]
46
함수(3)
4. 매개변수와 반환값이 없는 함수
 매개변수가 없으므로 인수 없이 호출
 반환값이 없으므로 함수 이름 앞에 void를 지정
void InputMsg() {
// 매개변수 없음, 반환 없음
cout << "Input integer: ";
}
[email protected]
47
함수(4)
5. 매개변수는 있으나 반환값이 없는 함수
 매개변수를 가지고 있으므로 인수에 따라서 다른 동작을 처리
 반환값으로 결과를 가져오지 못하므로 매개변수에 의한 단순한 처리(출력
등)를 수행하는 함수로 주로 사용
void PrintResult(int y) { // int형 매개변수, 반환 없음
cout << "y: " << y << endl;
}
[email protected]
48
함수(5)
6. 매개변수는 없으나 반환값이 있는 함수
 매개변수가 없으므로 함수에서 수행되는 처리는 동일
 반환값으로 결과를 가져옴
int Input() {
int x;
cin >> x;
// 매개변수 없음, int 반환
return x;
}
[email protected]
49
함수(6)
7. 매개변수와 반환값이 있는 함수
 일반적인 형식의 함수
int Fn(int x) {
// int형 매개변수, int 반환
return 2*x*x + 3*x + 5;
}
[email protected]
50
함수(7)
8. 함수의 호출
 호출(call)
 “함수명()”로 작성
 피호출 함수(called function, callee function)가 호출되고 수행이 끝나면 다시
제어가 호출 함수(calling function, caller function)로 돌아옴
void Fn1() {
// 반환(return) 값이 없음
…
}
int Fn2() {
// 반환(return) 값이 있음
…
return x;
}
int Fn3() {
Fn1();
// 독립된 수식으로 호출
Fn2();
// 독립된 수식으로 호출
int y = Fn2();
// 수식 안에서 호출
cout << 2*Fn2() + 5 << endl; // 수식 안에서 호출
}
[email protected]
51
함수(8)
int Fn3() {
Fn1(); // 선언 없음 – 오류
Fn2(); // 선언 없음 – 오류
int y = Fn2();
cout << 2*Fn2() + 5 << endl;
}
void Fn1() {
…
}
int Fn2() {
…
return x;
}
[email protected]
52
함수(9)
[email protected]
53
함수(10)
9. 함수의 중복정의(overloading)
 동일한 함수의 이름으로 매개변수를 다르게 정의
void Fn(int x) {
…
}
void Fn(double x) {
…
}
void Fn() {
…
}
[email protected]
// Fn 함수의 중복정의
// Fn 함수의 중복정의
54
함수(11)
10. 함수의 기본 인수(default argument)
 인수를 지정하지 않고 호출할 때 적용되는 값
void Fn(int x, int y = 10) { // 기본 인수 지정
…
}
void Fn(int x, int y = 10) { // 기본 인수 지정
…
}
void Fn(int x) {
// 함수의 중복 정의
…
}
void Fn2() {
Fn(10);
// 호출 함수 지정이 모호해짐 - 오류
}
[email protected]
55
함수(12)
11. 값에 의한 호출(call by value)
// 값에 의한 호출
#include <iostream>
using namespace std;
void Swap(int x, int y) {
// x와 y를 변경
int temp = x;
x = y;
y = temp;
}
int main() {
int x = 10, y = 20;
Swap(x, y);
// Swap 호출
cout << x << '\t' << y << endl;
// x, y 출력
return 0;
}
[email protected]
56
함수(13)
12. 참조에 의한 호출(call by reference)
// 참조에 의한 호출
#include <iostream>
using namespace std;
void Swap(int &x, int &y) {
// x와 y를 변경
int temp = x;
x = y;
y = temp;
}
int main() {
int x = 10, y = 20;
Swap(x, y);
// Swap 호출
cout << x << '\t' << y << endl;
// x, y 출력
return 0;
}
[email protected]
57
함수(14)
13. 표준 라이브러리 함수
 수학 관련 함수
 cmath 헤더 파일에 함수의 원형이 선언
int abs(int n);
double fabs(double x);
double sin(double x);
double cos(double x);
double tan(double x);
double exp(double x);
double log(double x);
double log10(double x);
double pow(double x, double
double sqrt(double x);
[email protected]
58
// n(정수)의 절대값
// x(실수)의 절대값
// x의 sine
// x의 cosine
// x의 tangent
// ex, e의 x 거듭 제곱
// log x, 자연 로그 x
// log10 x, 상용 로그 x
y); // xy, x의 y 거듭 제곱
// x의 루트
함수(15)
 문자 관련 함수
 cctype 헤더 파일에 함수의 원형이 선언
int isalpha(int c);
// 알파벳인지 판별, 'A'-'Z',
// 'a'-'z‘
int isdigit(int c);
// 숫자인지 판별, '0'–'9‘
int toupper(int c);
int tolower(int c);
// 대문자로 변경
// 소문자로 변경
[email protected]
59
함수(16)
 기타 자주 사용되는 표준 라이브러리 함수
 rand/srand 함수
– 난수 발생 관련 함수
– cstdlib 헤더 파일에 함수의 원형이 선언
int rand();
// 0에서 RAND_MAX의 임의의 정수를 반환
void srand(unsigned int seed); // rand()의 초기값 설정
 exit/abort 함수
 프로그램 종료
 cstdlib 헤더 파일에 함수의 원형이 선언
void exit(int status);
void abort();
[email protected]
60
함수(17)
14. 재귀 함수(recursive function)
 직접적이나 간접적으로 그 자신을 호출하는 함수
 n!의 예
0!  1
n !  n(n  1)(n  2)
0!  1
2 1
n !  n(n  1)!
int Fact2(int n) {
if(n <= 1) return 1;
else
return n*Fact2(n-1);
}
[email protected]
// n이 0 또는 1
// 재귀 호출
61
배열(1)
1. 배열의 선언
 선언에서 크기는 상수형 양의 정수
2. 배열의 요소(element)
 배열의 선언에서 만들어진
낱개의 변수
 첨자 연산자(subscript operator, [])
로 접근
int ary[10] ;
int i;
// 배열 선언
for(i = 0 ; i < 10 ; i++)
cin >> ary[i]; // i번 배열 요소를 키보드로 입력(0-9)
[email protected]
62
배열(2)
3. 배열 초기화
int ary1[5] = {10, 20, 30, 40, 50}; // 초기화
int ary2[] = {15, 25, 35};
// 초기화 int ary2[3];으로 지정
int ary3[5] = {0};
// 초기화 {0, 0, 0, 0, 0}
[email protected]
63
배열(3)
4. 배열과 함수
 배열의 요소를 함수의 인수로 전달
 일반 변수와 동일
 배열 전체를 전달
 배열의 이름을 인수로 전달  주소에 의한 호출
 함수의 매개변수가 가리키는 배열의 요소는 인수로 사용된 배열의 요소와 동일
[email protected]
64
배열(4)
5. 문자열(string)
 문자형 배열
 가변 길이 문자열: 문자열의 마지막에 구분 문자 사용
char str[15] = "Programming";
str[0] = 'p';
// "programming" 으로 수정
str[7] = '\0';
// ('\0' = NULL, = 0), "program" 으로 수정
str = "C++";
// 사용 불가
[email protected]
65
배열(6)
 문자열 처리 함수
함수
기능
size_t strlen(const char *str)
str 문자열의 길이를 반환
char *strcpy(char *toStr,
const char *fromStr)
fromStr 문자열을 toStr에 복사
char *strncpy(cahr *toStr,
const char *fromStr, size_t size)
fromStr 문자열을 size 길이만큼 toStr에 복
사
int strcmp(const char *str1,
const char *str2)
str1 문자열과 str2 문자열을 비교
int strcnmp(const char *str1,
const char *str2, size_t size)
str1 문자열과 str2 문자열을 size 길이만큼
비교
char *strcat(char *str1,
const char *str2)
str2 문자열을 str1 문자열 뒤에 추가
char *strncat(char *str1,
const *char str2, size_t size)
str2 문자열의 size개의 문자를 str1 문자열
뒤에 추가
char *strchr(const char *str, int ch)
str 문자열에 ch 문자가 있는 처음 위치의 주소
[email protected]
66
배열(7)
6. 광폭 문자(wide character)
 2바이트(unsigned char)형 자료로 한 개의 문자를 표현
 wchar_t형
7. 2차원 배열
 1차원 배열의 배열
 선언에서 크기1인 1차원 배열이 크기2개 만큼 생성
8. 3차원 배열
 1차원 배열의 배열인 2차원 배열을 배열로 가지는 배열
[email protected]
67
배열(8)
// 3 크기를 가지는 1차원 배열이 2개
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int matrix[2][3] = {1, 2, 3, 4, 5, 6}; // {{1, 2, 3}, {4, 5, 6}}
[email protected]
68
포인터(1)
1. 포인터(pointer)
 변수의 주소를 저장하는 자료
[email protected]
69
포인터(2)
2. 간접 연산자(indirect operator)
 역참조 연산자(dereference operator), *
 포인터 변수에 저장된 주소의 자료
[email protected]
70
포인터(3)
3. 주소에 의한 호출(call by address)
 함수의 매개변수가 주소를 저장할 수 있는 포인터 변수
void Fn(int *p);
…
void Fn2(…)
{
int x;
…
Fn(&x);
…
}
[email protected]
// 호출되는 함수 – 포인터를 매개변수로 사용
// 주소에 의한 호출
71
포인터(4)
4. 배열과 포인터
double ary[10];
double *p1 = ary;
double *p2 = &ary[0];
// 배열의 시작 주소를 포인터에 저장
// 배열의 시작 주소를 포인터에 저장
short int x[3] = {10, 20, 30};
short int *p = &x;
cout << *p << endl;
cout << *(p+1) << endl;
cout << *(p+2) << endl;
[email protected]
// x[0], p[0]
// x[1], p[1]
// x[2], p[2]
72
포인터(5)
5. 이중 포인터(double pointer)
 포인터의 포인터, 포인터 변수의 주소를 저장
int x;
int *p = &x;
int **pp = &p;
cout << *p << endl;
cout << *pp << endl;
cout << **pp << endl;
[email protected]
// x
// p
// *p, x
73
포인터(6)
6. 포인터 배열(array of pointer)
 포인터가 요소인 배열
int *ary[10];
// 10개의 int *를 요소로 가지는 배열
// ary[0]는 int *자료의 첫 번째 요소
// ary[1]는 int *자료의 두 번째 요소
…
// ary[9]는 int *자료의 마지막 요소
[email protected]
74
포인터(7)
7. 배열 포인터(pointer to array)
 배열의 주소를 저장하는 포인터
int (*p)[10];
int ary[4][10];
// int[10]의 배열을 가리키는 포인터를 저장하는 변수
p = ary;
// ary의 시작 주소를 저장
// *p는 ary[0]의 1차원 배열을 가리킴
// *(p+1)은 ary[1]의 1차원 배열을 가리킴, p[1]과 동일
cout << (*p)[5] << endl;
// ary[0][5]
cout << (*(p+2))[3] << endl; // ary[2][3]
[email protected]
75
포인터(8)
int (*p)[10];
int ary[10];
// int[10]의 배열을 가리키는 포인터를 저장하는 변수
p = &ary;
// ary의 주소를 저장
// *p는 ary를 가리킴
cout << (*p)[5] << endl;
// ary[5]
int RowSum(int ary1D[], int size)
// int RowSum(int *ary1D, int size)
int TotalSum(int ary2D[][5], int size)
// int TotalSum(int (*ary2D)[5], int size)
[email protected]
76
포인터(9)
8. 함수 포인터(function pointer)
 함수를 가리키는 포인터
int Fn(int x, double y);
int (*fp)(int, double) = Fn;
fp(x, y); //
[email protected]
Fn(x, y);와 동일
77
포인터(10)
9. new 연산자
 동적 메모리 할당(dynamic memory allocation)
 실행 시간에 메모리 할당(변수 생성)
 메모리 할당이 실패하면 NULL 반환(Visual Studio 6.0)하거나 예외 전달
(Visual Studio 2005)
 Visual Studio 2005에서 메모리 할당이 실패하면 NULL 반환
new(nothrow) 자료형[크기];
new(nothrow) 자료형;
[email protected]
78
포인터(11)
10. delete 연산자
 new에 의해 할당된 영역은 지역 변수와 다르게 함수가 종료되더라도 해제
되지 않음
 new에 의해 할당된 메모리 공간을 해제
[email protected]
79
이름공간
#include <iostream>
using namespace std;
namespace A {
int data;
}
namespace B {
int data;
}
int main() {
A::data = 1; // A 이름공간의 전역 변수 data
B::data = 2; // B 이름공간의 전역 변수 data
cout << A::data << endl;
cout << B::data << endl;
return 0;
}
[email protected]
80
예외 처리(1)
bool FileOpen() {
ifstream fs;
try {
fs.open("ex.txt");
if(!fs) throw false;
}
catch(bool &ex) {
return false;
}
// 파일 처리
return true;
}
[email protected]
81
예외 처리(2)
void FileOpen() {
ifstream fs;
fs.open("ex.txt");
if(!fs) throw false;
// 파일 처리
}
try {
FileOpen();
}
catch(bool &ex)
{
// 파일 열기 실패 예외 처리
}
[email protected]
82
예외 처리(3)
[email protected]
83
고급 입출력(1)
[email protected]
84
고급 입출력(2)
1. 파일 열기
#include <fstream>
using namespace std;
…
ifstream ifs;
ifs.open("파일이름");
…
ifs.close();
[email protected]
//
//
//
//
객체
파일
파일
파일
생성
열기
입력 작업
닫기
85
고급 입출력(3)
2. 파일 열기 설정
 open의 두 번째 인수로 지정
플래그
기능
ios::in
읽기 모드
ios::out
쓰기 모드
ios::ate
위치를 파일 끝으로 이동(at end)
ios::app
파일의 마지막에 추가 기록(append)
ios::trunc
ios::nocreate
ios::noreplace
ios::binary
파일이 있으면 지우고 다시 생성(truncate)
다시 생성하지 않음(파일이 존재하지 않으면 열기 실패)
파일을 대체하지 않음(파일이 존재하면 열기 실패)
이진 파일 모드
ifstream ifs("파일이름");
…
ifs.close();
[email protected]
// 객체 생성, 파일 열기
// 파일 입력
// 파일 닫기
86
고급 입출력(4)
3. 텍스트 파일과 이진 파일
 텍스트 파일(text file)
 모든 자료를 문자형으로 변환하여 저장한 파일
 이진 파일(binary file)
 자료를 메모리에 저장된 형식 그대로 저장하나 파일
[email protected]
87
고급 입출력(5)
4. 텍스트 파일 입출력
#include <fstream>
using namespace std;
…
int x;
ifstream ifs;
ifs.open("파일이름");
ifs >> x;
ifs.close();
//
//
//
//
객체 생성
파일 열기
x를 텍스트 방식으로 읽어 오기
파일 닫기
ofstream ofs;
ofs.open("파일이름");
ofs << x << '\t' << "C++";
ofs.close();
//
//
//
//
객체 생성
파일 열기
x, '\t', "C++"를 텍스트 방식으로 쓰기
파일 닫기
…
[email protected]
88
고급 입출력(6)
5. 이진 파일 출력
6. 입출력 조작자
이름
설명(범위)
dec
십진수로 출력(계속)
oct
8진수로 출력(계속)
hex
16진수로 출력(계속)
fixed
scientific
[email protected]
고정 소수점 형식으로 출력(계속)
부동 소수점 형식(지수형)으로 출력(계속)
89
고급 입출력(7)
이름
showpoint
showpos
showbase
setw(n)
setprecision(n)
setfill(ch)
left
right
internal
boolalpha
flush
[email protected]
설명(범위)
소수점 표시(계속)
양수에 대해서 + 기호 표시(계속)
진법을 표시(계속)
출력 폭 지정(한 번), n은 정수
유효 자리 수 지정(계속), n은 정수
빈자리 채움(계속), ch는 문자형
왼쪽 정렬(계속)
오른쪽 정렬(계속)
부호/진법과 숫치를 양쪽 정렬(계속)
불형 자료를 bool/false로 출력(계속)
버퍼의 내용을 출력(한 번)
90
고급 입출력(8)
7. 입출력 멤버 함수
플래그
setf
입출력 형식의 플래그 설정
unsetf
입출력 형식의 플래그 해제
width
출력 폭 지정
fill
빈자리 채움
precision
유효 자리 수 지정
get
문자형 자료 입력
put
문자형 자료 출력
good
eof
fail
bad
[email protected]
기능
오류 비트 없음
파일의 끝(end of file)에 도달
입출력 오류(EOF 제외) 있음
심각한 입출력 오류 있음
91
고급 입출력(9)
플래그
기능
tellg
입력 스트림 위치 추출
tellp
출력 스트림 위치 추출
seekg
입력 스트림 위치 지정
seekp
출력 스트림 위치 지정
clear
오류 비트 삭제
ignore
버퍼 내용 삭제
 setf, unsetf
[email protected]
92
고급 입출력(10)
플래그
ios::skipws
ios::left
ios::right
ios::internal
기능
마스크
입력에서 백색 공백(white space) 무시
왼쪽 정렬
ios::adjustfield
오른쪽 정렬
ios::adjustfield
부호나 기수를 왼쪽에 자료는 오른쪽 정렬
ios::adjustfield
ios::dec
십진수 출력
ios::basefield
ios::oct
8진수 출력
ios::basefield
ios::hex
16진수 출력
ios::basefield
ios::showbase
기수 표시
ios::showpoint
소수점 표시
ios::uppercase
16진수의 A∼F를 대문자 출력
ios::showpos
ios::scientifi
c
ios::fixed
ios::unitbuf
ios::stdio
[email protected]
양수에 대해서 + 기호 표시
부동 소수점 형식(지수형)으로 출력
ios::floatfield
고정 소수점 형식으로 출력
ios::floatfield
삽입 후 스트림의 버퍼 출력
삽입 후 stdout과 stderr의 버퍼 출력
93
고급 입출력(11)
 width, fill, precision
 get, put
[email protected]
94
고급 입출력(12)
 good, eof, fail, bad
 tellg, tellp, seekg, seekp
[email protected]
95
고급 입출력(13)
 clear, ignore
#include <iostream>
using namespace std;
int main() {
int num;
cout << "Input: ";
while(!(cin >> num))
cout << "Input: ";
cout << num;
return 0;
}
[email protected]
96
고급 입출력(14)
…
#include <limits>
…
int main() {
int num;
char aCh;
cout << "Input: ";
while(!(cin >> num)) {
cin.clear();
while(cin.get(aCh) && aCh != '\n');
// 윗 줄과 동일 기능
// cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Input: ";
}
cout << num;
…
}
[email protected]
97
프로그래밍 연습(1)
1. 2차 방정식의 실근을 계산
// 2차 방정식의 근을 구하는 함수
#include <iostream>
#include <cmath>
using namespace std;
bool Root(double a, double b, double c, double &x1, double &x2) {
double D = b*b - 4.*a*c; // 판별식
if(D < 0) return 0;
// 허근
x1 = (-b+sqrt(D))/(2*a);
x2 = (-b-sqrt(D))/(2*a);
// 두 실근
return true;
// 실근 가짐
}
int main (){
double a, b, c, x1, x2;
cin >> a >> b >> c;
// 계수 입력
if(Root(a, b, c, x1, x2)) // 실근을 가지면 출력
cout << x1 << '\t' << x2 << endl;
return 0;
}
[email protected]
98
프로그래밍 연습(2)
2. 마방진
① 첫 번째 수 1은 첫 행 가운데 열(0행 n/2열)에 삽입한다.
② 행과 열을 모두 1씩 감소하면서 대각선 방향으로 진행한다.
③ 만일 행의 위치가 음수라면 마지막 행으로 옮긴다.
④ 만일 열의 위치가 음수라면 마지막 열로 옮긴다.
⑤ 옮겨진 위치에 이전의 수가 저장되어 있다면 대각선 방향으로 진행하기 전
(②의 동작을 수행하기 전)의 위치에서 행만 1 증가한 위치로 수정한다.
⑥ 지정된 위치에 다음 수를 삽입하고, n×n이 삽입될 때까지 ②번으로 돌아
가서 반복한다.
[email protected]
99
프로그래밍 연습(3)
[email protected]
100
프로그래밍 연습(4)
// 마방진
#include <iostream>
#include <iomanip>
using namespace std;
#define MAX_SIZE 9
int main() {
int i;
int size;
// 마방진 크기
int x, y;
// x, y 좌표(우-x증가, 하-y증가)
// x, y 좌표 저장 - 이동 위치에 다른 값이 채워진 경우에
// 이동 전의 좌표 아래 위치로 옮기기 위하여 이동 전의 좌표 저장
int saveX, saveY;
int magic[MAX_SIZE][MAX_SIZE];
cout << "Size: ";
cin >> size;
// 마방진 크기 입력
// 크기가 짝수 또는 3보다 작거나 MAX_SIZE보다 크면 종료
if(size%2 == 0 || size < 3 || size > MAX_SIZE)
return 0;
[email protected]
101
code 1/3
프로그래밍 연습(5)
// 0으로 초기화
for(y = 0 ; y < size ; y++)
for(x = 0 ; x < size ; x++)
magic[y][x] = 0;
saveX = size/2;
saveY = 0; // 초기 위치 결정 - 1행 가운데 열
magic[saveY][saveX] = 1;
for(i = 2 ; i <= size*size ; i++) {
// 좌, 상 위치
x = saveX-1;
y = saveY-1;
// 좌표가 음수이면 최대값으로
if(x < 0) x = size-1;
if(y < 0) y = size-1;
// 다른 값이 채워져 있으면 이동 전의 좌표의 아래로
if(magic[y][x] != 0) {
x = saveX;
y = saveY+1;
}
// count 값 할당
magic[y][x] = i;
// 좌표 저장
saveX = x;
saveY = y;
}
[email protected]
102
code 2/3
프로그래밍 연습(6)
// 출력
for(y = 0 ; y < size ; y++)
{
for(x = 0 ; x < size ; x++)
cout << setw(4) << magic[y][x];
cout << endl;
}
return 0;
}
[email protected]
103
code 3/3
프로그래밍 연습(7)
3. 스택(Stack)
 먼저 입력된 자료가 가장 나중에 출력되는 자료 구조(FILO: First In Last
Out)
[email protected]
104
프로그래밍 연습(8)
 스택에서 필요한 자료
 자료들을 저장할 배열(자료형에 따라서 변경)
 현재 저장된 위치를 알려줄 포인터(int)
 정수형 자료를 저장할 스택
– int data[100];
– int stackPointer;
 두 개의 자료가 하나의 묶음으로 표현되어야 하므로 구조체 사용
#define MAX 10
struct Stack {
int data[MAX];
int stackPointer;
};
[email protected]
105
프로그래밍 연습(9)
 스택의 동작을 관리할 함수
 스택을 초기화
 InitStack
– stackPointer  -1
 스택에 자료 추가
 Push
– 추가할 수 있는가?
– stackPointer  stackPointer + 1
– 자료 추가
 스택에서 자료 추출
 Pop
– 추출할 자료가 있는가?
– 자료 추출
– stackPointer  stackPointer - 1
[email protected]
106
프로그래밍 연습(10)
void InitStack(Stack &s) {
s.stackPointer = -1;
}
bool Push(Stack &s, int data) {
if(s.stackPointer >= MAX-1) return false;
s.data[++s.stackPointer] = data;
return true;
}
bool Push(Stack &s, int &data) {
if(s.stackPointer <= -1) return false;
data = s.data[s.stackPointer--];
return true;
}
[email protected]
107
프로그래밍 연습(11)
void InitStack(Stack *pS) {
pS->stackPointer = -1;
}
bool Push(Stack *pS, int data) {
if(pS->stackPointer >= MAX-1) return false;
pS->data[++pS->stackPointer] = data;
return true;
}
bool Push(Stack *pS, int *pData) {
if(pS->stackPointer <= -1) return false;
*pData = pS->data[pS->stackPointer--];
return true;
}
만일 이와 같은 동작의 함수를 구조체의 멤버로 포함한다면  C++의 구조체/클래스
만일 data의 자료형을 다양하게 사용하고 싶다면  C++의 템플릿
[email protected]
108
프로그래밍 연습(12)
4. 정렬(sort)
 순서에 맞게 배열
 오름차순/내림차순
 선택 정렬, 삽입 정렬, 버블 정렬
 선택 정렬(selection sort)
 순서에 맞는 값을 찾아서 정렬
 삽입 정렬(insertion sort)
 순차적으로 자료들을 정렬된 자료의 순서에 맞게 삽입
 버블 정렬(bubble sort)
 인접한 두 자료를 비교하여 가장 앞선 자료를 순에서 맞게 정렬해 나감
[email protected]
109
프로그래밍 연습(13)
 버블 정렬
[email protected]
110
프로그래밍 연습(14)
void BubbleSort(int *list, int size) {
int temp;
int i, k;
for(k = 0 ; k < size-1 ; k++)
{
for(i = size-1 ; i > k ; i--)
{
if(list[i-1] > list[i]) {
temp = list[i-1];
list[i-1] = list[i];
list[i] = temp;
}
}
}
}
[email protected]
111
프로그래밍 연습(15)
 선택 정렬과 삽입 정렬
[email protected]
112
프로그래밍 연습(16)
void SelectionSort(int *list, int size) {
int temp;
int sel;
int i, k;
for(k = 0 ; k < size-1 ; k++)
{
sel = k;
for(i = k+1 ; i < size ; i++)
if(list[i] < list[sel]) sel = i;
if(sel != k) {
temp = list[sel];
list[sel] = list[k];
list[k] = temp;
}
}
}
[email protected]
113
프로그래밍 연습(17)
void InsertionSort(int *list, int size) {
int ins;
int i, k;
for(k = 1 ; k < size ; k++)
{
ins = list[k];
for(i = k-1 ; i >= 0 && list[i] > ins ; i--)
list[i+1] = list[i];
list[i+1] = ins;
}
}
[email protected]
114
프로그래밍 연습(18)
5. 행렬 연산
 double A[2][3];
 2×3 행렬 또는 3×2 행렬 표현
 일반적으로 2×3 행렬 표현, [행][열]
 행렬의 동적 메모리 할당
double **AllocMatrix(int nRow, int nCol) {
double **temp;
int y;
temp = new double*[nRow];
for(y = 0 ; y < nRow ; y++)
temp[y] = new double[nCol];
return temp;
}
[email protected]
115
프로그래밍 연습(19)
 행렬의 할당된 메모리 해제
void FreeMatrix(double **matrix, int nRow) {
int y;
for(y = 0 ; y < nRow ; y++)
delete [] matrix[y];
delete [] matrix;
}
[email protected]
116
프로그래밍 연습(20)
 행렬 덧셈 1
double **AddMatrix(double **A, double **B, int nRow, int nCol) {
int x, y;
double **C;
C = AllocMatrix(nRow, nCol);
for(y = 0 ; y < nRow ; y++)
for(x = 0 ; x < nCol ; x++)
C[y][x] = A[y][x] + B[y][x];
return C;
}
[email protected]
117
프로그래밍 연습(21)
 행렬 덧셈 2
void AddMatrix(double **A, double **B, int nRow, int nCol,
double **C)
{
int x, y;
for(y = 0 ; y < nRow ; y++)
for(x = 0 ; x < nCol ; x++)
C[y][x] = A[y][x] + B[y][x];
}
[email protected]
118
프로그래밍 연습(22)
 행렬 곱셈
double **ProductMatrix(double **A, int nRowA, int nColA,
double **B, int nRowB, int nColB) {
if(nColA != nRowB) return NULL;
int x, y, i;
double **C;
C = AllocMatrix(nRowA, nColB);
for(y = 0 ; y < nRowA ; y++)
for(x = 0 ; x < nColB ; x++)
{
C[y][x] = 0;
for(i = 0 ; i < nColA ; i++)
C[y][x] += A[y][i] + B[i][x];
}
return C;
}
[email protected]
119
프로그래밍 연습(23)
void PrintMatrix(double **A, int nRow, int nCol) {
int x, y;
for(y = 0 ; y < nRow ; y++)
{
for(x = 0 ; x < nCol ; x++)
cout << setw(7) << fixed << setprecision(3) << A[y][x];
cout << endl;
}
}
void InitMatrix(double **A, int nRow, int nCol) {
int x, y;
for(y = 0 ; y < nRow ; y++)
for(x = 0 ; x < nCol ; x++)
A[y][x] = (double)rand()/RAND_MAX-0.5;
}
[email protected]
120
프로그래밍 연습(24)
int main() {
double **A, **B, **C;
int nRow = 3, nCol = 4;
A = AllocMatrix(nRow, nCol);
B = AllocMatrix(nRow, nCol);
srand((unsigned int)time(NULL));
InitMatrix(A, nRow, nCol);
InitMatrix(B, nRow, nCol);
C = AddMatrix(A, B, nRow, nCol);
PrintMatrix(A, nRow, nCol);
PrintMatrix(B, nRow, nCol);
PrintMatrix(C, nRow, nCol);
cout << endl;
cout << endl;
cout << endl;
FreeMatrix(A, nRow);
FreeMatrix(C, nRow);
FreeMatrix(B, nRow);
return 0;
}
[email protected]
121
프로그래밍 연습(25)
int main() {
double **A, **B, **C;
int nRow = 3, nCol = 4;
A = AllocMatrix(nRow, nCol);
C = AllocMatrix(nRow, nCol);
B = AllocMatrix(nRow, nCol);
srand((unsigned int)time(NULL));
InitMatrix(A, nRow, nCol);
InitMatrix(B, nRow, nCol);
AddMatrix(A, B, nRow, nCol, C);
PrintMatrix(A, nRow, nCol);
PrintMatrix(B, nRow, nCol);
PrintMatrix(C, nRow, nCol);
FreeMatrix(A, nRow);
cout << endl;
cout << endl;
cout << endl;
FreeMatrix(B, nRow);
return 0;
}
[email protected]
122
FreeMatrix(C, nRow);
프로그래밍 연습(26)
int main() {
double **A, **B, **C;
int nRowA = 3, nColA = 4;
int nRowB = 4, nColB = 2;
A = AllocMatrix(nRowA, nColA);
B = AllocMatrix(nRowB, nColB);
srand((unsigned int)time(NULL));
InitMatrix(A, nRowA, nColA);
InitMatrix(B, nRowB, nColB);
C = ProductMatrix(A, nRowA, nColA, B, nRowB, nColB);
PrintMatrix(A, nRowA, nColA);
PrintMatrix(B, nRowB, nColB);
if(C) PrintMatrix(C, nRowA, nColB);
cout << endl;
cout << endl;
cout << endl;
FreeMatrix(A, nRowA);
FreeMatrix(B, nRowB);
if(C) FreeMatrix(C, nRowA);
return 0;
}
[email protected]
123
프로그래밍 연습(27)
 a11
A
 a21
a12 
a22 
 a11
A   a21
 a31
a12
a22
a32
A  a11a22  a12a21
a13 
a23 
a33 
A  a11a22 a33  a12 a23a31  a13a21a32
a13a22 a31  a12 a21a33  a11a23a32
A  a11a22 a33  a11a23a32  a12 a23a31  a12a21a33  a13a21a32  a13a22a31
 a11 (a22 a33  a23a32 )  a12 (a23a31  a21a33 )  a13 (a21a32  a22 a31 )
 a11 (a22 a33  a23a32 )  a12 (a21a33  a23a31 )  a13 (a21a32  a22 a31 )
[email protected]
124
프로그래밍 연습(28)
double GetDeterminant(double **A, int nRow, int nCol) {
if(nRow != nCol) return 0;
int x, y, k;
double **S;
double sign, Determinant;
if(nRow == 2) {
Determinant = A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
else if(nRow > 2) {
sign = 1.;
Determinant = 0.;
S = AllocMatrix(nRow-1, nCol-1);
for(k = 0; k < nCol ; k++) {
for(y = 0 ; y < nRow-1 ; y++) {
for(x = 0 ; x < nCol-1 ; x++) {
if(x < k) S[y][x] = A[y+1][x];
else S[y][x] = A[y+1][x+1];
}
}
Determinant
+= sign * A[0][k] * GetDeterminant(S, nRow-1, nCol-1);
sign *= -1.;
}
FreeMatrix(S, nRow-1);
}
}
return Determinant;
[email protected]
125
프로그래밍 연습(29)
int main() {
double **A, **B;
int nRowA = 2, nColA = 2;
int nRowB = 3, nColB = 3;
A = AllocMatrix(nRowA, nColA);
B = AllocMatrix(nRowB, nColB);
srand((unsigned int)time(NULL));
InitMatrix(A, nRowA, nColA);
InitMatrix(B, nRowB, nColB);
PrintMatrix(A, nRowA, nColA);
cout << GetDeterminant(A, nRowA, nColA) << endl;
PrintMatrix(B, nRowB, nColB);
cout << GetDeterminant(B, nRowB, nColB) << endl;
FreeMatrix(A, nRowA);
FreeMatrix(B, nRowB);
return 0;
}
[email protected]
126