C++ (8)
Day 12
Constructor of Inheritance
constructor.cpp
1 | #include <iostream> |
Output
1 | size = 32 |
Virtual Function & Overriding
- Virtual function
virtual
키워드로 선언된 멤버 함수- 동적 바인딩 지시어
- 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시
- Function overriding
- 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언
- 기본 클래스 : 가상 함수의 존재감 상실
- 파생 클래스 : 오버라이딩한 함수가 호출되도록 동적 바인딩
- 함수 재정의라고도 부름
- 다형성의 한 종류
- 조건
virtual
으로 함수 선언(파생 클래스는 생략 가능)- upcasting
- 함수 동일
overriding.cpp
1 | #include <iostream> |
Output
1 | GrandDerived |
destructor1.cpp
1 | #include <iostream> |
Output
1 | ~Base |
destructor2.cpp
1 | #include <iostream> |
Output
1 | ~GrandDerived |
Overloading vs. Overrding
- Overloading
- 이름만 같은 함수 중복 작성
- 하나의 클래스
- Overriding
- 모든 것이 완벽히 같은 함수 재작성
- 상속
Quiz
quiz.cpp
1 | #include <iostream> |
Output
1 | 스택에 삽입할 5개의 정수를 입력하라>> 34 52 41 12 78 |
Day 13
Interface
- 인터페이스만 선언하고 구현을 분리하여 작업자마다 다양한 구현 가능
- 사용자는 구현의 내용을 모르지만 인터페이스에 선언된 순수 가상 함수가 구현되어있기 때문에 호출하여 사용하기만 하면 됨
shape.cpp
1 | #include <iostream> |
Output
1 | Circle |
Abstract Class
- 최소한 하나의 순수 가상 함수를 가진 클래스
- 온전한 클래스가 아니므로 객체 생성 불가능
- 추상 클래스의 포인터는 선언 가능
- 순수 가상 함수를 통해 파생 클래스에서 구현할 함수의 형태(원형)을 보여주는 인터페이스 역할
calculator.cpp
1 | #include <iostream> |
Output
1 | 정수 2개를 입력하세요>>4 3 |
Generalization of Function
- Generic 혹은 일반화
- 함수나 클래스를 일반화시키고, 매개변수 타입을 지정하여 틀에서 찍어내듯이 함수나 클래스 코드를 생산하는 기법
- Template
- 함수나 클래스를 일반화하는
C++
도구 template
키워드로 함수나 클래스 선언- Generic type - 일반화를 위한 Data type
- 함수나 클래스를 일반화하는
sum.cpp
1 | #include <iostream> |
Output
1 | 3 |
search.cpp
1 | #include <iostream> |
Output
1 | 100이 배열 x에 포함되어 있다. |
Generalization of Class
- 선언 :
template<class T>
- class의 정의 앞에 선언
- 선언부, 구현부 - 멤버 함수 앞 선언
T class<T>::function(T param);
- 일반화할 변수만
T
로 선언
generic.cpp
1 | #include <iostream> |
Output
1 | 0 10 20 |
gclass.cpp
1 | #include <iostream> |
Output
1 | a = 2 b = 0.5 |
Quiz
quiz.cpp
1 | #include <iostream> |
Output
1 | 빈대떡 넓이는 628 |
Day 14
STL
- STL(Standard Template Library)
- 표준 템플릿 라이브러리
- 많은 제네릭 클래스와 제네릭 함수 포함
- STL의 구성
- 컨테이너 : 템플릿 클래스
- 데이터를 담아두는 자료 구조를 표현한 클래스
- 리스트, 큐, 스택, 맵, 셋, 벡터
- iterator : 컨테이너 원소에 대한 포인터
- 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터
- 알고리즘 : 템플릿 함수
- 컨테이너 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 템플릿 함수
- 컨테이너의 멤버 함수 아님
- 컨테이너 : 템플릿 클래스
STL 컨테이너의 종류
컨테이너 클래스 | 설명 | 헤더 파일 |
---|---|---|
vector | 동적 크기의 배열을 일반화한 클래스 | <vector> |
deque | 앞뒤 모두 입력 가능한 큐 클래스 | <deque> |
list | 빠른 삽입/삭제 가능한 리스트 클래스 | <list> |
set | 정렬된 순서로 값을 저장하는 집합 클래스, 값은 유일 | <set> |
map | (key, value)쌍으로 값을 저장하는 맵 클래스 | <map> |
stack | 스택을 일반화한 클래스 | <stack> |
queue | 큐를 일반화한 클래스 | <queue> |
STL iterator의 종류
iterator의 종류 | iterator에 ++ 연산 후 방향 |
read/write |
---|---|---|
iterator | 다음 원소로 전진 | read/write |
const_iterator | 다음 원소로 전진 | read |
reverse_iterator | 지난 원소로 후진 | read/write |
const_reverse_iterator | 지난 원소로 후진 | read |
STL 알고리즘 함수들
- copy
- merge
- random
- rotate
- equal
- min
- remove
- search
- find
- move
- replace
- sort
- max
- partition
- reverse
- swap
Vector
- 가변 길이 배열을 구현한
Generic
클래스 - 원소의 저장, 삭제, 검색 등 다양한 멤버 함수 지원
- 벡터에 저장된 원소는 인덱스로 접근 가능
vector.cpp
1 | #include <iostream> |
Output
1 | 1 2 3 |
Iterator
- 반복자라고도 부름
*
,++
연산자 사용 가능- 컨테이너의 원소를 가리키는 포인터
iterator.cpp
1 | #include <iostream> |
Output
1 | 5개의 정수를 입력하시오. |
Algorithm
- 탐색(
find
) : 컨테이너 안에서 특정한 자료를 찾음 - 정렬(
sort
) : 자료들을 크기 순으로 정렬param1
: 정렬을 시작한 원소의 주소param2
: 소팅 범위의 마지막 원소 다음 주소
- 반전(
reverse
) : 자료들의 순서 역순 - 삭제(
remove
) : 조건이 만족되는 자료 삭제 - 변환(
transform
) : 컨테이너 요소들을 사용자가 제공하는 변환 함수에 따라 변환
algorithm.cpp
1 | #include <iostream> |
Output
1 | 모든 원소를 출력한다.>>waffle pizza donut pizzaLarge |
C++ (7)
C++ (6)
Day 5
Object
oval.cpp
1 | #include <iostream> |
Output
1 | width = 10, height = 20, Area = 628 |
Object Pointer
- 객체에 대한 포인터
- 객체의 주소 값을 가지는 변수
- 포인터로 멤버를 접근할 때
객체포인터->멤버
circle1.cpp
1 | #include <iostream> |
Output
1 | 3.14==3.14 |
circle2.cpp
1 | #include <iostream> |
Output
1 | 3.14 |
Object Array
- 객체 배열 선언 가능
- 기본 타이 배열 선언과 형식 동일
Circle c[3];
- 기본 타이 배열 선언과 형식 동일
- 객체 배열 선언
- 객체 배열을 위한 공간 할당
- 배열의 각 원소 객체마다 생성자 실행
- 매개변수 없는 생성자 호출
- 매개변수 있는 생성자를 한번에는 호출할 수 없음
Circle c[3] = {Circle(10), Circle(20), Circle()};
- 배열 소멸
- 배열의 각 객체마다 소멸자 호출
- 생성의 반대순으로 소멸
circle1.cpp
1 | #include <iostream> |
Output
1 | Circle 0의 면적은 314 |
circle2.cpp
1 | #include <iostream> |
Output
1 | c[0]의 면적은 314 |
Dynamic Memory
1 | 데이터타입 *포인터변수 = new 데이터타입; |
- 정적 할당
- 변수 선언을 통해 필요한 메모리 할당
- 많은 양의 메모리는 배열 선언을 통해 할당
- 동적 할당
- 필요한 양이 예측되지 않는 경우, 프로그램 작성 시 할당 받을 수 없음
- 실행 중에 운영체제로부터 할당 받음
- 힙(
heap
)으로부터 할당 - 힙은 운영체제가 소유하고 관리하는 메모리, 모든 프로세스가 공유할 수 있는 메모리
- 힙(
C
의 동적 메모리 할당malloc()
free()
C++
의 동적 메모리 할당, 반환new
연산자- 기본 타입 메모리 할당, 배열 할당, 객체 할당, 객체 배열 할당
- 객체의 동적 생성 - 힙 메모리로부터 객체를 위한 메모리 할당 요청
- 객체 할당 시 생성자 호출
delete
new
로 할당 받은 메모리 반환- 객체의 동적 소멸 - 소멸자 호출 뒤 객체를 힙에 반환
Data Type | 정적 할당 | 동적 할당 |
---|---|---|
Integer | int a = val; int *pa = &a; |
int *p = new int(val); |
Array | int arr[num]; |
int *parr = new int[100]; |
Object | Class instance(val); Class *pc = &instance; |
Class *pc = new Class; |
circle.cpp
1 | #include <iostream> |
Output
1 | 정수 반지름 입력(음수이면 종료 >> 5 |
This Pointer
- 현재의 실행중인 객체를 가리키는
pointer
변수 - 포인터, 객체 자신 포인터
- 클래스의 멤버 함수 내에서만 사용
- 개발자가 선언하는 변수가 아닌 컴파일러가 선언한 변수
- 용도
- 매개변수 이름 == 멤버 변수 이름
- 매개변수가 자신의 객체주소를
return
- 사용범위
- 멤버 함수
Quiz
quiz1.cpp
1 | #include <iostream> |
Output
1 | 입력하려는 정수의 개수는? 5 |
quiz2.cpp
1 | #include <iostream> |
Output
1 | 입력하려는 원의 개수는? 3 |
Day 6
string
- 문자열 생성
string str0("name");
string str1 = "name";
string str2(str);
- 복사생성자- 주의 : 문자열 끝에
'\0(NULL)
가 없음
- 문자열 연산자
- 산술 연산자
+=
,+
- 관계 연산자
>=
,<=
,>
,<
,!=
,==
- 비교는 사전식
- 배열처럼 사용 가능
- 산술 연산자
- 문자열 변환 함수
- 문자열 -> 숫자
stoi();
stof();
stod();
- 숫자 -> 문자열
to_string();
- 문자열 -> C언어 문자열(
\0
)str.c_str();
- 문자열 -> 숫자
- 문자열 크기 함수
str.size();
str.length();
str.capacity();
- 시스템이 정해줌
- 문자열 조작 함수
str.append(string);
- 문자열 뒤에 파라미터의 문자열 추가
str.substr(시작 index, 크기);
- 시작부터 크기만큼 추출
str.replace(index, length, string);
index
에서length
만큼string
으로 대체
str.find(string, index);
index
부터string
이 시작하는 위치int
값으로return
str.resize(unsigned, char);
- 숫자만큼의 크기로 바꾸며 남는다면
char
으로 채움
- 숫자만큼의 크기로 바꾸며 남는다면
string1.cpp
1 | #include <iostream> |
Output
1 |
|
string2.cpp
1 | #include <iostream> |
Output
1 | 문자열을 입력하세요 : asdfasdfasdfasdf |
string3.cpp
1 | #include <iostream> |
Output
1 | 1945년8월15일 |
Call by Reference
1 | int n = 0; |
- 참조 변수
- 참조자
&
의 도입 - 이미 존재하는 변수에 대한 다른 이름(별명)을 선언
- 참조 변수는 이름만 존재
- 참조 변수에 새로운 공간 할당 X
- 초기화로 지정된 기존 변수 공유
- 참조자
reference1.cpp
1 | #include <iostream> |
Output
1 | i n refn |
reference2.cpp
1 | #include <iostream> |
Output
1 | 정수 값으로 반지름을 입력하세요 >> 3 |
reference3.cpp
1 | #include <iostream> |
Output
1 | 0 1 2 3 4 5 6 7 8 9 |
Quiz
quiz.cpp
1 | #include <iostream> |
Output
1 | ***** 갬블링 게임을 시작합니다. ***** |
Day 7
Dynamic Memory
stack.cpp
1 | #include <iostream> |
Output
1 | 0 1 2 3 4 5 6 7 8 9 |
Return Reference
return_ref1.cpp
1 | #include <iostream> |
Output
1 | a |
return_ref2.cpp
1 | #include <iostream> |
Output
1 | Zerohertz |
reference.cpp
1 | #include <iostream> |
Output
1 | addConst |
return_ref3.cpp
1 | #include <iostream> |
Output
1 | addConst |
Shallow Copy & Deep Copy
- Shallow copy
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본 객체가 할당 받은 메모리를 공유하는 문제 발생
- Deep copy
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본이 가진 메모리 크기만큼 별도로 동적 할당
- 원본의 동적 메모리에 있는 내용을 사본에 복사
- 완전한 형태의 복사
- 사본과 원본은 메모리를 공유하는데 문제 없음
shallow1_copy.cpp
1 | #include <iostream> |
Output
1 | untitled(997,0x11451edc0) malloc: *** error for object 0x7fefdc405980: pointer being freed was not allocated |
shallow2_copy.cpp
1 | #include <iostream> |
Output
1 | untitled(1347,0x11c7dddc0) malloc: *** error for object 0x7f9184c05970: pointer being freed was not allocated |
Copy Constructor
copy_constructor1.cpp
1 | #include <iostream> |
Output
1 | 복사 생성자 실행, 원본 객체의 이름 : zerohertz |
copy_constructor2.cpp
1 | #include <iostream> |
Output
1 |
|
객체에서 동적 메모리 사용 시 복사 생성자 직접 생성
C++ (5)
Day 1
C와의 차이점
#include <stdio.h>
->#include <iostream>
- 형식지정자 필요없어짐
.h
사라짐- 호환은 가능
class
의 개념- object
bool
의 개념- C
- 참 : 0 이외의 값
- C++
- true : 1
- false : 0
- C
string
의 개념
Practice
practice.cpp
1 | #include <iostream> |
Output
1 | 1. a + b / 3 * 3 = 14 |