오늘은 Class에 대한 수업을 들었다.
1. Class
1.1 정의
- C++에서 클래스는 구조체와 마찬가지로 사용자가 정의할 수 있는 일종의 타입이다.
- 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체를 선언해야 한다.
- 선언된 해당 클래스 타입의 객체를 인스턴스라고 하며, 메모리에 대입된 객체를 의미한다.
1.2 인스턴스
- 인스턴스란 OOP에서 클래스의 설계를 기반으로 생성된 구체적인 객체를 뜻한다.
- 객체를 실제로 만든것, 즉 메모리 공간에 구현된 실체이다 -> 객체는 선언, 인스턴스는 실체화를 의미하게 된다.
- 하나의 클래스는 여러개의 인스턴스를 생성할 수 있다.
1.3 기본 구조
class 클래스명
{
접근 지시자;
변수 선언;
...
함수 선언;
...
}
클래스 선언의 기본 구조는 위와 같다.
클래스의 구성 요소는 크게 3가지로 나눌 수 있다:
- 멤버 변수: 객체의 속성을 저장하는 변수(필드).
- 메서드: 객체가 수행할 수 있는 동작을 정의한 함수.
- 생성자: 객체가 생성되기 전에 선언되며 객체를 생성하기 위한 속성을 부여하는데 사용한다
1.4 접근 지정자
접근 지정자는 클래스의 데이터와 메서드에 대한 접근 권한을 제어하는 기능이다.
- private: 클래스 내부에서만 접근 가능하다.
- public: 어디서든 접근이 가능하다.
- protected: 클래스 내부와 해당 클래스를 상속받은 자식 클래스에서 접근할 수 있다.
1.5 예시
#include <iostream>
class C_DATA
{
private:
int m_nData;
public:
void setData(int nData);
int getData();
};
int main()
{
C_DATA c1{};
C_DATA c2{};
c1.setData(100);
c2.setData(50);
printf("%d\n", c1.getData());
printf("%d\n", c2.getData());
}
void C_DATA::setData(int nData)
{
m_nData = nData;
}
int C_DATA::getData()
{
return m_nData;
}
2. 생성자
2.1 정의
- 해당 클래스의 객체가 인스턴스화될 때 자동으로 호출되는 특수한 종류의 맴버 함수다.
- 생성자는 일반적으로 클래스의 맴버 변수를 적절한 기본값 또는 사용자 제공 값으로 초기화하거나 클래스를 사용하는 데 필요한 설정이 필요한 경우 사용된다.
2.2 생성자의 특징
클래스 기반의 객체를 사용할 때는 몇 가지 원칙이 존재한다:
- 생성자의 호출: 객체가 생성되면, 메모리가 할당되는 동시에 생성자가 한 번 호출된다. 모든 객체는 생성자에 의해 초기화 과정을 거치며, 이 과정에서 객체를 사용할 준비를 마치게 된다.
- 메모리 초기화: 기본적으로 메모리에는 이전 데이터가 남아 있을 수 있기 때문에, 생성자를 통해 이러한 데이터를 초기화하거나 필요에 따라 기본값을 설정하는 작업이 필요하다. 그러나, 특별한 초기화가 필요하지 않은 경우, 생성자 안에서 추가 작업을 하지 않을 수도 있다.
- 사전 준비 단계: 생성자는 객체의 사용 준비 단계를 명시적으로 정의하는 공간이다. 만약 특정 클래스가 사용되기 전에 사전 작업이 필요하다면, 생성자 내부에 그 작업을 명시한다. 복잡한 기능을 가진 모듈의 경우, 사용 전에 설정해야 할 작업들이 있을 수 있어, 이러한 작업을 생성자 안에 작성하게 된다.
- 자동 호출: 생성자는 객체가 생성될 때 무조건 호출되기 때문에, 사용자가 의도하지 않아도 필요한 준비 과정이 자동으로 처리된다. 이는 객체가 생성되면 언제나 사용 가능한 상태로 준비되는 것을 보장해 준다.
- 기본 생성자와 사용자 정의 생성자: 클래스에 대해 사용자가 생성자를 작성하지 않아도, 컴파일러는 기본 생성자를 자동으로 제공한다. 이는 객체를 초기화할 수 있는 최소한의 보장을 제공하기 위함이다. 사용자가 새로운 생성자를 정의하는 경우, 기본 생성자는 더 이상 사용되지 않고, 사용자가 정의한 생성자가 대신 사용된다.
- 생성자와 소멸자: 모든 클래스는 최소 하나의 생성자와 소멸자를 갖는다. 생성자는 객체가 메모리에 생성될 때 호출되고, 소멸자는 객체가 메모리에서 제거될 때 호출되어 정리 작업을 수행한다.
2.3 예시
class C_DATA
{
private:
int m_nData;
public:
C_DATA();
C_DATA(int nData);
int getData();
};
int main()
{
C_DATA c1;
C_DATA c2(100);
printf("%d\n", c1.getData());
printf("%d\n", c2.getData());
}
C_DATA::C_DATA()
{
printf("기본 생성자\n");
}
C_DATA::C_DATA(int nData)
{
printf("%d 생성자\n", nData);
}
int C_DATA::getData()
{
return m_nData;
}
위 예시는 두 가지 기본 생성자와 매개변수를 받는 생성자를 보여준다. 객체를 생성할 때, 적절한 생성자가 호출되어 객체를 초기화한다.
2.4 생성자 호출 규칙
- 생성자 이름은 클래스의 이름과 동일해야 한다.
- 생성자는 반환 타입이 없다(반환형으로 void를 사용하지도 않는다).
- 사용자 정의 생성자를 작성하면, 기본 생성자는 자동으로 대체된다.
2.5 유니폼 초기화와 생성자
- 유니폼 초기화({}): C++11 이후 도입된 방식으로, 멤버 변수를 일괄적으로 초기화할 수 있다.
- 유니폼 초기화를 사용하면 디폴트 생성자 없이도 멤버 변수가 기본값으로 초기화된다.
- 디폴트 생성자를 명시적으로 사용하려면 {} 초기화 방식이나 빈 초기화를 사용하면 된다.
2.6 생성자의 역활
생성자는 객체를 사용할 준비를 위한 과정을 담고 있다. 이는 사용자가 의도하지 않더라도 객체가 생성될 때마다 항상 수행되는 과정이므로, 초기화나 설정이 필요한 경우 유용하게 사용된다. 필요에 따라 생성자 안에서 특정 값을 초기화하거나 복잡한 초기 설정을 수행할 수 있다.
2.7 생성자와 유니폼 초기화
- 생성자는 객체를 사용할 준비를 하기 위한 단계다. 객체가 생성될 때마다 자동으로 호출되며, 초기화 작업을 수행할 수 있다.
- 예전에는 디폴트 생성자가 특별한 작업을 수행하지 않았다. 하지만, C++11 이후 유니폼 초기화({})가 도입되면서, 디폴트 생성자 없이도 멤버 변수를 기본값으로 자동 초기화할 수 있게 되었다.
- 유니폼 초기화를 사용하면 명시적으로 초기화 코드를 작성하지 않아도 기본적인 값으로 멤버 변수를 초기화할 수 있다.
2.8 디폴트 생성자와 사용자 정의 생성자
- 사용자가 디폴트 생성자를 작성하게 되면, 컴파일러가 제공하는 기본 생성자는 사라지고, 사용자가 작성한 생성자가 대신 사용된다.
- 생성자는 함수처럼 보이지만, 사실 생성자 호출 방식에는 몇 가지 예외 규칙이 있다.
- 함수의 문법을 따르지만, 일반 함수와는 다르게 반환 타입이 없으며, 객체를 생성할 때 자동으로 호출되는 특성을 가진다.
2.9 생성자 호출 시 주의할 점
- 생성자 호출 시 ()를 사용하는 경우, 컴파일러는 이를 함수 호출로 오인할 수 있다. 이는 특히 기본 생성자에서 문제가 된다.
- 예를 들어, C_DATA c1();라고 쓰면, 이는 기본 생성자가 아닌 함수 선언으로 해석될 수 있다.
- 이러한 혼동을 피하기 위해, 유니폼 초기화(C_DATA c1{}) 또는 그냥 빈 초기화(C_DATA c1;)를 사용하는 것이 좋다.
- 이러한 이유로, 기본 생성자를 호출할 때는 유니폼 초기화를 권장한다.
2.10 생성자의 역활 정리
- 생성자는 객체의 초기 상태를 설정하는 작업을 수행할 수 있다.
- 초기화 방법은 크게 두 가지로 나뉜다:
- 값을 세팅하면서 객체를 생성하는 경우: 생성자에 매개변수를 전달해 필요한 값을 설정한다.
- 기본값으로 초기화: 별도의 매개변수를 전달하지 않고, 멤버 변수를 기본값으로 설정한다.
- 유니폼 초기화는 선택 사항이지만, 사용 시 명시적으로 기본값 초기화를 수행할 수 있어 코드의 가독성과 안정성을 높인다.
'C++' 카테고리의 다른 글
[강의] 10월 24일 수업정리 (0) | 2024.10.25 |
---|---|
[강의] 10월 23일 수업정리 (2) | 2024.10.24 |
[강의] 10월 18일 수업정리 (1) | 2024.10.20 |
[강의] 10월 17일 수업정리 (1) | 2024.10.18 |
[강의] 10월 16일 수업정리 (1) | 2024.10.17 |