1. 객체 치환 및 객체 리턴
▪ 동일한 클래스 타입의 객체끼리 치환 가능
▪ 객체의 모든 데이터가 비트 단위로 복사선언부
▪ 치환된 두 객체는 현재 내용물만 같을 뿐 독립적인 공간 유지
2. 참조와 함수
참조란?
- 가리킨다는 뜻으로, 이미 존재하는 객체나 변수에 대한 별명
- 참조 변수, 참조에 의한 호출, 참조 리턴 등의 활용
참조 변수
▪ 참조자 &의 도입
▪ 이미 존재하는 변수에 대한 다른 이름(별명)을 선언
▪ 참조 변수는 이름만 생김
▪ 참조 변수에 새로운 공간을 할당하지 않음
▪ 초기화로 지정된 기존 변수를 공유함
▪ 참조 변수에 대한 포인터를 만들 수 있음
▪ 참조 변수에 대한 참조 선언이 가능함
참조 변수 사용 사례
참조에 의한 호출, Call by Reference
- 참조를 가장 많이 사용하는 사례
함수 형식
▪ 함수의 매개 변수를 참조 타입으로 선언
▪ 참조 매개 변수(reference parameter)라고 부름
▪ 참조 매개 변수는 실인자 변수를 참조함
▪ 참조매개 변수의 이름만 생기고 공간이 생기지 않음
▪ 참조 매개 변수는 실인자 변수 공간 공유
▪ 참조 매개 변수에 대한 조작은 실인자 변수 조작 효과
C++의 함수 리턴
▪ 함수는 값 외에 참조 리턴 가능
▪ 참조 리턴
▪ 변수 등과 같이 현존하는 공간에 대한 참조 리턴
▪ 변수의 값을 리턴하는 것이 아님
[예제 5] – [참조 매개 변수로 평균 리턴하기]
#include <iostream>
using namespace std;
bool average(int a[], int size, int& avg) {
if(size <= 0)
return false;
int sum = 0;
for(int i=0; i<size; i++)
sum += a[i];
avg = sum/size; return true;
}
int main() {
int x[] = {0,1,2,3,4,5};
int avg;
if(average(x, 6, avg)) cout << "평균은 " << avg << endl;
else cout << "매개 변수 오류" << endl;
if(average(x, -2, avg)) cout << "평균은 " << avg << endl;
else cout << "매개 변수 오류 " << endl;
}
void increaseCircle(Circle &c) {
int r = c.getRadius();
c.setRadius(r+1);
}
int main() {
Circle waffle(30);
increaseCircle(waffle);
cout << waffle.getRadius() << endl;
STL(Standard Template Library)
▪ 표준 템플릿 라이브러리
▪ C++ 표준 라이브러리 중 하나
▪ 컨테이너(container)와 알고리즘(algorithm)을 일반화한 자료구조 라이브러리
▪ 많은 제네릭 클래스와 제네릭 함수 포함
▪ 어떤 자료형에도 적용할 수 있음
STL 핵심 구성요소
컨테이너
– 템플릿 클래스
▪ 데이터를 담아두는 자료 구조를 표현한 클래스
▪ 리스트, 큐, 스택, 맵, 셋, 벡터
iterator(반복자)
– 컨테이너 원소에 대한 포인터
▪ 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인
터
알고리즘
– 템플릿 함수
▪ 컨테이너 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 템플릿 함수
▪ 컨테이너의 멤버 함수 아님
헤더파일
컨테이너 클래스를 사용하기 위한 헤더 파일
▪ 해당 클래스가 선언된 헤더 파일 include
예) vector 클래스를 사용하려면 #include <vector>
list 클래스를 사용하려면 #include <list>
알고리즘 함수를 사용하기 위한 헤더 파일
▪ 알고리즘 함수에 상관 없이 #include <algorithm>
이름 공간
▪ STL이 선언된 이름 공간은 std
컨테이너의 종류
vector 컨테이너
▪ 가변 길이 배열을 구현한 제네릭 클래스
▪ 벡터에 저장된 원소는 인덱스로 접근 가능 - 인덱스는 0부터 시작
▪ 원소의 저장, 삭제, 검색 등 다양한 멤버 함수 지원
[예제 1] – [vector 컨테이너 활용하기]
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; // 정수만 삽입 가능한 벡터 생성
v.push_back(1); // 벡터에 정수 1 삽입
v.push_back(2); // 벡터에 정수 2 삽입
v.push_back(3); // 벡터에 정수 3 삽입
for(int i=0; i<v.size(); i++) // 벡터의 모든 원소 출력
cout << v[i] << " "; // v[i]는 벡터의 i 번째 원소
cout << endl;
v[0] = 10; // 벡터의 첫 번째 원소를 10으로 변경
int n = v[2]; // n에 3이 저장
v.at(2) = 5; // 벡터의 3 번째 원소를 5로 변경
for(int i=0; i<v.size(); i++) // 벡터의 모든 원소 출력
cout << v[i] << " "; // v[i]는 벡터의 i 번째 원소
cout << endl;
}
'개발 > C++' 카테고리의 다른 글
[C++] Static (0) | 2022.11.20 |
---|---|
[C++] 함수 중복 | 디폴트 매개변수 (feat. 복사 생성자) (0) | 2022.11.13 |
[C++ 10.18 7주차 수업] (0) | 2022.10.18 |
[C++] 템플릿 (0) | 2022.06.28 |
[C++] 캐릭터 관리 프로그램 (0) | 2022.06.28 |