한성대학교 김설현교수님 강의내용을 바탕으로 작성함
구조체
클래스는 C와 C++를 구분 짓는 가장 큰 특징이다.
클래스는 구조체의 확장으로 이해할 수 있다.
구조체 사용
구조체의 멤버변수에 접근하기 위해서는 .연산자를 사용
struct CDAccount { //구조체 선언
double balance; //금액
double interestRate; //이자율
int term; //개월수
}; // ;넣어줘야함
int main()
{
const int NUMBER_OF_DAYS = 3;
CDAccount myAccount = { 1000000, 3.5, 12 };
CDAccount yourAccount; //.을 이용한 멤버변수 접근
yourAccount.balance = 2000000;
yourAccount.interestRate = 3.8;
yourAccount.term = 18;
CDAccount hisAccount = yourAccount; //복사하기
system("Pause");
return 0;
}
클래스
멤버 데이터뿐만 아니라 멤버 함수를 가지는 하나의 구조체객체지향 프로그래밍의 가장 중심개념클래스형의 변수를 객체 또는 인스턴스라고 한다.
class CDAccount
{ //클래스 선언
public:
double balance; //금액
double interestRate; //이자율
int term; //개월수
void print()
{
double result;
result = balance + balance * (interestRate / 100)* term / 12;
cout << fixed << setprecision(0) << result << endl;
}
}; // ;주의
int main()
{
CDAccount myAccount; //클래스 선언
myAccount.balance = 2000000;
myAccount.interestRate = 3.8;
myAccount.term = 18;
myAccount.print();
system("Pause");
return 0;
}
객체를 위한 클래스 정의객체는 명확하게 구별되는 개체(요소)를 나타낸다.객체는 자신만의 유일한 특성과 상태(state), 행동(behavior)을 갖는다.객체의 상태(state)는 데이터 필드 즉 멤버변수로 표현된다.객체의 행동(behavior)은 멤버함수에 의해 정의 된다.클래스는 객체가 어떻게 생격야 하는 지 적어놓은 설계도와 같다.객체는 설계또를 통해 만들어진 인스턴스이다.클래스에는 멤버변수를 초기화하기 위한 생성자가 있다.
생성자클래스도 일반변수처럼 객체를 생성시 초기값을 줄 수 있어야 하는데, 이를 가능하게 한다.생성자는 다음과 같은 특징이 있다.■클래스와 같은 이름을 가진다.
■ 반환유형을 가질 수 없다.
■ 객체가 생성될 때 자동호출 된다.
■ 오버로딩을 적용할 수 있다.
■ 접근 지정자가 public: 으로 설정되어야 한다.
생성자에 초기화목록(initializer list)를 사용하여 초기화할 수도 있다.
Circle::Circle() //초기화x, 대입 o 아래 방법 지향
{
radius = 1;
}
Circle::Circle() : radius(1) //초기화 o, 대입 x 이 방법 지향
{
}
Circle::Circle(double newRadius) //초기화x 대입 o 아래 방법 지향
{
radius = newRadius;
}
Circle::Circle(double newRadius) //초기화 o, 대입 x 이 방법 지향
: radius(newRadius)
{
}
반드시 초기화 해야하는 멤버변수들 (const상수와 레퍼런스 변수)초기화목록을 사용해 초기화해야한다.
객체 구성과 사용객체가 생성된 후에는 .연산자를 사용하여 데이터에 접근하고 함수를 호출한다.
Circle circle1; // 객체 circle1 생성
circle1.radius = 3; // circle1의 반지름 3 선언
circle1.getArea( ); // circle1의 면적 호출
클래스의 정의와 구현 분리
클래스의 정의부분과 구현부분을 분리할 수 있다.
class Circle // 클래스 정의 시작
{
public:
double radius;
Circle();
Circle(double);
double getArea();
}; // 클래스 정의 종료
// 각 함수 구현 시작
Circle::Circle()
{
radius = 1;
}
Circle::Circle(double newRadius)
{
radius = newRadius;
}
double Circle::getArea()
{
return radius * radius * 3.14;
}
클래스의 정의와 구현 분리(파일분리)
파일분리 시 클래스 정의부분은 .h(헤더)파일에 구현부분은 .cpp(씨플플)파일에 저장한다. main()함수는 또 다른 cpp파일로 분리한다.
Circle.h
class Circle {
public:
double radius; //반지름
Circle();
Circle(double);
double getArea();
}; // 세미콜론 주의
Circle.cpp
#include "Circle.h"
//범위지정 연산자 ::
Circle::Circle()
{
radius = 1;
}
Circle::Circle(double newRadius)
{
radius = newRadius;
}
double Circle::getArea()
{
return radius * radius * 3.14;
}
다중 포함 방지
프로그램 내에서 같은 헤더 파일을 여러 번 포함(include)시켜 컴파일 오류가 나는 경우방지
#ifndef과 함께 #define 지시자를 사용, #endif로 마무리한다.
Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
public:
Circle();
Circle(double);
double getArea();
private:
double radius;
}; // Semicolon required
#endif
인라인 함수
함수의 내용이 함수호출 부눈에 그대로 옮겨 적는 것이다.
실행의 흐름이 넘어갔다 돌아오는 과정에서 생기는 시간을 줄여 성능향상
함수가 클래스 정의 내부에서 구현되는 경우 자동적으로 인라인 함수가 된다.
구현부분에 만들시 앞에 inline이라는 키워드를 적어 헤더파일로 옮겨야 한다.
짧은 코드를 사용할때만 사용하는 것이 좋다. 긴 경우 프로그램 코드가 길어져 성능하양 야기
Circle.h
class Circle
{
public:
Circle();
Circle(double);
double getPerimeter() //자동인라인함수
{
return 2 * radius * 3.14159;
};
double getArea();
private:
double radius; //반지름
};
//인라인함수, 반드시 헤더파일에 있어야 함
inline double Circle::getArea()
{
return radius * radius * 3.14159;
}
Circle.cpp
#include "Circle.h"
Circle::Circle()
{
radius = 1;
}
Circle::Circle(double newRadius)
{
radius = newRadius;
}
데이터 필드 캡슐화
클래스에서 데이터 필드는 직접 수정이 가능하다. 하지만 이는 좋은 방식이 아니다.
1. 데이터가 임의로 수정될 수 있다.
2. 클래스의 유지보스를 어렵게 만들고 버그 유발
이를 피하기 위해 데이터필드를 private으로 선언하고 get함수와 set함수를 사용하여 데이터 필드에 접촉한다. 이를 캡슐화라 한다.
Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
public:
Circle();
Circle(double);
//getArea과 getRadius로 함수를 호출하고 setRadius로 값을 변경
double getArea();
double getRadius();
void setRadius(double);
private:
double radius;
};
#endif
Circle.cpp
#include "Circle.h"
Circle::Circle()
{
radius = 1;
}
Circle::Circle(double newRadius)
{
radius = newRadius;
}
double Circle::getArea()
{
return radius * radius * 3.14;
}
double Circle::getRadius()
{
return radius;
}
void Circle::setRadius(double newRadius)
{
radius = (newRadius >= 0) ? newRadius : 0;
}
main.cpp
int main()
{
Circle circle1;
Circle circle2(25);
Circle circle3(125);
cout << "circle1 radius: " << circle1.getRadius() << " area: " << circle1.getArea() << endl;
cout << "circle2 radius: " << circle2.getRadius() << " area: " << circle2.getArea() << endl;
cout << "circle3 radius: " << circle3.getRadius() << " area: " << circle3.getArea() << endl;
system("Pause");
return 0;
}
'개발 > C++' 카테고리의 다른 글
12장 템플릿, 벡터, 스택 (0) | 2019.05.13 |
---|---|
11장 포인터와 동적 메모리 관리(후) (0) | 2019.05.09 |
11장 포인터와 동적 메모리 관리(전) (0) | 2019.05.08 |
10장 객체 지향 개념 (0) | 2019.02.11 |
8장 다차원 배열 (0) | 2019.01.16 |
7장 1차원 배열 (0) | 2019.01.15 |
6장 함수 (0) | 2019.01.04 |
5장 반복문 (0) | 2019.01.03 |
댓글