객체 : 명확하게 구별되는 실제 세계에서의 개체(요소)를 나타냄.
ex) 학생, 책상, 대여(물건을 빌리는 것) 등등등
객체 -> 자신만의 고유한 특성과 상태(state), 행동(behavior)
상태(state) = 데이터 필드
행동(behavior) = 함수
인스턴스 멤버변수 = 인스턴스 변수 = 우리가 알고 있는 그냥 변수 : 생성된 객체에서의 변수
인스턴스 멤버함수 = 인스턴스 함수 = 우리가 알고 있는 그냥 함수 : 생성된 객체에서의 함수
=> 특정한 인스턴스에 종속적 / 특정한 인스턴스에 대해서만 함수가 호출
* 인스턴스 함수를 호출하는 객체를 호출 객체(calling object)라고 부름
객체 : 선언 / 인스턴스 : 실체화
클래스(class) : 생성될 임의의 객체에 대한 '설계도'
-> 하나의 데이터 유형
클래스를 이용해서 생성된 객체 = 인스턴스(instance)
멤버변수 : 클래스 상에서의 변수
멤버함수 : 클래스 상에서의 함수
=> 실재 하지 않은 것
= 인스턴스가 만들어져야 세상에 나타나는 것
ex) 아파트가 설계도 상에 있다고 실제로 존재하는 것이 아닌 것과 같음.
객체 생성 -> 어떤 객체를 생성할 지에 대한 설계도는 클래스 안에서 선언한 후 main함수에서 생성
- 접근지시자
private : 아래에 쓰여진 것들은 모두 객체 내에서 보호되고 있다라는 의미
-> 자기 객체 안에서만 접근할 수 있을 뿐 객체 외부에서는 접근할 수 없음.
private :
int food;
int weight;
#1
void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}
#2
int main() {
Animal animal;
animal.food = 100;
}
#1과 같이 같은 객체 안에서는 food 와 weight에 접근하는 것이 가능
#2처럼 객체 밖에서 인위적으로 food에 접근하는 것은 불가능
public : 말 그대로 공개된 것
-> 외부에서 마음껏 접근 할 수 있음
public :
void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}
void increase_food(int inc) {
food += inc;
weight += (inc / 3);
}
void view_stat() {
cout << "이 동물의 food : " << food << endl;
cout << "이 동물의 weight : " << weight << endl;
}
멤버함수들을 public으로 지정
animal.set_animal(100, 50);
animal.increase_food(30);
animal.view_stat();
외부인 main함수에서도 마음껏 접근할 수 있음
* 접근지시자를 명시하지 않으면 기본적으로 private으로 설정
- 생성자(constructor)
: 특별한 유형의 함수
생성자 특성
1. 생성자는 클래스 자신과 같은 이름을 가져야 함.
2. 생성자는 반환 유형이 없음(void도 사용x)
3. 생성자는 객체가 생성될 때 호출됨 + 객체 초기화의 역할을 수행
+ 생성자에도 오버로딩을 적용할 수 있음
= 이름은 같지만 괄호 안에 있는 인수 부분이 서로 다른 여러 개의 생성자 작성 o
* 클래스 멤버로서 데이터 필드는 선언될 때 초기화할 수 없다
-> 생성자에서 초기화 되어야 한다.
+ 클래스는 인수 없는 생성자를 제공한다
ex) Circle() : 인수 없는 생성자
클래스는 생성자 없이 정의 될 수도 있음
-> 인수 없는 생성자가 암시적으로 클래스 내부에서 정의됨
= 기본 생성자(default constructor)
* 클래스 안에 어떠한 생성자도 명시적으로 정의되지 않을 경우에만 자동으로 제공
- 클래스 정의와 구현 분리
클래스 정의 : 모든 데이터 필드와 생성자 원형, 함수 원형을 목록으로 만드는 것
-> 클래스의 규약 사항을 기술하는 것
확장자 : .h
클래스 구현 : 생성자와 함수를 작성하는 것
-> 클래스의 규약 사항을 실현하는 것
확장자 : .cpp
장점
1. 정의에서 구현 부분을 숨길 수 있고 자유롭게 구현 내용을 변경 할 수 있음
+ 클래스를 사용하는 클라이언트 프로그램은 정의가 변경되지 않는 한 변경할 필요가 없음
2. 소프트웨어 공급업체 관점에서 클래스를 구현하는 소스코드를 공개하지 않고도 클래스 객체 코드와 헤더 파일을 제공 가능
-> 소프트웨어공급업체의 지적 재산권 보호
- 다중 포함 방지
: 프로그램 내에서 같은 헤더파일을 여러번 포함 시키는 일이 발생
포함 감시자(inclusion guard) : 헤더 파일이 여러번 포함되는 것을 방지
#ifndef (if not defined) : 헤더 파일이 정의되어 있는지를 검사함
#define : 헤더 파일이 정의되어 있지 않다면 정의
#endif : 헤더 파일의 끝을 나타내기 위해 필요
* #이 표시되어 있는 문장은 전처리기 지시자
'C++ 응용' 카테고리의 다른 글
Chapter.09 객체와 클래스 (2) (0) | 2024.10.05 |
---|