1장 - C++ 프로그래밍의 첫 걸음
1. 프로그램을 실행시키기 위해서는 편집, 컴파일, 링크 단계가 필요하다.
2. C++ 프로그램은 함수로 구성된다.
3. C++ 프로그램에는 main 함수가 반드시 하나 필요하다.
4. 함수는 "{" 로 시작해서 "}" 로 끝난다.
5. cout은 출력을 위한 객체로, 이 객체를 사용하기 위해서는 #include로 iostream.h를 포함해야 한다.
6. 문장의 끝에는 세미콜론(;)을 반드시 기술해야 한다.
7. 주석은 //나 /* */로 둘러싼다.
8. cout 객체는 네임스페이스 std에 포함되어 있으므로 반드시 std::를 cout 객체 앞에 기술해야 한다.
9. 모든 cout 객체에 네임스페이스 std::를 덧붙이지 않으려면 using namespace로 네임스페이스를 지정한다.
2장 - 자료형과 연산자
1. C++의 주요 자료형으로는 char, int, long, float, double이 있다.
2. char형은 1바이트의 정수형이다.
3. 문자열은 char형 배열로 표현되며 문자열은 그 끝을 나타내는 널(null) 문자를 반드시 포함해야 한다.
4. C++에서 제공하는 산술 연산자에는 +, -, *, /, %가 있다.
5. C++에서 제공하는 관계 연산자에는 <, <=, >, >=, ==, !=가 있다.
6. C++에서 제공하는 논리 연산자로는 !, &&, ||가 있다.
7. C++에서 제공하는 변수의 값을 1 증가할 경우에는 ++1, 감소할 경우에는 --를 사용하는데 증감연산자의 위치에 따라 전위 연산자랑 후위 연산자로 구분되며 실행 결과가 다르므로 주의해야 한다.
8. 비트와 바이트 즉, 저수준까지 내려갈 필요가 있을 때 사용하는 연산자로 비트 단위 연산자가 제공된다. C++에서 제공되는 비트 단위 연산자로는 ~, &, |, ^, <<, >>가 있다.
3장 - 제어문
1. 컴퓨터 프로그램에서 실행되어야 할 문장을 지정하는 것을 제어라고 한다.
2. 선택문은 여러 가지 경로 중에서 하나를 선택하기 위해 사용된다.
3. if 문은 조건이 참일 경우에만 지정된 동작을 실행한다.
4. if else 문은 조건이 참일 때와 거짓일 때 실행될 각각의 동작을 지정한다.
5. switch 문은 특정 변수나 표현식을 검사하는 일련의 결정을 처리하며 동작을 선택한다. case 문 다음에는 대부분 break 문을 포함한다.
7. 일반적으로 for 문은 명시적으로 반복 횟수가 정해질 때 사용되며, while 문은 반복횟수가 정해지지 않을 때 사용된다.
8. do~while 문은 조건이 거짓이더라도 적어도 한 번은 실행이 된다.
9. break 문은 하나의 반복문(for, while, do while) 안에서 실행되며, 반복문에서 바로 빠져나오는데 사용한다.
10. continue 문은 하나의 반복문(for, while, do while) 안에서 실행되며, 반복문 안의 남은 문장들을 건너뛰고 다음 반복문의 조건을 검사한다.
4장 - 함수와 기억클래스류
1. 함수를 정의하는 기본 형식은 다음과 같다.
함수자료형 함수이름(매개변수 리스트)
{
변수 선언;
문장;
return (결과값);
}
2. 함수를 정의하는 쪽의 매개변수를 형식 매개변수라 하고 함수를 호출하는 쪽의 매개변수를 실 매개변수라 한다.
void sum(int a, int b) // 형식 매개변수
{
cout << " a + b = " << a + b << "\n";
}
void main()
{
int a=10, b=20;
sum(a, b); // 실 매개변수
}
3. 함수는 값을 반환하지 않을 경우에는 void형으로 지정하고 값을 반환할 경우에는 return 문을 사용해서 명시적으로 값을 반환한다. 이때 함수의 자료형은 return 문 다음에 나오는 값을 자료형과 동일해야 한다.
4. 함수는 크게 사용자 정의 자료형과 매크로 함수 두 가지로 나뉘는데 매크로 함수는 단순히 치환되기 때문에 정의할 때 괄호 연산자를 적극 활용해서 연산자 우선순위를 명확하게 해야 한다.
5. 변수는 선언 위치에 따라 지역변수(블록 내부)와 전역변수(블록 외부)로 나뉘는데 지역변수는 그 함수 내부에서만 참조가능하고 전역변수는 어디에서나 참조가능하다.
6. 변수는 기억클래스류에 따라 자동변수, 외부변수, 정적변수, 레지스터 변수로 나뉜다. 자동변수의 생존기간은 일시적이고 유효범위가 지역적이다. 외부변수의 생존기간은 영구적이고 유효범위가 전역적이다.
7. 정적변수의 생존기간은 영구적이다. 정적변수는 지역변수 형태나 전역변수 형태로 선언할 수 있으므로 유효범위는 블록 내부에 선언했을 경우 지역적이고 블록 외부에 선언했을 경우에는 전역적이다.
5장 - 포인터와 함수의 매개변수 전달
1. 함수에서 매개변수를 전달하는 방법에는 다음 세 가지가 있다.
- 값에 의한 전달 방식 (Call by Value)
- 주소에 의한 전달 방식 (Call by Address)
- 참조에 의한 전달 방식 (Call by Reference)
2. 값에 의한 전달 방식은 함수 호출 후에 실 매개변수의 값이 변경되지 않는다. 실 매개변수 값이 함수 호출 후에 변경되어야 할 경우에는 주소에 의한 전달 방식이나 레퍼런스에 의한 전달 방식을 사용해야 한다.
3. 주소에 의한 전달 방식은 포인터 형태로 선언된 형식 매개변수로 간접 참조해서 실 매개변수 값을 변경할 수 있다.
4. 레퍼런스에 의한 전달 방식은 레퍼런스 형태로 선언된 형식 매개변수로 실 매개변수의 값을 변경할 수 있다.
5. 포인터 변수는 변수의 주소를 저장하는 변수이다. 선언시 자료형 다음에 *를 기술한다.
6. 주소를 얻어오기 위해서는 & 연산자를 변수 앞에 붙인다.
7. 주소가 주어졌을 때 그 주소가 가리키는 곳의 값을 얻어오기 위해서는 * 연산자를 사용한다.
8. 이미 선언된 변수의 별칭을 붙이기 위해서는 레퍼런스 변수를 사용한다. 선언시 자료형 다음에 &를 기술한다.
6장 - 배열과 포인터
1. 배열은 자료형이 동일한 여러 개의 값을 연이어 저장할 수 있도록 기억공간의 집합체이다.
2. 1차원 배열에서는 초기값을 하나 이상 주기 때문에 각 원소의 값을 나열하고 콤마로 구분하여 이를 집합화하기 위해서 중괄호로 묶어준다.
3. 2차원 배열은 행(row)와 열(column)을 모두 가지고 있는 표(행렬)와 같은 구조이다.
4. 배열명만 기술하면 C++ 컴파일러는 배열의 시작 주소값 즉, 포인터로 해석한다.
5. 배열에서 포인터를 사용하는 이유는 배열의 시작 주소만 알면 배열의 모든 원소의 값을 알 수 있기 때문이다. 이러한 특징을 함수의 매개변수가 배열일 경우 응용한다.
6. 함수의 매개변수로 배열을 사용하고자 할 때 실 매개변수로 배열의 시작 주소만을 전달해준다. 형식 매개변수로 받은 배열의 시작 주소로 실 매개변수로 기술한 배열의 각 원소들을 간접참조한다.
7. 2차원 포인터 변수는 * 기호를 두 번 기술해서 다음과 같이 선언한다.
int **p;
8. 2차원 배열의 주소를 저장하는 포인터 변수는 각 행이 몇 개의 열로 구성되어 있는지가 중요하기에 다음과 같이 선언한다.
int (*p) [배열의 열의 개수];
7장 - 구조체
1. 예약어 struct를 사용해 새로운 자료형을 정의할 수 있는데 struct로 정의된 자료형을 구조체라고 한다.
2. 구조체의 멤버를 참조하기 위한 연산자로 닷(.) 연산자와 애로우(->) 연산자가 제공된다.
3. 함수의 매개변수를 구조체로 선언하여 구조체 단위로 값을 전달할 수 있다.
4. 함수의 반환값으로 구조체 변수를 사용하면 함수의 자료형이 구조체가 된다.
5. 특정 함수 내에서 다른 함수에 선언된 구조체 변수를 제어하기 위해서는 구조체 포인터를 형식 매개변수로 하는 주소 호출 방식으로 함수를 정의하거나 레퍼런스 변수로 형식 매개변수를 정의한다.
6. 동일한 구조체형으로 선언된 기억 공간을 목적으로 사용할 때는 구조체 배열을 사용하면 유용하다.
8장 - 클래스와 객체
1. 객체지향 프로그래밍은 프로그램을 작성하기 위해 필요한 객체들을 먼저 생각하고 필요한 메소드를 사용하면서 프로그램을 작성해 나간다.
2. 객체지향 프로그래밍은 캡슐화(Encapsulation)와 데이터은닉(Data Hiding), 다형성(Polymorphism), 함수의 오버로딩, 연산자 오버로딩(Operator overloading), 상속성(Inheritance)과 같은 특징이 있다.
3. 클래스의 구조는 클래스 선언과 클래스 멤버함수의 정의로 나눌 수 있는데 클래스 선언에는 멤버변수와 멤버함수의 원형 정의(프로토타입)를 기술하고 멤버함수의 정의는 클래스 선언 밖에서 따로 이루어진다.
4. 접근 지정자는 클래스에서 각 메버변수나 멤버함수 앞에 붙여서 사용하는 예약어인데 클래스 내부에 선언된 멤버변수와 멤버함수의 접근 권한을 정한다.
5. 프로그램 내에서 실질적인 작업을 수행하기 위해서는 클래스로 객체를 선언해야만 하는데 객체는 클래스를 실체(Instance)화한 것이다.
6. 프로그램 속도를 높이기 위해 보강한 함수가 인라인 함수인데 매크로 함수와 동작 원리가 동일하다. 클래스 내부에 멤버함수를 정의하면 자동 인라인이 된다.
7. const 멤버함수는 함수 내부에서 멤버변수 값을 변경하지 못하도록 한다.
8. 함수의 이름을 동일하게 주고 여러 번 정의할 수 있는데 이를 함수의 오버로딩이라고 한다. 함수의 오버로딩은 함수의 이름을 동일하게 주는 대신 매개변수의 개수나 자료형을 달리 주어야 한다.
9. 객체 초기화를 하기 위한 멤버함수로서 생성자가 있는데 다음과 같은 특징이 있다.
- 생성자는 특별한 멤버함수이다.
- 생성자의 이름은 클래스명과 동일하다.
- 생성자의 자료형(반환값의 유형)을 지정하지 않는다.
- 생성자의 호출은 명시적이지 않다.
- 생성자는 객체를 선언(생성)할 때 컴파일러에 의해 자동으로 호출된다.
- 객체의 초기화란 멤버변수의 초기화를 의미한다.
10. 객체가 소멸될 때 자동 호출되는 소멸자가 있는데 다음과 같은 특징이 있다.
- 소멸자는 멤버함수이다.
- 소멸자의 이름 역시 생성자와 마찬가지로 클래스명을 사용한다.
- 소멸자는 생성자 함수와 구분하기 위해 함수명 앞에 ~ 기호를 덧붙인다.
- 소멸자의 자료형을 지정하지 않는다.(반환값의 유형을 지정하지 않는다.)
- 소멸자의 호출은 명시적이지 않다.
- 소멸자는 객체 소멸시 자동 호출된다.
- 소멸자는 전달 매개변수를 지정할 수 없다.
- 소멸자는 전달 매개변수를 지정할 수 없으므로 오버로딩할 수 없다.
9장 - 객체의 다양한 활용
1. 클래스로 선언된 포인터 변수는 객체의 주소값을 저장할 수 있으므로 객체 포인터라고 한다. 이렇게 선언한 객체 포인터는 객체를 간접 참조하기 위해서 사용한다.
2. this 포인터는 컴파일러에 의해 생성되는 포인터로, 멤버함수를 호출한 객체를 가리키며 멤버함수에서만 사용할 수 있다. this 포인터는 멤버함수가 어떤 객체에 의해 호출되었는지에 대한 정보이므로 멤버함수 내부에서 사용되는 모든 멤버들이 어떤 객체 소속인지를 알려준다.
3. 매개변수가 객체인 함수는 기본 데이터형처럼 다음과 같이 3가지로 나뉜다.
- 값에 의한 전달 방식
- 주소에 의한 전달 방식
- 레퍼런스에 의한 전달 방식
4. 클래스를 설계할 때 멤버변수와 멤버함수에 static을 붙여서 선언하면 클래스 단위로 접근 가능한 정적 멤버변수와 정적 멤버함수가 된다.
5. private 멤버를 클래스 외부의 함수에서 사용하기 위해서는 private 멤버가 속한 클래스 내부에 friend 예약어를 사용해 프렌드 함수로 선언해야 한다.
10장 - 연산자 오버로딩
1. 클래스 내의 멤버변수를 다루기 위해서 멤버함수를 정의할 경우 객체에 대한 정보를 포인터 this가 받아오므로 함수 내에서 사용할 객체에 정보가 두 개라면 매개변수를 한 개만, 한 개라면 매개변수 없이 함수를 구현할 수 있다.
2. C++에서는 기본 자료형에 대해서 +, - 등 다양한 연산자를 사용한다.
3. 사용자가 정의한 자료형인 클래스로 객체를 선언한 후 그 객체의 값을 출력하기 위해서 << 연산자를 오버로딩해야 하는데 << 연산자를 오버로딩하는 형식은 다음과 같다.
ostream & operator<<( ostream &os, 클래스명 &obj)
{
os<< obj.멤버변수
...
return os;
}
11장 - 상속성
1. 프로그램을 개발하다 보면 중복되는 내용이 많은데 상속은 코드의 재활용을 위한 방법으로 나온 개념이다.
2. 상속 관계에서 부모가 되는 클래스를 기반클래스, 기초클래스, 베이스클래스라 하고 자식 클래스에 해당되는 클래스를 파생클래스라고 한다.
3. 상속 관계에 있는 클래스에는 접근 지정자로 protected가 하나 더 제공되는데 protected는 상속 가능한 클래스 내부에서는 public이고 외부 클래스에서는 private처럼 사용된다.
4. 파생클래스를 새롭게 정의할 때는 파생클래스 뒤에 콜론을 붙이고 기반클래스를 기술한다.
class 파생클래스명 : 접근지정자 기반클래스명 {
멤버변수;
멤버함수;
}
5. 상속 관계에서 생성자는 멤버함수임에도 상속이 불가능하며 파생 객체가 생성되더라도 파생클래스의 생성자가 호출됨은 물론 기반클래스의 생성자까지 연속으로 자동 호출된다.
6. 생성자의 호출 순서는 기반클래스의 생성자->파생클래스의 생성자 순이고, 소멸자의 호출 수서는 파생클래스의 소멸자->기반클래스의 소멸자 순이다.
7. 파생클래스에서 기반클래스의 생성자를 명시적으로 호출해 매개변수를 전달할 수 있다. 파생 클래스의 생성자를 정의할 때 함수의 머리 부분 맨 마지막 부분에 콜론(:)을 기술한 후 기반클래스의 생성자를 호출한다.
8. 함수의 오버라이딩(Overridding)은 기반클래스에 정의되어 있는 함수와 동일한 형태로 파생클래스에서 함수를 다시 정의하는 것이다.
9. 파생클래스에서 멤버함수를 오버라이딩하면 기반클래스에 선언된 멤버함수가 은폐된다. 은폐된 기반클래스의 멤버함수가 수행되어야 한다면 명시적으로 기반클래스의 이름을 스코프(::) 연산자와 함께 함수명 앞에 기술한다.
12장 - 가상함수와 추상클래스
1. 업캐스팅의 개념
- 파생 객체의 포인터가 기반 객체의 포인터로 형변환하는 것이다.
- 참조 가능한 영역이 축소된다.
- 컴파일러에 의해서 자동으로 형변환된다.
2. 다운캐스팅의 개념
- 파생 클래스로 형변환하는 것이다.
- 참조 가능한 영역이 확대되는 것을 의미한다.
- 컴파일러에 의해서 자동으로 형변환되지 않는다.
- 프로그래머에 의해서 명시적으로 캐스팅을 해 주어야만 한다.(컴파일상의 에러 발생을 막음.)
- 형변환 후에도 실행시 예외사항이 발생할 수 있으므로 인스턴스의 클래스형과 참조하는 포인터 변수의 상속 관계를 생각해서 명시적 캐스팅을 해야 한다. (한번 업캐스팅이 된 포인터 값을 다운 캐스팅하는 경우에만 안전하다.)
3. 일반적으로 호출될 함수는 컴파일할 때 미리 결정해 두는데 이를 정적(static) 바인딩이라 한다. 실행 시점이 아닌 컴파일 시점에 호출할 함수가 결정되기에 이를 이른(early) 바인딩이라고도 한다.
4. 동적 바인딩은 멤버함수가 어떤 클래스의 소속인지를 컴파일할 때 결정하지 않고 프로그램이 실행되는 동안에 결정하므로 늦은(Lately) 바인딩이라고도 한다. C++에서 virtual 예약어를 멤버함수 앞에 붙여 가상함수로 선언하면 해당 함수가 동적 바인딩한다.
5. 추상클래스는 파생클래스에 구현되어야 할 추상 기능들을 완전 가상함수 형태로 미리 정의해 둔다. 추상클래스 내의 완전가상함수는 무엇인지만 정의해 두고 어떻게 구현할 것인가에 대해서는 파생클래스에서 구체적으로 정의한다. 추상클래스와 완전가상함수는 관련된 클래스들이 동일한 인터페이스(멤버함수)로 접근할 수 있도록 표준안을 제시하게 한다.
13장 - 템플릿과 예외처리
1. 템플릿 함수는 자료형에 상관없는 일반형 함수를 만든 것이다.
2. 템플릿 함수에 실 매개변수를 명시해서 호출하면 호출 가능한 함수가 만들어지는데 이를 템플릿 함수의 인스턴스화라고 한다.
3. 하나의 자료형에 국한된 클래스가 아닌 범용 자료형을 다룰 수 있게 클래스를 정의할 수 있는데 이것이 바로 템플릿 클래스다.
4. 템플릿 클래스를 정의하다 보면 멤버변수의 자료형과 멤버함수를 통해서 전달되는 매개변수의 자료형이 다를 경우가 있는데 이럴 경우에는 둘 이상의 자료형에 대해서 템플릿을 선언한다.
5. 예외란 예상하지 못한 일 즉, 프로그램이 실행되는 동안에 발생하는 예기치 않은 에러를 의미하는데 예외가 발생하면 그 시점에 바로 프로그램이 종료된다.
6. 예외가 발생하는 경우에는 예외처리를 통해 프로그램이 비정상적으로 종료되는 것을 막고 정상적으로 프로그램이 진행되도록 해야 한다.
7. C++에서는 예외를 검사하고 처리하는데 사용하는 구문으로 try-catch를 제공한다. 예외가 발생할만한 내용을 try 블록 안에 기술하고 catch 구문 안에 예외처리 구문을 기술한다.
14장 - 파일 다루기
1. 파일 출력을 위한 과정은 다음과 같다.
1-1. fstream.h 헤더파일을 포함시킨다.
#include <fstream>
1-2. 출력 스트림을 관리하기 위한 객체를 선언한다.
ofstream fout;
1-3. 선언된 출력 스트림 객체에 특정 파일을 지정해 연다.
fout.open("insa.dat");
1-4. 선언된 객체에 출력 전용 연산자(<<)나 멤버함수를 통해 출력한다.
fout<<man.name<<" "<<man.age<<" "<<man.address<<endl;
1-5. 열었던 파일을 닫는다.
fout.close();
2. 파일 입력을 위한 과정을 다음과 같다.
1-1. fstream.h 헤더파일을 포함시킨다.
#include <fstream>
1-2. 입력 스트림을 관리하기 위한 객체를 선언한다.
ifstream fin;
1-3. 선언된 파일 입력 스트림 객체에 특정 파일을 지정해 연다.
fin.open("insa.dat");
1-4. 선언된 객체에 입력 전용 연산자(>>)나 멤버함수를 통해 입력받는다.
fin>>man.name>>man.age>>man.address;
1-5. 열었던 파일을 닫는다.
fin.close();
3. main 함수는 다음과 같은 형태로 매개변수를 갖는다.
void main(int argc, char* argv[])
4. 도스의 type 명령어를 C++로 작성할 경우 파일에서 읽어온 문자 하나를 모니터에 출력하는 작업을 파일이 끝날 때까지 진행하도록 프로그래밍한다.
5. 도스의 copy 명령어는 파일에서 읽어온 문자 하나를 파일에 출력하는 작업을 파일이 끝날 때까지 진행한다.
6. 이진 파일은 write 함수를 사용해서 파일에 데이터를 저장하면 생성된다. 이렇게 생성된 파일에서 데이터를 읽어올 때는 read 함수를 사용해야 한다.
7. 순차 파일은 원하는 위치의 레코드를 읽기 위해서 그 위치에 도달할 때까지 파일의 시작부터 계속 읽어나가는 것을 의미한다.
8. 랜덤 파일은 seekg 함수를 사용해서 파일 포인터를 이동한 후에 한번만 레코드를 읽어서 원하는 레코드를 얻어내는 방법이다.
15장 - 프로젝트
1. LIFO 구조로 동작하는 자료구조인 스택 클래스
- 최대 MAX개의 항목을 사용할 수 있는 하나의 스택을 1차원 배열로 선언한다. (int item[MAX])
- 스택에 자료를 삽입/삭제할 때 기준이 되는 스택 포인터에 대한 변수를 선언한다. (int top)
- 생성자 : top에 -1을 초기값으로 주는 함수
- Push() : 항목을 기억공간에 저장하기 위한 함수
- Pop() : 저장된 항목을 꺼내기 위한 함수
2. FIFO 구조로 동작하는 자료구조인 큐 클래스
- 최대 MAX개의 항목을 사용할 수 있는 하나의 큐를 1차원 배열로 선언한다. (int queue[MAX])
- 큐에 자료를 삽입할 때 기준이 되는 변수를 선언한다. (int rear)
- 큐에서 자료를 삭제할 때 기준이 되는 변수를 선언한다. (int front)
- 생성자 : 큐가 생성될 때 항목을 삽입하고 꺼내오기 위한 위치가 0으로부터 시작하도록 한다.
- put() : 항목을 기억공간에 저장하기 위한 함수
- get() : 저장된 항목을 꺼내기 위한 함수
3. 문자열을 다루기 편리하기 위한 MyString 클래스
- 깊은 복사를 하는 복사 생성자를 다음과 같은 형태로 명시적으로 정의해야 한다.
클래스명 (const 클래스명 &객체명)
- 깊은 복사를 하는 대입 연산자도 다음과 같은 형태로 오버로딩해야 한다.
클래스명 & operator=(const 클래스명 &객체명)
- 두 문자열을 결함하기 위한 + 연산자와 대괄호([]) 안에 첨자를 지정하여 해당 위치의 문자값 하나를 알아내기 위해서는 [] 연산자와 두 문자열을 비교히기 위해서 == 관계 연산자를 오버로딩해야 한다.
출처 : C++ 프로그래밍 기초 객체지향의 시작 - 한빛미디어
'Info' 카테고리의 다른 글
Info - 텍스트 파일의 인코딩 종류 (0) | 2016.08.31 |
---|---|
Network - 서브넷마스크 (0) | 2016.08.31 |
Info - CPU 스케줄링 (0) | 2016.08.31 |
Info - JAVA 환경변수 설정 (0) | 2016.08.31 |
Info - 소켓통신 Well known port (0) | 2016.08.31 |