티스토리 뷰
객체지향(OOP: Ojbect-oriented programming)
속성과 동작을 함께 결합하여 재사용 가능한 패키지로 만드는 기능을 제공
- 함수를 작성하는 데 초점을 맞추기보다는 명확하게 정의된 동작 세트가 있는 객체를 정의하는 데 중점을 둔다. 누가 주체이고, 어떤 행동을 할지 분명히 알 수 있다.
- 프로그램을 보다 모듈화된 방식으로 작성할 수 있고, 더 쉽게 쓰고 이해할 수 있으며, 더 높은 수준의 코드 재사용성을 제공한다.
클래스
객체 지향 프로그래밍에서, 우리는 종종 우리의 타입이 데이터를 보유할 뿐만 아니라, 데이터와 함께 작동하는 기능을 제공하기를 원한다. C++에서는 이 작업을 class 키워드를 통해 수행한다.
구조체 선언과 마찬가지로 클래스 선언은 정의만 할 뿐 메모리에 할당되지 않고, 클래스 변수 선언 후 실제로 메모리에 올라간 특정 클래스 타입의 객체를 인스턴스라고 부른다.
클래스를 사용하기 위한 클래스 변수 선언 = 객체 선언 = 클래스의 인스턴스화 -> 메모리할당
객체(실제 집) = 클래스(집 설계도)의 인스턴스
접근 지정자
클래스의 멤버에 접근할 수 있는 사용자를 결정한다.
- public: 공개 멤버, 클래스 외부에서도 접근 가능
- priavte: 비공개 멤버, 클래스 내에서만 접근 가능
- protected: 파생클래스에서 접근 가능 상속 참고
기본적으로 클래스의 모든 구성원(멤버)는 private다. 클래스에는 여러 접근 지정자를 사용하여 각 멤버의 접근 수준을 설정할 수 있다.
멤버 변수(속성, 필드)는 비공개로 하고, 멤버 함수(동작, 메소드)는 공개하는 것이 일반적이다.
class DateClass
{
// members are private by default
int m_month;
int m_day;
int m_year;
public:
// public, can be accessed by anyone
void setDate(int month, int day, int year)
{
// setDate() can access the private members of the class because it is a member of the class itself
m_month = month;
m_day = day;
m_year = year;
}
void print() // public, can be accessed by anyone
{
std::cout << m_month << "/" << m_day << "/" << m_year;
}
};
왜 멤버변수를 private로 지정할까? = 캡슐화
객체의 필드와 메소드들을 하나로 묶고, 실제 구현 내용을 감추는 것(정보은닉)을 의미한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다. 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.
장점
- 외부에서 멤버를 실수로 사용하지 못하도록 보호할 수 있다. (객체의 무결성)
- 낮은 결합도(특정 기능을 실행하는 데 다른 클래스나 모듈들에 의존적인 정도)를 유지할 수 있게 해준다.
- 사용하기 쉽고 프로그램의 복잡성을 줄여준다.
ex) 완전히 캡슐화된 클래스를 사용하면, 클래스를 사용하기 위해 공개적으로 사용할 수 있는 멤버 함수와 이 함수의 인수 및 반환 값만 알면 된다. 예를 들어 std::string, std::array, std::vector, std::map 등을 사용하는 데 있어서 클래스가 내부적으로 어떻게 구현되었는지 몰라도 사용할 수 있다.
제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다. 자연스럽게 사용자에게는 그 부품을 사용하는 방법이 중요한 것이 된다.
출처
getter, setter
this 포인터
this는 객체 자신의 주소값이다. this 키워드는 cpp의 클래스나 구조체, 공용체의 멤버 함수에서 해당 객체의 주소를 참조할 때 쓰인다.
<this가 클래스 내에서 사용되는 이유>
1. 객체 자신의 주소를 리턴할 때
Exam* Exam::identify()
{
return (this);
}
2. 객체 자신의 참조자를 리턴할 때 - 대입연산자 오버로딩 참고
Exam& operator=(const Exam& op)
{
std::cout << "Assignation operator called" << std::endl;
if (this != &op)
{
}
return (*this);
}
3. 객체 자신을 복사하여 리턴할 때
4. 동일 이름의 변수와 구분을 하기 위해서 - 겹치는 변수명이 없는 경우에는 'this'를 생략하면, 컴파일시 자동으로 "this->data" 와 같은 명시적 표현으로 변환된다.
void Exam::SetData(int parm_data)
{
// 지역 변수 data
int data = 0;
// 멤버 변수의 data임을 this포인터로 지칭한다.
this->data = parm_data;
// 전역 변수를 지칭할 때 - ::data = parm_data;
// 지역 변수를 지칭할 때 - data = parm_data;
}
5. 객체 내부에서 자신의 주소값이 사용 될 때
'42 > cpp' 카테고리의 다른 글
[C++] NULL 포인터로 객체의 함수가 호출되는 이유 (0) | 2021.07.21 |
---|---|
생성자, 복사생성자, 복사대입연산자, 소멸자 (0) | 2021.05.27 |
참조자 (0) | 2021.05.26 |
메모리구조, 정적할당과 동적할당 (0) | 2021.05.25 |
네임스페이스, 표준입출력 (0) | 2021.05.18 |