본문 바로가기
프로그래밍언어/C++

[C++] C++ 언어의 기초 (2) - 흐름제어, 구초체와 클래스, 포인터

by qkzkdo 2023. 8. 23.
728x90

조건문

if문

if(조건) {
    문장 1; //조건이 참일 때 실행할 문장
} else{
    문장 2; //조건이 거짓일 때 실행할 문장
}

 

switch문

switch(정수형_수식) {
case1:
    문장1; //정수형 수식의 값이 값1일 대 실행할 문장들을 나열
    break; //switch문을 빠져나가게 함
case2:
    문장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

728x90

'프로그래밍언어 > 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