c++ ⇒ 절차 지향 & 구조적 프로그래밍 언어 & 객체 지향 프로그래밍 언어 & 일반화 프로그래밍 언어
처리과정
소스코드 ⇒ 전처리기 → 컴파일러 → 오브젝트파일 → 링커 → 실행파일
#include → 외부에서 선언된 함수나 상수 등을 사용하기 위해 헤더 파일 내용을 파일에 포함한다.
c++는 헤더파일에 확장자가 없다.
iostream
cout 객체 → 출력 스트림을 나타내는 객체
std::cout << 출력할데이터;
cin 객체 → 입력 스트림을 나타내는 객체
std::cin >> 저장할 변수
c++ 표준 입출력 객체는 입출력 데이터의 타입을 자동으로 변환시켜준다.
상수
symbolic constant
선언과 동시에 반드시 초기화해야하는 것. 매크로를 이용하거나 const키워드를 이용하여 선언할 수 있다.
const int ages = 30;
→ 상수의 타입을 명시적으로 지정할 수 있다.
→ 구조체와 같은 복잡한 사용자 정의 타입에도 사용할 수 있다.
→ 해당 심볼릭 상수를 특정함수나 파일에서만 사용할 수 있도록 제한할 수 있다.
타입 변환
묵시적 타입 변환 → 자동
char → short → int → long → float → double → long double
명시적 타입 변환 → 강제
casting→ double (num1) or (double) num1/num2
몇 가지 추가 연산자
1.
범위 지정 연산자
식별자 → 변수,함수,열거체
범위 지정 연산자를 변수 이름 앞에 붙이면 해당 변수는 전역으로 사용하라는 의미로 쓰인다.
::식별자
클래스이름::식별자
네임스페이스::식별자
열거체::식별자
2.
멤버 포인터 연산자
클래스의 멤버를 가리키는 포인터를 정의할 수 있다.
피연산자 = 클래스 타입의 객체인경우 ( .* )
⇒ 피연산자.* 멤버이름
피연산자 = 클래스 타입의 객체를 가리키는 포인터인 경우 ( →* )
⇒ 피연산자 →*멤버이름
3.
typeid 연산자
typeid(표현식) ⇒ 객체의 타입에 관한 정보를 확인
조건문
if(조건){
//
}
else if(조건){
//
}
else(조건){
}
삼항연산자 ⇒ 조건식? 반환값1:반환값2
switch ⇒ 조건 값으로는 int형으로 승격할 수 있는 값만 사용가능( char,short,int형 변수와 열거체 )
switch(조건값)
{
case 값1:
expression
break;
case value2:
expression;
break;
default:
expression
break;
}
반복문
while(조건식){
선 체크 후 행동
}
do{
선 행동 후 체크
}while(조건식);
for(초기식; 조건식; 증감식){
expression;
}
for (i = 0; i < num; i++)
{
cout << "for 문이 현재 " << i + 1 << " 번째 반복 수행중입니다." << endl;
}
cout << "for 문이 종료된 후 변수 i의 값은 " << i << "입니다." << endl;
범위 기반의for문
int arr[5] = {1,3,5,7,9};
for(int element:arr)
{
cout << element << "";
}
C++
복사
배열
type name[배열길이];
선언만 하고 초기화하지 않으면, 모든 배열 요소가 쓰레기값으로 채워진다.
int sum = 0;
int grade[3];
grade[0]=85;
grade[1]=65;
grade[2]=90;
for(int i = 0;i<3;i++){
sum += grade[i];
}
cout << sum
C++
복사
선언과 동시에 초기화하기 ⇒ 선언할 때 이뤄져야함. 선언한 이후에는 이 방식으로 배열 요소를 초기화할 수 없다.
type name[배열길이] = {배열요소1,2,...}
값을 명시하지 않고, 괄호만을 이용하여 초기화하면 모든 배열 요소를 0으로 초기화할 수 있다.
Ex) type name[배열길이] = {}
초기화시 narrowing casting을 허용하지 않는다.
Pointer
저장된 메모리의 시작 주소, 4바이트짜리다.
int n = 100;
init *ptr = &n;
연산자 ⇒ 주소 연산자(&) , 참조 연산자(*)
주소 연산자 ⇒ 해당 변수의 주소값을 반환한다
참조 연산자 ⇒ 포인터의 이름이나 주소 앞에 사용하여 포인터에 저장된 주소에 저장되어있는 값을 반환
선언
type * 포인터 이름;
두 개의 포인터를 선언하려면? → int *ptr1, *ptr2;
초기화
포인터를 선언한 후 참조 연산자를 사용하기 전에 포인터는 반드시 초기화되어야한다.
초기화하지 않은 채로 참조 연산자를 사용하면, 어딘지 알 수 없는 메모리 장소에 값을 저장하는 것.
따라서 선언과 동시에 초기화를 하는 것이 좋다.
int x = 7; // 변수의 선언
int *ptr = &x; // 포인터의 선언
int **pptr = &ptr; // 포인터의 참조, 이중 포인터
C++
복사
포인터 연산의 경우 → 포인터가 가르키고 있는 변수의 타입만큼 증가한다.
int형 포인터의 경우 4바이트, char형 포인터의 경우 1바이트 증가
배열의 이름과 포인터는 서로 동일한 느낌이다. (물론 세밀하게 따지고 들어가면 다르다)
메모리 동적 할당
new연산자
타입 * 포인터이름 = new 타입;
delete 포인터 이름
문자열
1.
C언어 스타일의 문자열
""를 사용하는 문자열 → 문자열 상수라고 한다.
문자열의 이름이 없고, 문자열의 내용 또한 변경할 수 없기 때문
문자형 배열로 선언된 문자열 변수는 문자열의 끝을 프로그램에 따로 알려줘야한다.
문자열에 속한 데이터가 끝나면 널 문자를 넣어준다.
이 널 문자를 이용해서 데이터 배열과 실제 문자열을 구분해야한다.
띄어쓰기가 들어가면 안된다. c++의 cin객체는 띄어스기를 포함한 탭 문자, 캐리지 리턴 등 화이트스페이스를 모두 문자열의 끝으로 인식한다. 띄어스기를 포함한 문자열을 전부 받으려면 cin 객체의 get()메소드를 사용해야함
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
cout << "자신의 이름을 적어주세요 :";
cin.get(name,SIZE).get();
cout << "자신이 살고 있는 도시를 적어주세요 :";
cin.get(address.SIZE).get();
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
JavaScript
복사
2.
string 클래스를 이용한 문자열
string dog;
cout << "현재 dog 변수의 길이는" << dog.length() << "입니다."" << endl;
dog = "Navi";
cout << dog << "!정말 이쁜 이름이네요!" << endl;
cout << "현재 dog변수의 길이는 " << dog.length()<< "입니다." << endl;
cout << "강아지 이름의 첫 글자는 바로" << dog[0] << "입니다.";
C++
복사
string 객체를 생성한 것이다.
length()나 size()메소드를 사용해서 객체의 현재 길이를 알 수 있다.
배열처럼 인덱스로 다룰 수도 있다.
string str1 = "c++ is Cool!";
string str2;
str2 = str1;
cout << str2;
string str3;
str3 = str1 + str2;
cout << str3 << endl;
str1+=str2;
cout << str1;
C++
복사
여려가지 메소드들
length(), size() , append(), find(), compare(), replace(), capacity(), max_size()
capacity() ⇒ 무자열이 재대입 받지 않고 저장할 수 있는 최대 문자열의 길이
max_size() ⇒ 해당 문자열이 최대한 대입받으면 가질 수 있는 최대 문자열의 길이를 반환
구조체
구조체의 변수 ⇒ 멤버 변수
struct 구조체 이름{
멤버들
}
접근 방법 → web_book.author
중괄호를 이용한 초기화 리스트를 사용하여 초기화
구조체를 인수로 전달하는 방식은 함수가 원본 구조체의 복사본을 가지고 작업하므로 안전하다.
구조체를 가리키는 포인터를 인수로 전달하면 복사본이 아닌 주소 하나만을 전달하므로 빠르다.
다만, 원본 데이터의 보호 측면에서는 위험하다.
const 키워드를 사용하여 함수에 전달된 인수를 함수 내에서는 직접 수정할 수 없도록 할 수 있다.
공용체
union 키워드를 사용한다. 다만 모든 멤버 변수가 하나의 메모리 공간을 공유한다.
모든 멤버 변수가 같은 메모리를 공유하기 때문에 공용체는 한 번에 하나의 멤버 변수밖에 사용할 수 없다.
열거체
enum ⇒ 새로운 타입을 선언하면서 동시에 그 타입이 가질 수 있는 정수형 상수값도 같이 명시한다.
함수
call by value
call by reference ⇒ 원본 데이터를 직접 전달하는 것이며, 포인터를 이용하여 변수의 주소값을 전달한다.
메인 함수의 경우 원형
void main (int argc, char *argv[]);
argc ⇒ 인수로 전달되는 문자열의 개수를 명시
char형 포인터 ⇒ 인수로 전달된 각각의 문자열이 포함되는 배열을 가리킨다.
함수 포인터
프로그램이 실행될 때 모두 메인 메모리에 올라가는데
함수의 이름 = 메모리에 올라간 함수의 시작 주소를 가리키는 포인터 상수
함수의 시작 주소를 가리키는 포인터 상수를 함수 포인터라고 한다.
함수 포인터의 포인터 타입은 함수의 반환값과 매개변수에 의해 결정된다.
void Func(int,int);
void (*ptr_func)(int,int);
C++
복사
함수 포인터는 함수를 또 다른 함수의 인수로 전달할 때 유용하게 사용된다.
#include <iostream>
using namespace std;
double Add(double,double);
double Sub(double,double);
double Mul(double,double);
double Div(double,double);
double calculator(double,double,double(*func)(double,double));
int main(void){
double(*calc)(double,double) = NULL;
double num1 = 3, num2 = 4, result = 0;
char oper = '*';
switch(oper)
{
case '+':
calc = Add;
break;
case '-':
calc = Sub;
break;
case '*':
cacl = Mul;
break
case '/':
cacl = Div;
break;
default:
cout << "사칙연산만을 지원";
}
}
C++
복사
표기법이 복잡하다.
typedef 키워드 , auto 키워드
typedef double (*CalcFunc)(double,double);
CalcFunc ptr_func = calc;
함수 포인터 별칭을 하나의 자료형으로 사용할 수 있다!
참조자
크기가 큰 구조체와 같은 데이터를 함수의 인수로 전달해야 할 경우에 사용
int 변수이름;
int& 참조자이름 = 변수이름 // 참조자 선언
&연산자는 주소 연산자가 아닌 타입을 식별하기 위해 사용하는 식별자로 사용
int&은 int형 변수에 대한 참조를 의미한다.
C++
복사
a.
참조자의 타입은 대상이 되는 변수의 타입과 일치해야한다.
b.
참조자는 선언과 동시에 초기화되어야한다.
c.
참조자는 한 번 초기화되면, 참조하는 대상을 변경할 수 없다.
함수 내의 참조 연산자를 사용하지 않으므로, 함수 내부의 코드가 깔끔하고 직관적이다.
함수의 호출이 값에 의한 전달 방법과 같은 형태가 되어서, 코드를 읽기가 쉽지 않다.
참조자를 리턴하는 것은 리턴하는 그 객체 자체를 리턴하는 것이다. 원래는 복사해서 리턴하는 것이다.
디폴트 인수의 설정
a.
디폴트 인수는 함수의 원형에서만 지정
b.
디폴트 인수는 가장 오른쪽부터 시작하여 순서대로만 지정한다
c.
가운데 인수들만 별도로 디폴트 인수를 지정할 순 없다.
함수 오버로딩
함수 오버로딩은 같은 이름의 함수를 중복하여 정의하는 것을 ㅡ이미한다.
여러 함수를 하나의 이름으로 연결해준다.
같은 일을 처리하는 함수를 매개변ㄴ수의 형식을 조금씩 달리하여, 하나의 이름으로 작성할 수 있게끔 하는 것.
다형성의 구현이다.
클래스
클래스 멤버 변수를 프로퍼티, 멤버 함수를 메소드라고 한다.
추상화, 캡슐화, 정보 은닉, 상속성, 다형성
사용자가 정의할 수 있는 일종의 타입이다.
클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체를 선언해야함.
class 클래스이름{
private:
public:
}
C++
복사
void Book::Move(int page){ current_page = page;} → 클래스 바깥에서 정의해서 사용하는 경우