언어/C++

[C++] 클래스

O_oz 2023. 10. 23. 18:53
반응형

클래스와 객체의 개념은 자바나 여타 객체 지향 언어와 개념이 같다

그래서 클래스나 객체에 대한 설명은 https://oz-97.tistory.com/8 해당 글을 참조

 

이 장에서는 C++에서의 클래스 특징들을 작성하려고 한다

 

C++의 클래스도 여타 객체 지향 언어와 마찬가지로 멤버 변수, 멤버 함수, 접근 지정자를 사용한다

 

구현

class Circle
{
public :
    int radius;			// 멤버 변수
    Circle();			// 기본 생성자
    Circle(int r);		// 매개 변수가 있는 생성자
    doouble getArea();		// 멤버 함수
};

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

Circle :: Circle(int r)
{
    radius = r;
}

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

위처럼 Circle 클래스를 만들어 보았다

 

다른 언어와의 차이점이 있다면

클래스가 선언부와 구현부로 나뉜다는 점이다

1번 라인부터 6번 라인까지 선언부에는 멤버 변수와 생성자나 멤버 함수의 원형, 접근 지정자들이 들어가고

그 밑에 구현부에서는 선언부에 선언된 생성자나 멤버 함수가 정의된다

 

생성자

생성자를 작성하지 않으면 컴파일러는 default constructor (기본 생성자)를 자동으로 생성하고, 생성자가 하나라도 존재한다면 기본 생성자를 생성하지 않는다

 

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

Circle :: Circle(int r)
{
    radius = r;
}

위 처럼 생성자 코드가 겹치는 경우에는

Circle :: Circle() : Circle(1) {}		// 위임 생성자

Circle :: Circle(int r)			// 타겟 생성자
{
    radius = r;
}

이렇게 코드를 줄일수도 있다

 

class Circle
{
    radius = 3;
};

멤버 변수는 클래스 선언부 내에서 직접 초기화 될수도 있고

 

class Point
{
    int x, y;
    
public :
    Point();
    Point(int a, int b);
}

Point :: Point() : x(0), y(0) {}
point :: Point(int a, int b) : x(a), y(b) {}

위와 같이 초기화할수도 있다

 

소멸자

소멸자는 객체가 사라질 때 필요한 마무리 작업이다

Circle :: ~Circle() {}

앞에 ~을 붙여 소멸자를 표시하고, 선언하지 않으면 컴파일러에 의해 기본 소멸자가 자동으로 생성된다

 

#include <iostream>
using namespace std;

class Class
{
public :
    int radius;

    Circle();
    Circle(int r);
    ~Circle();
    
    double getArea();
};

Circle :: Circle()
{
    radius = 1;
    cout << "반지름 " << radius << " 원 생성" << endl;
}

Circle :: Circle(int r)
{
    radius = r;
    cout << "반지름 " << radius << " 원 생성" << endl;
}

Circle :: ~Circle()
{
	cout << "반지름 " << radius << " 원 소멸" << endl;
}

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

Circle earth(1000);		// 전역 객체
Circle sun(2000);

void f()
{
    Circle fEarth(100);		// 지역 객체
    Circle fSun(200);
}

int main()
{
    Circle mainEarth;		// 지역 객체
    Circle mainSun(20);
    f();
}

코드를 실행하면 위와 같은 결과가 출력되는데, 우리는 이것을 보고 소멸자는 객체 생성의 반대로 실행된다는 것을 알 수 있다

 

접근 지정자

접근 지정자는 private, public, protected 이렇게 세 가지가 있고, 기능은 다른 객체 지향 언어와 동일하다

 

class Class
{
private :
    int radius;

public :
    Circle();
    Circle(int r);
    ~Circle();
    
    double getArea();
};

클래스의 선언부에서 사용하고, 한번 접근 지정자가 사용되면 다른 접근 지정자가 선언될 때까지 모든 멤버에 대하여 접근 지정자가 적용된다

 

인라인 함수

#include <iostream>
using namespace std;

inline int odd(int x)
{
    return (x % 2);
}

int main()
{
    int sum = 0;
    
    for (int i = 1; i <= 10000; i++
    {
        if (odd(i)) sum += i;			// if ((i % 2))
    }
    count << sum;
}

odd() 처럼 짧은 코드들을 함수로 처리하여 반복적으로 호출하면 그만큼 프로그램의 실행 시간이 길어지게 된다

인라인 함수를 사용하면 컴파일할 때, 함수가 사용된 곳이 함수 내부 내용으로 바뀌게 되는데, 이러면 함수 호출 횟수를 줄일 수 있기 때문에  프로그램 실행 시간이 줄어든다

 

class Class
{
private :
    int radius;

public :
    Circle();
    Circle(int r);
    
    double getArea();
};

inline Circle :: Circle()
{
    radius = 1;
}

Circle :: Circle(int r)
{
    radius = r;
}

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

생성자와 멤버 함수를 이렇게 inline으로 선언할 수 있지만

class Circle
{
private :
    int radius;

public :
    Circle() { radius = 1; }			// 자동 인라인
    
    Circle(int r);
    double getArea() { return 3.14 * radius * radius; }	// 자동 인라인
};

이렇게 클래스 선언부 내에 직접 구현하면 자동으로 인라인 함수가 된다

 

구조체

C++도 C 처럼 구조체를 지원하는데, 변수만 가지던 C의 구조체와 달리 C++의 구조체는 멤버 변수와 멤버 함수를 가지고, 접근 지정도 할 수 있다

또한 다른 구조체나 클래스에게 상속도 할 수 있고 상속 받을 수도 있다

구조체는 디폴트 접근 지정이 public 이라는 점만 다르다

 

사용 방법은 아래와 같다

struct StructCircle
{
prviate :
    int radius
    
public :
    StructCircle(int r) { radius = r; }
    double getArea();
}

double StructCircle :: getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    StructCircle Earth(100);
}
반응형

'언어 > C++' 카테고리의 다른 글

소수 구하는 알고리즘  (0) 2024.09.12
c++ 자료형  (0) 2024.09.09
[MFC] 다이얼로그 2  (1) 2023.10.29
[MFC] 다이얼로그 1  (0) 2023.10.28
[C++] namespace  (1) 2023.10.23