2.86k likes | 3.7k Views
C++ Programming Language. C ontents. Chapter 01 C++ 시작하기 Chapter 02 C++ 기본문법 Chapter 03 객체지향 개념 (Object-Oriented Concepts) Chapter 04 클래스 (Class) Chapter 05 상속 (Inheritance) Chapter 06 연산자 오버로딩 (Operator Overloading) Chapter 07 템플리트 (Template) Chapter 08 예외처리 (Exception Handling)
E N D
Contents Chapter 01 C++시작하기 Chapter 02 C++기본문법 Chapter 03객체지향 개념(Object-Oriented Concepts) Chapter 04클래스(Class) Chapter 05상속(Inheritance) Chapter 06연산자 오버로딩(Operator Overloading) Chapter 07템플리트(Template) Chapter 08예외처리(Exception Handling) Chapter 09스트림(Stream) Chapter 10이름공간(Namespace)
Chapter01 C++시작하기
C++ 언어 절차적 언어 객체지향 언어 C++언어의 소개 C++언어란? • 가장 대중적 언어인 C와 객체지향 패러다임의 만남 • C언어의 특성인 저수준의 하드웨어 접근과 OOP특성인 고수준의 추상화 제공 • C언어의 절차적 프로그래밍 기법과 객체 지향 프로그래밍 기법, 그리고 템플릿을 이용한 일반화 프로그래밍 기법 모두 사용 가능 • 순수한 의미에서의 객체지향 언어는 아니지만 가장 대중적으로 성공한 객체지향 언어
프로그래밍 과정 1. 프로그램 목적 정의 2. 프로그램 설계 3. 소스 코드 작성 4. 컴파일 & 링크 5. 프로그램 실행 6. 프로그램 검사와 디버그 7. 프로그램 유지와 보수
첫 만남, Hello, World~! /* Hello.cpp */ #include <iostream.h> int main(void) { cout << “Hello, World~!” << endl; return 0; }
Chapter02 C++기본문법
Contents • 데이터 타입(Data Types) • 연산자(Operators) • 프로그램 제어문(Control Flow) • 함수(Function) • 프로젝트 구성(Project Configuration)
bool형 특징 • 참, 거짓 중 어느 한 가지 값만 가질 수 있다. • 정수값으로 변환될 수 있다.(true = 1, false = 0) • 1 이상의 값은 항상 true가 된다. bool b = 7; // b is true. int i = true; // i is 1.
정수형 특징 • 각 정수 타입은 세가지 형태를 띤다 : int, unsigned int, signed int • 각 정수 타입은 세가지 크기를 지닌다 : short, int, long int • 정수 리터럴은 네 가지 값의 형태를 지닐 수 있다: decimal, octal, hexadecimal, character int num; int a, b, c; //한 문장에서 3개의 변수 선언 int age = 30; //선언과 동시에 초기화
실수형 특징 • 소수점 이하를 가지는 실수를 표현하고 저장하는 데이터 타입 • 실수형 데이터 타입은 세가지 크기를 가진다 : float, double, long double(기본 타입 : double) float a = 10, b = 20; double percent = a/100; double c = 0.3;
문자형 특징 • 하나의 문자 혹은 하나의 기호를 표현하고 저장하는 데이터 타입 • 표준 ASCII 코드(0 ~ 127) 사용(정수값 표현 가능) • 문자의 표현시 반드시 작은 따옴표(‘ ’)로 묶어준다 • 출력되지 않는 문자(Escape Sequences)를 사용한다 char grade; char gradeA = ‘A’, gradeB = 66; //선언과 동시에 초기화
void형 특징 • 타입이 정해지지 않은 데이터를 위한 자료형 • 객체를 정의하기 위해 사용될 수 없다. • 함수의 리턴 값 혹은 인자가 없다는 의미로 사용될 수 있다. void x; // 오류 발생 : there are no void objects. void f (void); //함수 f는 인자와 리턴 값을 갖지 않는다.
데이터 타입의 크기 특징 • 데이터 타입의 크기는 시스템이나 운영체제, 컴파일러마다 달라질 수 있다.: <limits.h> 참조 • 타입간의 크기 순서는 정해져 있다. 1 sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(float) sizeof(double) sizeof(long double) • sizeof 연산자를 이용하여 자료형의 크기를 확인할 수 있다.
Enum(1) 특징1 • 사용자가 정수형 값에 이름을 주어 의미를 표현하고자 할 때 사용 • 정의된 후에는 정수형 타입으로 사용됨 • 값을 정하지 않는 경우, 디폴트로 0부터 증가하는 값을 가짐 • 프로그램의 가독성을 향상시키기 위해 사용 enum colors {RED, YELLOW, BLUE, GREEN}; //RED=0,YELLOW=1,BLUE=2,GREEN=3 enum font {ARIAL, CENTURY=10, GOTHIC, TIMESROMAN=20}; // ARIAL=0,CENTURY=10,GOTHIC =11,TIMESROMAN=20
Enum(2) 특징2 • 값의 범위는 0부터 가장 가까운 2진 자릿수의 최대값까지이다. • 정수형 값을 명시적으로 형변환하여 대입할 수 있다. enum e1 {open, close}; //range : 0 ~ 1 enum e2 {a = 3, b = 10} //range : 0 ~ 15 enum flag {a = 1, b = 2, c = 4, d = 8}; //range : 0 ~ 15 flag f1 = 5; //type error flag f2 = flag(5); //OK flag f3 = flag(c|d); //OK
typedef 특징 • 어떤 타입에 대한 새로운 이름을 부여하는 것 • 새로운 타입이 생성되는 것이 아니라 별명이 생긴다고 할 수 있음 typedef char* PCHAR; typedef unsigned long ulong; PCHAR p1; ulong var1;
구조체(1) 특징1 • 임의 타입의 변수들의 집합체 • 구성하는 모든 멤버 변수들의 데이터 타입이 같아도 되고, 달라도 된다. • 포인터 변수나 배열도 멤버 변수로 사용할 수 있다. • 멤버 변수의 접근을 위해서 dot(.)을 사용한다. struct phone { //phone 이라는 이름(태그)의 구조체 선언 char name[20]; //첫번째 구조체 멤버 char phoneno[20]; //두번째 구조체 멤버 } struct phone myphone; cout << myphone.name << endl; cout << myphone.phoneno << endl;
구조체(2) 특징 • struct로 정의된 타입은 typedef를 이용하여 독립적인 타입으로서 사용될 수 있다. • 동일한 타입일 경우, 대입과 복사 연산이 가능하다. typedef struct { char name[20]; //첫번째 구조체 멤버 char phoneno[20]; //두번째 구조체 멤버 } Phone; Phone myphone; strcpy(myphone.name, “Hong, Gil-Dong”); strcpy(myphone.phoneno, “02-111-1234”); Phone yourphone = myphone;
구조체(3) 특징 • 변수를 정의할 때 초기화 블록을 사용하여 초기화할 수 있다. • 중첩 구조체를 선언할 수 있다.(중첩 구조체 : 다른 struct 타입의 변수를 포함하는 구조체) • 중첩 초기화를 통해 모두 한꺼번에 초기화할 수 있다. typedef struct { char name[20]; //첫번째 구조체 멤버 char phoneno[20]; //두번째 구조체 멤버 } Phone; Phone myphone = {“Hong, Gil-Dong”, “02-111-1234”};
구조체(4) 특징 • Strict Type Checking : 두 구조체 타입이 같은 타입의 동일한 이름을 가진 변수들을 똑같이 가지고 있더라도, 구조체 이름이 다르다면, 다른 타입으로 인식한다. struct phone{ char name[20]; char phoneno[20]; }; struct person { char name[20]; char phoneno[20]; }; struct phone ph = {“Hong, Gil-Dong”, “02-111-1234”}; person pe = ph; //type mismatch error
구조체(5) 특징 • 비트 단위로 타입 내의 변수들을 구성할 수 있다. • 메모리의 효율성을 제공한다. • 구조체 선언에서 각 비트 필드에 레이블을 붙이고 크기를 지정한다. • 각 비트마다 가질 수 있는 값은 0과 1 뿐이다. struct sreg { unsigned int enable : 1; unsigned int page : 3; unsigned int : 1; //unused unsigned int mode : 2; unsigned int access : 1; unsigned int length : 1; }; struct sreg s1; s1.page = 5;
공용체(Union) 특징 • struct와 유사하나, 타입 내의 모든 멤버 변수들 중 가장 큰 크기를 가진 변수만큼만 메모리가 할당된다. • 타입내의 여러 멤버 변수들 중 한가지로만 사용될 수 있다. union MyType { int num1; double num2; char ch; }; //이 때, mytype 타입의 변수들은 8bytes(=>double의 크기)의 저장공간을 사용하게 된다.
포인터(1) 특징 • 메모리의 주소값을 저장하는 변수 • 타입T*의 변수는 T타입 객체의 주소를 가질 수 있다. • 배열이나 함수를 가리키는 포인터를 정의할 수 있다. • 간접연산자(*): 뒤에 포인터 이름이나 주소가 따라올 경우, *는 가리켜진 주소의 메모리 공간에 저장된 값을 반환한다. • 주소연산자(&): 뒤에 변수 이름이 따라올 경우, 그 변수가 위치한 메모리 공간의 주소를 반환한다. 0x1000 0x1004 0x1008 0x100c num1 = 20 num2 = 30 pi = 0x1000 int num1 = 20; int num2 = 30; int *pi; pi = &num1; cout << *pi << endl;
포인터(2) int * pi; //pointer to int char ** ppc; //pointer to pointer to char int (*ap)[4]; //pointer to array of 4 ints int (*fp) (char*); //pointer to function taking a char* arguments; //returns an int int * f(char *); //function taking a char* argument; //returns a pointer to int* pi function code forint f(char) 123 ppc ‘a’ ap 123 234 456 678
포인터(3)-void* 특징 • 선언시에 포인터의 타입이 정해지지 않는다. • 모든 객체의 포인터 변수는 void* 타입으로 매핑될 수 있다. • void* 타입의 객체는 다른 타입으로 명시적인 변환이 가능하다. • void* 타입의 두 객체에 대한 동일성 비교가 가능하다. • 그 외의 연산은 불가능하다. void f(int * pi) { void* pv = pi; //ok : implicit conversion *pv; //error : can’t dereference void* pv++; //error : can’t dereference void* int* pi2 = (int*) pv; //ok : explicit conversion double* pdl = pv; //error }
v1 1 3 4 2 v2 5 7 6 v3 1 0 0 배열(1) 특징 • 한가지 데이터 타입으로 이루어진 일련의 요소의 모임 • 배열은 생성과 동시에 초기화할 수 있다. • 콤마로 구분된 값의 목록을 중괄호로 둘러싸는 방법으로 초기화한다 • 초기화 값의 목록이 배열의 크기보다 모자랄 경우 컴파일러는 나머지 요소의 값을 0으로 설정한다. • 초기화 값의 목록이 배열의 크기보다 클 경우 컴파일러는 오류로 처리한다. int v1[4] = { 1, 2, 3, 4 }; int v2[] = { 5, 6, 7 }; int v3[3] = { 1 }; int v4[4] = { 2, 3, 4, 5, 6, 7 }; //error
배열(2) 특징 • 다차원 배열을 구성할 수 있으며, 초기화 또한 가능하다. • 2차원 배열 : 배열의 배열(행과 열로 구성되는 표 형태) • 3차원 이상의 배열 : 행과 열로 쌓여 있는 표가 여러개 쌓여 있는 형태 int v1[2][3] = { {1,2,3}, {4,5,6} }; int v2[][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; v1 1 3 2 => 논리적 구조 4 6 5 v1 1 3 4 6 2 5 => 물리적 구조
Reference(1) 특징 • 이미 존재하는 객체에 붙이는 별명 • 항상 초기화되어야만 사용 가능하다. • 레퍼런스로 수행하는 연산은 레퍼런스가 참조하는 변수를 가지고 수행하는 연산과 같은 효과를 나타낸다. void f() { int num 1 = 10; int &ref = num1; int num2 = ref; ref = 20; }
Reference(2) 특징 • 레퍼런스는 인자 전달(argument passing)에서 call-by-reference를 구현한다. void increment(int& aa) {aa++;} void g() { int x = 1; increment(x); }
Constant(1) 특징 • 상수는 선언된 값을 변경할 수 없으며, 항상 초기화하여 사용해야 한다. const int model = 90; const int v[] = {1, 2, 3, 4}; const int x; //error : no initialization void f() { model = 200; //error v[2]++; //error }
Constant(2) 특징 • 값과 포인터를 상수화할 수 있다. void f(char* p) { char s[] = “Gorm”; const char* pc = s; //constant pc[3] = ‘g’; //error pc = p; //OK }
Storage Class(1) 유효범위(Scope) • 어떤 변수에 접근할 수 있는 구역 혹은 프로그램의 구역 • 블록 범위 : 서로 짝이 되는 { 와 } 사이의 영역 내에서 유효한 범위 • 파일 범위 : 변수가 정의된 지점으로부터 그 파일의 끝까지 유효한 범위 연결성 • 외부 연결성 : 여러 파일로 구성된 프로그램의 어디서든 사용할 수 있는 것 • 내부 연결성 : 그 변수가 선언된 파일 안에서만 사용할 수 있는 것 • 연결성 없음 : 자신이 정의된 블록 내에서만 사용할 수 있는 것 저장기간 • 정적 저장 기간 : 변수가 프로그램이 실행되는 기간 내내 존재하는 것 • 자동 저장 기간 : 변수가 정의된 블록에 프로그램 제어권이 들어왔을 때부터 블록을 빠져나갈 때 까지 존재하는 것
Storage Class(2) 자동 변수 • 보통 특정 블록, 혹은 함수의 시작 부분에 선언되며, 그 블록 혹은 함수 내에서만 사용된다. 레지스터 변수 • CPU와 같은 빠른 메모리에 저장되며, 그 성격은 자동 변수와 같다. 블록범위 정적변수(Static) • 자동변수와 같이 특정 블록 혹은 함수 내에서만 사용될 수 있으나, 해당 블록 혹은 함수 종료 후에도 존재하게 되며 프로그램이 완전히 종료되어야 소멸된다. void StaticFunction(int val) { static int count = 0; count = count + val; cout << count << endl; } 이 함수가 처음 호출되었을 때만 초기화되고, 그 이후에 함수가 호출될 때는 이전에 계산된 값을 그냥 사용하게 된다.
Storage Class(3) 외부 연결 정적 변수(전역변수) • 함수의 외부에 선언하며 프로그램의 시작부터 종료까지 프로그램 전체(모든 파일)에서 사용한다. 내부 연결 정적 변수(전역변수) • 함수의 외부에 선언하며 프로그램의 시작부터 종료까지 살아있지만, 변수의 선언이 포함된 파일 내에서만 사용된다.
데이터 타입의 변환(형 변환) 암시적 형 변환(자동 형 변환) • 연산자를 기준으로 하여 왼쪽의 데이터와 오른쪽의 데이터의 타입이 서로 다른 경우에 연산을 수행하기 위하여 발생하는 형 변환 • Type Promotion(형 승격) 동일 종류의 데이터 타입에 대해 타입의 표현 범위가 큰 쪽으로 타입을 변환한다. (예) bool, char, short -> int • Standard Type Conversion(표준 형 변환) 기본 데이터 타입간의 가능한 형 변환을 이용하여 찾는다. (예) int <- -> double 명시적 형 변환(강제 형 변환) • 프로그래머의 명시적인 선언에 의해서 발생하는 형 변환 (예) float f = (float)100;
범위 지정 연산자(Scope Resolution) 특징 • 접근하려고 하는 변수에 대한 범위를 지정할 때 사용하는 연산자 • 전역 변수에 대한 접근을 위해 사용하기도 하므로, 전역 변수 연산자라고도 한다. int amount = 123; void main() { ::amount = 100; cout << “::amount = “ << ::amount << endl; }
산술연산자 특징 • 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 수행하는 가장 기본적이며 자주 사용하는 연산자
증감연산자 특징 • 피연산자를 1씩 증가 혹은 감소 시키는 단항 연산자 • 연산자의 위치에 따라 증감의 시점이 달라지게 되어(전위/후위 연산자), 수식 내에서 사용시에 주의해야 한다
대입연산자 특징 • 우변값을 좌변에 대입하는 연산자
비교연산자(관계연산자) 특징 • 좌변값과 우변값을 비교하여 누가 큰지, 작은지, 같은지, 같지 않은지 등의 관계를 알려주는 연산자 • 비교 조건이 만족되면 true(=1), 만족하지 못하면 false(=0)를 반환
논리연산자 특징 • 둘 이상의 비교(관계)식을 결합하는 연산자
비트 논리 연산자 특징 • 비트 단위(0 또는 1)로 연산을 할 때 사용하는 연산자 • 정수 타입 데이터들만 사용할 수 있다 (char타입 포함)
비트 시프트 연산자 특징 • 비트를 왼쪽에서 오른쪽으로, 혹은 오른쪽에서 왼쪽으로 이동시키는 연산자
변환연산자(캐스트연산자) 특징 • 수식내에서 변수의 데이터 타입을 강제로 변환시키는 연산자(명시적 형변환) int a; double b = 10.25; a = (int)b; //b의 실수값이 정수형으로 변환된 후 a에 대입된다.