Language/C++

[C++] CH3 클래스와 객체 (1)

nowkoes 2023. 1. 28. 21:35

객체에 대한 이해

캡슐화 : 객체(object)의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것으로, 객체의 가장 본질적인 특성

  • 객체는 이 캡슐화(encapsulation)를 통해 외부의 접근을 통제하여 자신의 내부 요소들을 보호한다.
  • 구성: 상태(state)멤버 변수행동(behavior)멤버 함수
    • 행동으로 상태가 변하고, 어떤 행동은 객체 상태를 외부로 전달

클래스 : 객체를 정의하는 틀 혹은 설계도로서, 클래스에 멤버 변수와 멤버 함수를 선언한다.

  • 이때 객체는 클래스라는 틀에서 찍어낸 멤버 변수와 멤버 함수를 실제로 갖고, C++ 프로그램이 실행되는 동안 실존하는 실체(instance)다.
  • 객체가 생성되면 상호 별도 공간에 생성된다.

 

요약

캡슐화: 객체의 구성 요소들을 보호하는 것으로, 객체의 특징
클래스: 객체(실존하는 실체)를 정의하는 틀

C++ 클래스 만들기

C++에서 클래스를 만들기 위해 class 키워드를 이용한다.

  • 이때 c++ 클래스는 개발자가 정의하는 새로운 데이터 타입이다.
  • 클래스 선언부(declaration)과 구현부(implemetation)로 나누어 작성한다.
class Circle
{
    public: // 멤버에 대한 접근 지정자
        int radius; // 멤버 변수
        double getArea(); // 멤버 함수
}; // 클래스 선언부

double Circle::getArea()
{
    return 3.14 * radius * radius; 
} // 클래스 구현부
  1. 클래스 선언부
    • 선언부의 중괄호 마지막에 세미콜론으로 끝나는 것에 주의하자.
    • 멤버 변수와 멤버 함수의 원형을 선언한다.
  2. 클래스 구현부
    • 클래스 선언부에 선언된 멤버 함수의 코드를 구현
    • 범위 지정 연산자 ::를 사용하여 클래스 이름과 함께 멤버 함수를 기술한다. (중복 방지)

이렇게 선언부와 구현부를 나눈 이유는 클래스의 재사용을 위해서다.

 

요약

C++에서는 클래스의 재사용을 위해 선언부와 구현부로 나눈다.

객체 생성과 객체 활용

// 예제 3-1
#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    double getArea();
};

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

int main()
{
    Circle circle;

    circle.radius = 1;
    double area = circle.getArea();
    // circle 객체는 area 변수와 함께 main()의 스택에 존재

    cout << "circle의 면적은 " << area << "입니다.\n";

    Circle donut;
    donut.radius = 30;
    area = donut.getArea();

    cout << "donut의 면적은 " << area << "입니다.\n";

    return 0;
}
  • Circle이라는 클래스의 기능을 그대로 간직한 실체로서 객체는 해당 프로그램에서 circle과 donut이다.

객체가 생성되면 클래스 크기의 메모리가 할당하고, 만약 객체의 멤버에 접근하기 위해서는 객체이름에 '.'(dot)을 붙여 접근할 수 있다.

 

요약

객체에 접근하기 위해서는 '.'연산자를 이용한다.

생성자

// 예제 3-4
#include <iostream>
using namespace std;

class Circle
{
public:
	int radius;
	Circle();
	Circle(int r);
	double getArea();
};

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

Circle::Circle(int r) // 타겟 생성자
{
	radius = r;
	cout << "반지름 " << radius << " 원 생성\n";
}

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

int main()
{
	Circle circle; 
	double area = circle.getArea();
	cout << "circle의 면적은 " << area << "입니다.\n";

	Circle donut(30);
	area = donut.getArea();
	cout << "donut의 면적은 " << area << "입니다.\n";

	return 0;
}

생성자: 객체가 생성될 때 자동으로 실행되는 특별한 멤버 함수 (constructor)

  • 특징
    1. 객체가 생성될 때 필요한 초기 작업을 실행
    2. 오직 한 번만 자동으로 실행
    3. 생성자의 이름은 클래스의 이름과 동일
    4. 생성자 함수의 원형에 리턴 타입을 선언하지 않음
      • 생성자 함수를 종료하는 return은 가능하지만, return value와 같이 값을 반환하면 안 됨
    5. 매개 변수 개수나 타입이 서로 다르게 중복 가능
    6. C++ 컴파일러는 반드시 생성자 중 하나를 호출하도록 컴파일 하므로, 생성자가 없으면 기본 생성자를 자동으로 호출한다.
      • 이때 기본 생성자는 아무 실행 없이 바로 리턴한다.

위임 생성자: 기본 생성자와 매개 변수를 하나 갖는 생성자의 객체를 초기화 하는 코드가 중복되는데, 중복된 초기화 코드를 하나의 생성자로 몰아 호출하는 것을 의미.

  • 위임 생성자가 호출되면, Circle() 생성자는 자신의 코드를 실행하기 전 타겟 생성자를 호출해 r에 1을 넘겨주어 radius를 1로 초기화한다.

 

요약

생성자
1. 정의: 객체가 생성될 때 자동으로 실행되는 함수
2. 특징
 a. 객체가 생성될 때 필요한 초기 작업을 수행
 b. 생성자의 이름은 클래스의 이름과 동일하며, 함수 원형에 리턴타입을 선언하지 않음
 c. 생성자가 없으면 기본 생성자를 자동으로 호출
3. 위임 생성자: 중복된 초기화 코드를 하나의 생성자로 몰아 호출하는 생성자

문제풀이: GitHub

반응형