조건문
if문
if(조건) {
문장 1; //조건이 참일 때 실행할 문장
} else{
문장 2; //조건이 거짓일 때 실행할 문장
}
switch문
switch(정수형_수식) {
case 값1:
문장1; //정수형 수식의 값이 값1일 대 실행할 문장들을 나열
break; //switch문을 빠져나가게 함
case 값2:
문장2; //정수형 수식의 값이 값2일 대 실행할 문장들을 나열
break; //switch문을 빠져나가게 함
.....
default : //정수형 수식의 값과 일치하는 case 값이 없을 때
문장n; //실행할 문장들을 나열
}
반복문
for문
for(초기화; 반복조건; 증감) {
문장;
}
for(원소선언 : 데이터집합) {
문장;
}
while문
while(반복 조건) {
문장;
}
do ... while 문
do {
문장;
} while(반복조건);
break 명령은 반복문을 빠져가가게 함
continue 명령은 반복문 믈록의 나머지 부분을 건너뛰게 함
구조체와 클래스
구조체
사용자 정의 자료형
struct를 사용하여 만들 수 있다.
struct StructName {
Type1 item1;
type2 item2;
....
};
사용자가 정의한 자료형을 C++에서는 구조체(structure)라고 하며, 일반적으로는 레코드(record)라고 한다.
정의된 구조체를 저장하는 변수는 다음과 같이 선언한다.
StructName varName;
varName.item1 //점 표기법(dot notation)
클래스
클래스는 표현하고자 하는 대상의 데이터와 함께 이에 대해 필요한 여러 가지 동작을 나타내는 함수들을 묶어 놓은 것이다.
struct C2dType { //2차원 좌표 구조체
double x, y;
}
calss CircleClass { //원 클래스
C2dType center; //중심좌표
double radius; //반경
}
배열, 포인터, 참조
배열
1차원 배열 선언문
TypeName arrName[n];
TypeName arrName2[3] = {1, 2, 3};
다차원 배열 선언문
int Arr2D[4][3];
포인터
포인터의 사용
포인터(pointer)란 다른 변수, 구조체, 객체 등을 가리키는 변수로서 메모리의 주소와 직접적으로 연관된다. 포인터 변수는 다음과 같이 자료형 명칭에 *를 사용하여 선언한다.
TypeName *ptrVar;
ptrVar는 포인터 변수로서, TypeName형의 데이터를 가리킨다.
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *ptr;
ptr = &a; //ptr에 a의 주소를 넣음
cout << "ptr가 가리키는 값: " << *ptr << endl;
*ptr = 20;
cout << "변수 a의 값: " << a << endl;
return 0;
}
결과
ptr가 가리키는 값: 10
변수 a의 값: 20
포인터가 가리키는 메모리의 값을 엑세스할 때에는 간접 엑세스 연산자(indirection operator)인 *를 포인터 변수 앞에 붙인다.
11행에서 ptr가 변수 a를 가리키고 있으므로 *ptr를 사용하는 것은 변수 a를 사용하는 것과 마찬가지이다.
구조체 및 객체의 포인터
기본 자료형뿐만 아니라 구조체나 객체에 대한 포인터도 사용할 수 있다.
struct C2dType {doube x, y;};
C2dType point;
C2dType *c2dPtr = &point;
(*c2dPtr).x
c2dPtr -> x //간편하게 표기
const 한정어와 포인터
int a = 10, b = 20;
const int *ipt = &a;
*ipt = 30; //error!
ipt = &b; //OK!
int a = 10, b = 20;
int *const ipt = &a;
*ipt = 30; //OK!
ipt = &b; //error!
int a = 10;
const int b = 20;
int *pt1 = &a; //OK
int *pt2 = &b; //오류
const int *pt3 = &b; //OK
메모리 할당 및 반환
동적 메모리 할당
때에 따라서는 필요할 때 기억공간을 할당하고 더 이상 그 공간이 필요하지 않으면 반환할 수 있어야 한다. 이와 같은 기능을 동적 메모리 할당(dynamic memory allocation)이라고 한다.
동적 메모리 할당으로 생성된 저장공간은 이름이 없어 변수처럼 그 이름을 통해 엑세스할 수 없다. 이러한 문제는 포인터를 이용하여 해결한다.
new와 delete
//메모리 할당
1. ptrVar = new TypeName;
2. ptrVar = new TypeName[n];
//메모리 반환
1. delete ptrVar;
2. delete []ptrVar;
nullptr
delete intPtr; //intPtr가 가리키는 공간 반환
intPtr = nullptr; //intPtr를 nullptr로 지정
공간을 반환하더라도 intPtr은 여전히 그 공간을 가리키고 있다. 그러나 그공간은 이미 반환된 것이므로, intPtr에 nullptr을 넣어 포인터가 가리키는 곳이 없음을 의미하도록 하는 것이 좋다.
포인터 연산
연산 | 처리 |
ptr + n | ptr의 n번째 뒤의 저장공간에 대한 포인터 |
ptr - n | ptr의 n번째 앞의 저장공간에 대한 포인터 |
ptr++ | ptr가 현재 위치의 다음 값을 가리키도록 한다. |
ptr-- | ptr가 현재 위치의 앞의 값을 가리키도록 한다. |
*(ptr + n) 및 ptr[n] | ptr로 부터 n번째 뒤에 저장된 값 |
*(ptr - n) 및 ptr[-n] | ptr로 부터 n번째 앞에 저장된 값 |
*ptr++ 또는 *ptr-- | *ptr의 값을 현재 수식에 사용하고, ptr가 다음 또는 이전 값을 가리키도록 한다. |
*++ptr 또는 *--ptr | 먼저 ptr가 다음 또는 이전 값을 가리키도록 한 후, 그 위치의 값을 수식에 사용한다. |
(*ptr)++ 또는 (*ptr)-- | ptr가 가리키는 곳의 값을 현재 수식에 사용한 후 그곳의 값을 1 증가 또는 감소시킨다. |
++(*ptr) 또는 --(*ptr) | ptr가 가리키는 곳의 값을 1 증가 또는 감소시킨 후 그 값을 현재 수식에 사용한다. |
참조
포인터와 유사한 개념을 지원하는 것으로 참조(reference)가 있다. 어떠한 변수에 대한 참조는 그 변수의 별명이라고 할 수 있다. 참조형은 '&' 기호를 이용하여 다음과 같은 형식으로 선언한다.
TypeName &refVar = varName;
refVar가 varName을 참조하도록 지정함으로써 앞으로 refVar를 사용하는 것이 varName을 사용하는 것과 동일한 결과를 내도록 하는 것이다.
int a = 10, b = 20;
int &aRef = a; //aRef는 정수형 변수 a에 대한 참조
cout << aRef << endl;
aRef = 100;
aRef = b;
참조가 어떤 변수를 참조하도록 초기화하는 것은 참조를 선언할 때에만 하며, 이후에는 참조 위치를 바꿀 수 없다.
aRef가 변수 b를 참조하도록 하는 것이 아니라, b의 값을 aRef가 참조하는 곳, 즉 a에 200을 넣는 것이다.
참조와 포인터의 차이점
1. 참조를 이용하여 값을 읽거나 저장할 때는 변수를 사용하는 형식과 동일한다.(*연산자 사용 x)
2. 참조는 초기화를 통해 반드시 어떤 대상을 참조해야만 하므로 아무것도 참조하지 않는 상황은 발생하지 않는다.
3. 참조는 초기화를 통해 지정된 참조 대상을 바꿀 수 없어 참조의 유호기간 동안 하나의 대상만 참조할 수 있다.
출처 : 전중남·이병래. 「C++프로그래밍」. 한국방송통신대학교출판문화원. 2020
'프로그래밍언어 > C++' 카테고리의 다른 글
[C++] 클래스와 객체(2) (0) | 2023.09.05 |
---|---|
[C++] 클래스와 객체(1) (0) | 2023.09.04 |
[C++] 함수 (0) | 2023.08.30 |
[C++] C++ 언어의 기초 (1) - 기본 자료형, 연산자 (0) | 2023.08.23 |
[C++] C++ 언어의 개요 (0) | 2023.08.23 |