본문 바로가기

IT/개발공부

C++ 언어 기초 (2) (흐름제어, 구조체, 클래스, 배열, 포인터, 메모리 할당, 참조)

반응형

 

 

 

 

 

 

본 게시물은 개인 공부용 포스트 입니다.

 

 

 

 

 

 

1. 흐름제어

기본적인 흐름제어 구조

  • 순차 구조 : 문장이 나열된 순서에 따라 차례로 실행하는 구조
  • 조건제어 구조 : 지정된 조건에 따라 실행 흐름을 제어하는 구조 (if문, switch문)
  • 반봅제어 구조 : 정해진 범위의 문장을 반복적으로 실행하게 하는 구조 (for문, while문, do ... while문)

 

 

if문

//사용 형식
if(조건)
	문장1;	// 참일때 실행할 문장 
else
	문장2;	// 거짓일 때 실행할 문장
    
//예
int a = 10;
int b = 20;
if(a < b)
	cout << b << endl;
else
	cout << a << endl;

 

 

 

switch문

//switch문 사용형식
switch(정수형_수식){
	case 값1: 문장1;
    	break;
    case 값2: 문장2;
    	break;
    ...
    default: 문장n;
}

//switch문 예
switch(score / 10){
	case 10: 
    case 9: grade = 'A';
    	break;
    case 8: greade = 'B';
    	break;
    case 7: grade = 'C';
    	break;
    case 6: grade = 'D';
    	break;
    default: grade = 'F';
}

 

 

 

for문

//for문 사용 형식
for(초기화문장; 반복조건; 증감문장)
	반복할 문장;
    
//for문 예
int val, total = 0;
for(int i=0; i<10; i++){
	cin >> val;
    total += val;
}

 

 

 

 

while문

//while문 사용형식
while(반복 조건)
	반복할 문장;

