본문 바로가기
개발/C++

10장 객체 지향 개념

by 민돌이2 2019. 2. 11.

한성대학교 김설현교수님 강의내용을 바탕으로 작성함

 

문자열 작성

string 클래스를 사용하기 위해서는 <string> 헤더파일을 포함시켜야 한다.

문자열 선언시 한글자는 ( ' ' ), 그 이상은 ( " " )를 사용한다.

string s("Welcom to C++"); //아래 코딩보다 더 빠름
string str = "progamming";

 

 코드 설명  코드 설명
s1.append(4,'G') 문자열을 추가 G4번 추가
s1.assign("AA") 문자열 배열 또는 문자열을 대입 AA대입 
s1.at(3) 문자열로부터 인덱스 위치의 문자를 반환  s1.의 3번째 위치 반환
s1.clear(2,3) 문자열의 모든 문자 제거 2~3위치 삭제
s1.erase( ) 문자열의 index 위치에서 시작하여 n개의 문자 제거 s1의 모든 문자 제거
s1.empty( ) 만일 문자열이 비어 있는 경우, 참(true) 반환 비어있는 경우 true반환
s1.length( ) 문자열에서 문자의 개수를 반환  
s1.size( ) 문자열에서 문자의 크기를 반환  
 s1.capacity( ) 문자열의 할당된 저장 공간의 크기를 반환 
s1.compare(s2) 두 개의 문자열을 비교 왼쪽이 크면 1반환
s1.substr(0,1) 문자열로부터 부분 문자열 구현 0위치 부터 1개
s1.find('o') 문자열에서 하나의 문자나 부분 문자열을 검색  위치 반환

 

함수에 객체 전달

객체도 함수에 인자로 전달할 수 있다.

값에 의한 전달, 참조에 의한 전달 모두 가능.

값에 의한 전달은 얕은 복사, 참조에 의한 전달이 깊은 복사

값에 의한 전달

void printCircle(Circle c) //값에 의한 전달
{
	c.setRadius(10); //c의 반지름을 10으로 변경
	cout << "반지름 " << c.getRadius() << " 인 c의 면적은: " << c.getArea() << endl;
}

int main()
{
	Circle myCircle(5.0);
	printCircle(myCircle);
	cout << "반지름 " << myCircle.getRadius() << " 인 c의 면적은: " << myCircle.getArea() << endl;

	system("Pause");
	return 0;
}

실행 결과

참조에 의한 전달

void printCircle(Circle& c) //참조에 의한 전달
{
	c.setRadius(10); //c의 반지름을 10으로 변경
	cout << "반지름 " << c.getRadius() << " 인 c의 면적은: "
		<< c.getArea() << endl;
}

int main()
{
	Circle myCircle(5.0);
	printCircle(myCircle);
	cout << "반지름 " << myCircle.getRadius() << " 인 c의 면적은: " << myCircle.getArea() << endl;

	system("Pause");
	return 0;
}

실행 결과

 

객체의 배열

Circle circleArray[10];  //반지름 1인 Circle 객체 10개 생성

인수를 가지는 생성자를 사용해 배열을 선언하고 초기화 하려면 익명개체 사용

Circle circleArray[3] = {Circle(3), Circle(4), Circle(5)};

 

인스턴스 멤버와 정적 멤버

클래스 내에서 사용되는 데이터필드를 인스턴스 변수라고 한다.

인스턴스 변수는 객체들 사이에서 공유되지 않는다.

같은 클래스 내의 모든 인스턴스가 공유하는 변수는 정적변수(static variable)이라 한다.

클래스 정의부에서 static을 붙여 선언하며 클래스밖 cpp파일에서 초기화해야 한다.

private정적변수를 다루기 위해 정적함수를 제공하기도 한다.

정적함수와 정적변수는 객체생성 없이 호출될 수 있다.

Circle.h

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle 
{
public:
	Circle();
	Circle(double);
	double getArea();
	double getRadius();
	void setRadius(double);
	static int getNumberOfObjects(); //정적 함수

private:
	double radius;
	static int numberOfObjects;
};
#endif

Circle.cpp

#include "Circle.h"

int Circle::numberOfObjects = 0; //초기화

Circle::Circle() 
{
	radius = 1;
	numberOfObjects++;
}

Circle::Circle(double newRadius) 
{
	radius = newRadius;
	numberOfObjects++;
}

double Circle::getArea() 
{
	return radius * radius * 3.14159;
}

double Circle::getRadius() 
{
	return radius;
}

void Circle::setRadius(double newRadius) 
{
	radius = (newRadius >= 0) ? newRadius : 0;
}

int Circle::getNumberOfObjects() 
{ 
	return numberOfObjects;
}

 

상수 멤버 함수

매개 변수가 함수 내에서 변경되지 않도록 할때 const키워드를 사용한다.

인스턴스함수만 const로 정의할 수 있으며(정적함수는 불가) 헤더의 끝에 const키워드를 붙인다.

const객체는 const함수만 호출할 수 있어 멤버변수로 바꾸지 않는 함수는 전부 const로 만들어야 한다.

Circle.h

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle 
{
public:
	Circle();
	Circle(double);
	double getArea() const;
	double getRadius() const;
	void setRadius(double);
	static int getNumberOfObjects();

private:
	double radius;
	static int numberOfObjects;
};
#endif

Circle.cpp

#include "Circle.h"

int Circle::numberOfObjects = 0;

Circle::Circle() 
{
	radius = 1;
	numberOfObjects++;
}

Circle::Circle(double newRadius) 
{
	radius = newRadius;
	numberOfObjects++;
}

double Circle::getArea() const 
{
	return radius * radius * 3.14159;
}

double Circle::getRadius() const 
{
	return radius;
}

void Circle::setRadius(double newRadius) 
{
	radius = (newRadius >= 0) ? newRadius : 0;
}

int Circle::getNumberOfObjects() 
{
	return numberOfObjects;
}
728x90

'개발 > C++' 카테고리의 다른 글

13장 파일 입력과 출력  (0) 2019.05.21
12장 템플릿, 벡터, 스택  (0) 2019.05.13
11장 포인터와 동적 메모리 관리(후)  (0) 2019.05.09
11장 포인터와 동적 메모리 관리(전)  (0) 2019.05.08
9장 객체와 클래스  (0) 2019.01.19
8장 다차원 배열  (0) 2019.01.16
7장 1차원 배열  (0) 2019.01.15
6장 함수  (0) 2019.01.04

댓글