class라는 것에 대해 공부를 하는데 class는 가지를 펼치는 문법이 매우 많을 정도로 c++에서 중요한 요소에 해당한다. 그렇기 때문에 개념과 문법에 대해 세세히 짚고 넘어가야 뒤에 있을 가지 내용에서 헷갈리지 않을 수 있을 것 같다.
그렇기에 한번 정리하며 개념과 문법에 대해 복습하는 시간을 가지려고 한다.
내가 이해하기론 붕어빵에 비유 할 수 있을 것 같다.
쉽게 말해 class가 붕어빵 틀이고, main함수가 붕어빵 재료라고 생각해보자.
class라는 붕어빵 틀에 슈크림 붕어빵 재료를 넣는다면 슈크림 붕어빵이 나오고, 팥 붕어빵 재료를 넣으면 팥 붕어빵이 나오듯 main함수의 변수들은 유동적으로 바뀌어 들어가지만 결과인 붕어빵들은 틀의 모양에 따라 반죽의 비율에 따라 일괄적인 붕어빵이 되어 나온다고 이해하면 편할 것 같다.
class에 대해 공부하려면 class가 쓰이는 배경인 객체지향 프로그래밍과 절차지향 프로그래밍에 대해 알아야한다.
객체지향 프로그래밍이란
필요한 데이터와 코드를 묶어 하나의 객체로 만들고, 이 객체들 간에 상호작용이 가능 하도록 프로그램을 만드는 방식이다.절차지향 프로그래밍이란
순차적인 처리를 중요시하고 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 방식이다.
각 프로그래밍 방식마다 장단점이 있다. c++은 객체지향 프로그래밍 방식이므로 이 방식의 특징을 말해보자면
객체지향 프로그래밍 방식의 특징
장점 : 필요한 부분만 수정하고 활용하면 되므로 재사용과 유지보수에 용이하다
단점 : 각 객체별로 구성이 다르기 때문에 설계가 복잡하다는 단점이 있다.
그렇다면 클래스라는 것이 무엇일까?
클래스란 유형별로 분리된 독립된 공간과 같다.
예를 들어 회사란 클래스가 있다면 회사의 사업아이템 , 직원, 내부 조직 등은 클래스를 구성하는 요소가 되고 이 요소들을 종합하는 이름을 클래스라 부를 수 있다.
회사는 하나가 아니므로 마소, 애플 등등의 회사들이 있을 텐데 이것이 각각의 객체가 되는 것이다.
-필드(변수) : 클래스 내에서 값을 저장하는 변수
-메소드 : 클래스 내에 선언된 함수
-생성자 : 객체가 생성될 때 자동으로 호출되는 *메소드
클래스를 공부하다보면 접근제어자라는 것이 나오는데 아까와 같이 붕어빵으로 비유를 하자면 붕어빵 아저씨만의 붕어빵을 굽는 황금온도가 있고, 최적의 시간이 있을 것이다.
그렇지만 그것을 손님에게 공유할 이유는 없을 것이다. 비밀 유지를 위해 접근권한을 지정해주는데 이것에 대해 알아보자
클래스의 멤버(변수, 메소드)들의 접근 권한을 지정한다.
객체 지향 언어에는 세가지 접근제어자가 존재한다.
1. Public : 공개된 정보. 외부 접근 허용.
2. Pritected : 제한된 정보. 해당 클래스나서브 클래스에서만 접근 허용.
3. Private : 제한된 정보. 해당 클래스에서만 접근 허용.
지금까지 정리했던 개념들을 밑에 코드를 통해 알아보자.
각 부분에 주석을 통해 태그를 달아봤다.
#include <iostream>
using namespace std;
class Carp_bread { //객체는 "상태"와 "동작"을 가지고 있다.
protected :
string kind; //필드(변수)
int num; //필드(변수)
int water;
public: //접근 제어자
Carp_bread(string kind, int num) { //생성자
this->kind = kind;
this->num = num;
cout << kind << " 붕어빵 " << num << "개 나왔습니다." << endl;
}
void service() { //메소드
cout << "팥붕어빵 한개 더 넣어드렸어요." << endl;
}
};
int main() {
cout << "----------------------------------------" << endl;
string kind; //붕어빵 종류
int num; //붕어빵 수량
cout << "원하시는 붕어빵 종류를 입력하세요 : ";
cin >> kind;
cout << "원하시는 붕어빵 수량를 입력하세요 : ";
cin >> num;
cout << "----------------------------------------" << endl;
Carp_bread cb = Carp_bread(kind, num); //객채 선언
cb.service(); //메소드 선언
}