//예 (for 루프)
int val, total = 0;
for(int i=0; i<10; i++{
	cin >> val;
    tatal += val;
}

//예 (위의 for 루프와 똑같은 while 루프)
int val, total = 0;
{
	int i=0;
    while(i < 10){
    	cin >> val;
        total += val;
        i++;
    }
}

 

 

 

 

 

do...while문

//do...while문 사용형식
do
	반복할 문장;
while(반복조건);

 

 

 

 

2. 구조체와 클래스

구조체란?

여러 가지 자료형의 데이터 집합을 저장할 수 있는 새로운 자료형을 정의한 

 

 

구조체 선언

//구조체 선언 형식
struct StructName{
	Type1 item1;
    Type2 item2;
    ...
};

//예
struct CrcleType{
	C2dType center;
    double radius;
};

//구조체 데이터 처리하는 함수
double circleArea(CircleType c){
	return c.radius * c.radius * PI;
}

int main(){
	CircleType c1 = {{0, 0}, 10};
    cout << "원의 면적 : "
    	<< circleArea(c1) << endl;
}

 

 

 

 

클래스란?

표현하고자 하는 대상(객체)의 데이터(속성)와 함께 그 대상이 할 수 있는 동작을 나타내는 함수(행위)들을 묶어서 선언한 것

 

예를 들어,

'원' 클래스가 존재.

행위 init : 원의 초기화
area : 원의 면적을 계싼
chkOverlap : 다른 원과 중첩 여부 검사
display : 원의 정보 디스플레이
속성 center : 중심 좌표
radius : 반경
class CircleClass{
	C2dType center;
    double radius;
public:
	void init(double cs, double cy, double r){ ... }
    double area() const{ ... }
    bool chkOverlap(const CircleClass& c) const{ ... }
    void display() const{ ... }
};

 

 

 

 

 

3. 배열

배열이란?

동일한 자료형의 값을 여러 개 저장할 수 있는 연속적으로 할당된 공간을 묶어 하나의 이름을 갖는 변수로 만드는 것.

- 각각의 원소는 0번부터 시작하여 차례로 부여된 번호(인덱스)를 이용하여 액세스 함

 

 

배열 선언

// 1차원 배열 예
float fArray[4];
int i=0;
fArray[i] = 10.0f;
cin >> fArray[1] >> fArray[2] >> fArray[3];
cout << fArray[1] * fArray[2];

// 2차원 배열 예
int Arr2D[4][3];

 

 

배열 초기화

//초기화 예
int a[5] = {1, 2, 3, 4, 5};		// '='는 생랼 가능
int b[5] = {1, 2, 3};			// b[3]와 b[4]는 0으로 자동 초기화됨
int c[] = {1, 2, 3, 4, 5};		// 배열의 크기는 5
int d[2][3] = {1, 2, 3}, {4, 5, 6};	//2차원 배열의 초기화

 

 

 

 

4. 포인터와 동적 메모리 할당

포인터란?

어떠한 대상이 위치한 곳을 가리키는(주소를 저장하는) 변수.

 

 

포인터 선언 형식

TypeName* ptrVar;
//TypeName : 가리킬 값의 자료형
//ptrVar : 포인터 변수의 이름

 

 

 

포인터가 유효한 대상을 가리키게 한 후 사용한다.

ptrVar = &var;		// ptrVar이 var을 가리키게 함
*ptrVar = value;	// ptrVar을 사용하여 var을 액세스

& : 주소 계산 연산자

*ptrVar : 포인터 ptrVar가 가리키는 곳

 

 

 

 

포인터 사용 예

#include <iostream>
using namespace std;

int main(){
	int a = 10;
    int* ptr;
    
    ptr = &a;
    cout << "ptr이 가리키는 값 : " << *ptr << endl;	//a의 값인 10이 출력됨
    *ptr = 20;
    cout << "변수 a의 값 : " << a << endl;			//a의 값이 20으로 변경되어 출력됨
    return 0;
}

 

 

 

 

동적 메모리 할당이란?

프로그램 동작 중에 기억공간의 필요성 및 소요량을 결정하여 필요한 공간을 할당하는 것

  • 기억 공간의 생성 시점 : new 연산자의 실행 시점
  • 기억 공간의 소멸 시점 : delete 연산자의 실행 시점

포인터 변수가 할당된 기억 공간을 가리키게 한다.

//메모리 할당 연산자
ptrVar = new TypeName;
ptrVar = new TypeName[n];

//메모리 반납 연산자
delete ptrVar;
delete[] ptrVar

 

 

 

 

 

5. 참조

참조란?

어떠한 대상을 가리키는 값 (포인터와 유사)

참조 변수는 참조 대상의 별병처럼 사용하는 것.

 

l-value 참조 : 실체가 있는 대상(l-value)에 대한 참

(l-value는 대입 명령에 왼쪽에 있는 것)

(r-value는 대입 명령에 오른쪽에 있는 것)

 

l-value 참조 변수의 선언 형식

TypeName& refVar = varName;
//TypeName : 참조 대상의 자료형
//refVar : 참조 변수의 이름
//varName : 참조 대상

 

 

 

참조 변수 사용 예

int a = 10, b = 20;
int& aRef = a;			//aRef가 a를 참조하게 만듦
cout << aRef << endl;	// 10이 출력됨
aRef = 100;				// a의 값이 100으로 바뀜
aRef = b;				// a의 값이 200으로 바뀜

//위의 참조 예제를 포인터로 바꿨을 때
int a = 10, b = 20;
int* aPtr = &a;
cout << *aPtr << endl;
*aPtr = 100;
*aPtr = b;

 

 

 

 

const 참조 - 참조 변수가 참조하는 대상의 값을 바꿀 수 없다. (참조만 가능)

 const 참조 예)

int x{ 10 };
const int& xRef = x;
cout << xRef << endl;	//x의 값인 10이 출력됨
xRef += 10;		//오류

 

 

 

 

참조가 포인터와 다른 

  • 참조 변수를 이용하여 값을 읽거나 저장할 때 참조 대상 변수를 사용하는 형식과 동일
  • 참조 변수는 초기화를 통해 반드시 어떤 대상을 참조해야 함
  • 참조 변수는 초기화를 통해 지정된 참조 대상을 바꿀 수 없어 참조의 유효기간 동안 하나의 대상만 참조할 수 있음

 

 

 

 

r-value 참조란?

사용한 후에는 그 값을 더이상 가지고 있을 필요가 없는 대상을 참조 (없어질 값)

객체의 값을 다른 객체로 이동해서 사용하고자 함

 

 

 

 

 

[참고 자료]

C++ 프로그래밍 방송통신대학교

반응형