A. 클래스
1. 클래스의 개념
a. 클래스란?
🌟 구조체의 상위 호환, 객체를 만들어 내기 위한 틀
구조체는 멤버로 함수를 포함할 수 있기에, C언어의 구조체보다 좀 더 확장된 의미
구조체와 클래스의 차이는 기본 접근 제어의 차이, 나머지는 거의 같음
- C++은 클래스를 가지고 객체 지향 프로그램을 작성함
- 👉 따라서 구조체는 데이터 관리, 클래스는 객체관리 용도로 사용
- 클래스의 멤버 변수를 프로퍼티, 멤버 함수를 메소드라고 함
b. 객체 지향 프로그래밍 OOP
OOP에선 모든 데이터를 객체(object)로 취급하며, 객체가 바로 프로그래밍의 중심
객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍
객체를 만들어 내기 위한 틀과 같은 개념이 바로 클래스(class)
c. 객체 지향 프로그래밍의 특징
1) 추상화(abstraction) : 클래스는 추상화(abstraction)를 사용자 정의 타입으로 구현한 것
2) 캡슐화(encapsulation)
3) 정보 은닉(data hiding)
4) 상속성(inheritance)
5) 다형성(polymorphism)
d. 인스턴스
클래스는 구조체와 마찬가지로 사용자가 정의할 수 있는 일종의 타입
따라서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체를 선언해야 함
🌟 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 하며, 메모리에 대입된 객체를 의미
🎨 도식화
✔ 하나의 클래스에서 여러 개의 인스턴스(객체)를 생성
✔ 독립된 메모리 공간에 저장된 자신만의 멤버 변수를 갖고
✔ 멤버 함수는 모든 인스턴스가 공유한다
2. 클래스의 선언
a. 클래스의 선언
📘 문법 : 클래스를 선언
class 클래스이름
{
접근제어지시자1:
멤버변수1의타입 멤버변수1의이름;
멤버변수2의타입 멤버변수2의이름;
...
멤버함수1의 원형
멤버함수2의 원형
...
};
✔ 접근 제어 지시자 : 객체 지향 프로그래밍의 특징 중 하나인 정보 은닉(data hiding)을 위한 키워드
📘 문법 : 인스턴스 선언
클래스이름 객체참조변수이름;
//Book web_book;
b. 멤버 함수의 정의
일반 함수의 정의와 동일
정의하는 공간은 클래스의 선언 안이나 밖 모두 가능
1) 안에서 정의하기
안에서 정의할 땐 인라인 함수로 처리되어 명시할 필요 X
2) 밖에서 정의하기
범위 지정 연산자로 해당 함수가 어느 클래스에 속하는지 명시해야 함
또한 inline 키워드를 사용하여 인라인 함수로 처리할 수 있음
💥 정의는 할 수 있지만, 클래스가 선언된 후 멤버 함수를 추가할 수는 없음
📘 문법 : 밖에서 정의하는 멤버 함수
반환타입 클래스이름::멤버함수이름(매개변수목록) { 함수의 몸체; }
//void Book::Move(int page) { current_page_ = page; }
c. 멤버 함수의 호출
🌟 구조체와 같이 멤버 참조 연산자(.)를 사용해 호출
📘 문법
1. 객체이름.멤버함수이름(); // 매개변수가 없는 멤버 함수의 호출
2. 객체이름.멤버함수이름(전달할인수목록); // 매개변수가 있는 멤버 함수의 호출
d. 기본 제공 기능
클래스를 생성하면 C++컴파일러는 자동으로 제공하는 기능이 생김
- 기본 생성자 : 사용자 생성자가 생기면 사라짐
- 복사 생성자 : 사용자 생성자가 생기면 사라짐
- 소멸자
- 복사 연산자
3. 접근 제어
a. 정보 은닉(data higing)
🌟 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념
구조체의 모든 멤버는 외부에서 언제나 접근 가능하지만 (기본 제어 지시자가 public)
클래스는 private 이라 정보은닉이 가능함
예를들어, 자동차는 운전면허만 따면 운전가능하지, 내부 구조를 몰라도 운용이 가능함
b. 접근 제어(access control)
🌟 접근 제어 지시자를 사용해 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정할 수 있도록 하여, 정보 은닉을 구체화하는 것
1) public (구조체, 공용체)
2) private
3) protected
c. public 접근 제어 지시자
🌟 외부로 공개, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근
- 구조체와 공용체의 기본 접근 제어 지시자
- public 멤버 함수는 해당 객체의 private 멤버와 프로그램 사이의 인터페이스(interface) 역할
👉 즉, 사용자나 프로그램과의 인터페이스를 구축하는데 사용
d. private 접근 제어 지시자
🌟 내부만 공개, 외부에서 직접 접근할 수 없음
- class의 기본 접근 제어 지시자
- private 멤버에 직접 접근할 수 없고 해당 객체의 public 멤버 함수를 통해서만 접근 가능
- private 멤버는 public 인터페이스를 직접 구성하지 않는 클래스의 세부적인 동작을 구현하는 데 사용
👉 즉, 정보를 은닉하는데 사용함
e. protected 접근 제어 지시자
🌟 파생 클래스에 대해서는 public 멤버처럼 취급, 외부에서는 private 멤버처럼 취급
💙 접근할 수 있는 영역
1) 이 멤버를 선언한 클래스의 멤버 함수
2) 이 멤버를 선언한 클래스의 프렌드
3) 이 멤버를 선언한 클래스에서 public 또는 protected 접근 제어로 파생된 클래스
4. this 포인터
a. 멤버 함수의 공유
하나의 클래스에서 생성된 인스턴스는
각각 독립된 메모리 공간에 저장된 자신만의 멤버 변수를 가지지만,
멤버 함수는 모든 인스턴스가 공유하기 때문에
멤버 함수를 실행시킨 인스턴스(자기자신)를 알 필요가 있음
b. this 포인터
🌟 해당 멤버 함수를 호출한 객체를 가리키는 것
- C++에서는 모든 멤버 함수가 자신만의 this 포인터를 가지고 있음
- 호출된 멤버 함수의 숨은 인수로 전달
- 이렇게 하면 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 파악함
- this는 포인터이므로, 반환할 때에는 참조 연산자(*)를 사용하여 호출한 객체 그 자체를 반환해야 함
- this 포인터는 암시적으로도 사용될 수 있지만, 가급적 화살표(->) 연산자를 통해 명시적으로 사용하는 것이 좋음
⏳ 예제 : this를 활용한 인스턴스의 반환
#include <iostream>
using namespace std;
class Book
{
private:
int current_page_;
void set_percent();
public:
Book(const string& title, int total_page);
string title_;
int total_page_;
double percent_;
void Move(int page);
void Open();
void Read();
const Book& ThickerBook(const Book&); // ThickerBook() 함수의 원형
};
Book::Book(const string& title, int total_page)
{
title_ = title;
total_page_ = total_page;
current_page_ = 0;
set_percent();
}
void Book::set_percent()
{
percent_ = (double) current_page_ / total_page_ * 100;
}
const Book& Book::ThickerBook(const Book& comp_book)
{
if (comp_book.total_page_ > this->total_page_)
{
return comp_book;
}
else
{
return *this;
}
}
int main(void)
{
Book web_book("HTML과 CSS", 350);
Book html_book("HTML 레퍼런스", 500);
cout << web_book.ThickerBook(html_book).title_; // 더 두꺼운 책의 이름을 출력함.
return 0;
}
✨ 실행결과
HTML 레퍼런스
c. this 포인터의 특징
- 클래스, 구조체 또는 열거체 타입의 비정적 멤버 함수에서만 사용 가능
- 정적(static) 멤버 함수는 this 포인터 ❌
- 언제나 포인터 상수이며, 따라서 값을 재할당 ❌
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 연산자 오버로딩 (0) | 2023.09.13 |
---|---|
[자료형(data type)] C++ 파생형 클래스 2 : 생성자와 소멸자 (+39강, 41강) (0) | 2023.09.13 |
C++ 범위 : C++ 네임스페이스 (0) | 2023.09.13 |
C++ 범위 : 유효범위와 연결 (0) | 2023.09.13 |
[자료형(data type)] C++ 파생형 공용체와 열거체 총정리 (0) | 2023.09.13 |